From f6893f5bc4827c7f31d13b9edd180549c2944b0d Mon Sep 17 00:00:00 2001
From: Paul Baltescu <pauldb89@gmail.com>
Date: Tue, 23 Apr 2013 22:53:42 +0100
Subject: Replaced time consuming endl with \n.

---
 python/src/sa/_sa.c | 18419 ++++++++++++++++++++++++--------------------------
 1 file changed, 8723 insertions(+), 9696 deletions(-)

(limited to 'python/src')

diff --git a/python/src/sa/_sa.c b/python/src/sa/_sa.c
index fe79363e..80f5a440 100644
--- a/python/src/sa/_sa.c
+++ b/python/src/sa/_sa.c
@@ -1,4 +1,4 @@
-/* Generated by Cython 0.17.1 on Thu Mar  7 12:40:34 2013 */
+/* Generated by Cython 0.16 on Tue Apr 23 15:15:58 2013 */
 
 #define PY_SSIZE_T_CLEAN
 #include "Python.h"
@@ -11,6 +11,7 @@
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
+
 #if !defined(WIN32) && !defined(MS_WINDOWS)
   #ifndef __stdcall
     #define __stdcall
@@ -22,18 +23,22 @@
     #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
@@ -41,25 +46,28 @@
 #define CYTHON_COMPILING_IN_PYPY 0
 #define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
+
+#if CYTHON_COMPILING_IN_PYPY
+  #define __Pyx_PyCFunction_Call PyObject_Call
+#else
+  #define __Pyx_PyCFunction_Call PyCFunction_Call
+#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 +75,7 @@
   #define PyVarObject_HEAD_INIT(type, size) \
           PyObject_HEAD_INIT(type) size,
   #define PyType_Modified(t)
+
   typedef struct {
      void *buf;
      PyObject *obj;
@@ -80,6 +89,7 @@
      Py_ssize_t *suboffsets;
      void *internal;
   } Py_buffer;
+
   #define PyBUF_SIMPLE 0
   #define PyBUF_WRITABLE 0x0001
   #define PyBUF_FORMAT 0x0004
@@ -91,9 +101,11 @@
   #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) \
@@ -103,30 +115,31 @@
   #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)
+
+
+#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_GET_LENGTH)
   #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_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_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 +147,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 +166,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 +174,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 +193,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 +206,7 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #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 +225,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 +239,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,7 +248,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)
@@ -307,11 +329,7 @@ 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__
@@ -420,7 +438,7 @@ struct __pyx_t_3_sa__Trie_Node;
 struct __pyx_t_3_sa_match_node;
 struct __pyx_t_3_sa_Matching;
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef struct _node:             # <<<<<<<<<<<<<<
@@ -434,7 +452,7 @@ struct __pyx_t_3_sa__node {
   int val;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":30
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":30
  * _init_lower_mask()
  * 
  * cdef struct _BitSet:             # <<<<<<<<<<<<<<
@@ -448,7 +466,7 @@ struct __pyx_t_3_sa__BitSet {
   int size;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":168
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":168
  *     return result
  * 
  * cdef struct _VEB:             # <<<<<<<<<<<<<<
@@ -465,7 +483,7 @@ struct __pyx_t_3_sa__VEB {
   void **bottom;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":10
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":10
  * cdef struct _Trie_Node    # forward decl
  * 
  * cdef struct _Trie_Edge:             # <<<<<<<<<<<<<<
@@ -479,7 +497,7 @@ struct __pyx_t_3_sa__Trie_Edge {
   struct __pyx_t_3_sa__Trie_Edge *smaller;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":8
  * from libc.string cimport memset, memcpy
  * 
  * cdef struct _Trie_Node    # forward decl             # <<<<<<<<<<<<<<
@@ -492,7 +510,7 @@ struct __pyx_t_3_sa__Trie_Node {
   int arr_len;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":77
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":76
  * 
  * # linked list structure for storing matches in BaselineRuleFactory
  * cdef struct match_node:             # <<<<<<<<<<<<<<
@@ -504,7 +522,7 @@ struct __pyx_t_3_sa_match_node {
   struct __pyx_t_3_sa_match_node *next;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":167
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":172
  * 
  * # struct used to encapsulate a single matching
  * cdef struct Matching:             # <<<<<<<<<<<<<<
@@ -519,7 +537,7 @@ struct __pyx_t_3_sa_Matching {
   int size;
 };
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":223
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":228
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -578,7 +596,7 @@ struct __pyx_obj_3_sa_HieroCachingRuleFactory {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":118
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":118
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -591,7 +609,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_9_decode_sentence {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":187
+/* "/home/paulb/workspace/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()))             # <<<<<<<<<<<<<<
@@ -608,7 +626,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_17_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1190
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1187
  *         # Online rule extraction and scoring
  *         if self.online:
  *             f_syms = tuple(word[0][0] for word in fwords)             # <<<<<<<<<<<<<<
@@ -625,7 +643,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_20_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":36
+/* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -656,7 +674,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_3_compute_stats {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":122
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":122
  * 
  * def encode_words(words):
  *     return tuple(sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -673,7 +691,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_12_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":21
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -707,7 +725,7 @@ struct __pyx_obj_3_sa_IntList {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":340
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":340
  * 
  * 
  * cdef class VEBIterator:             # <<<<<<<<<<<<<<
@@ -721,7 +739,7 @@ struct __pyx_obj_3_sa_VEBIterator {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":47
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -742,7 +760,7 @@ struct __pyx_obj_3_sa_BiLex {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":354
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -756,7 +774,7 @@ struct __pyx_obj_3_sa_VEB {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":121
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":121
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  * 
  * def encode_words(words):             # <<<<<<<<<<<<<<
@@ -769,7 +787,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_11_encode_words {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":5
+/* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":5
  * as k most frequent n-grams"""
  * 
  * cdef class LCP:             # <<<<<<<<<<<<<<
@@ -783,7 +801,7 @@ struct __pyx_obj_3_sa_LCP {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -802,7 +820,7 @@ struct __pyx_obj_3_sa_DataArray {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":100
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":100
  * 
  * 
  * cdef class BitSetIterator:             # <<<<<<<<<<<<<<
@@ -816,7 +834,7 @@ struct __pyx_obj_3_sa_BitSetIterator {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2121
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2115
  *         f = Phrase(f_sym)
  *         e = Phrase(e_sym)
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)             # <<<<<<<<<<<<<<
@@ -834,7 +852,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_23_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -855,7 +873,7 @@ struct __pyx_obj_3_sa_Precomputation {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":190
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -872,7 +890,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_18_alignments {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":125
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":125
  * 
  * def decode_words(syms):
  *     return tuple(sym_tostring(sym) for sym in syms)             # <<<<<<<<<<<<<<
@@ -887,7 +905,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_14_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -903,7 +921,7 @@ struct __pyx_obj_3_sa_SuffixArray {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":183
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -916,7 +934,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_16___str__ {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":7
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -952,7 +970,7 @@ struct __pyx_obj_3_sa_Rule {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":112
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":112
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -969,7 +987,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_6_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1890
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1884
  *     # Aggregate stats from a training instance
  *     # (Extract rules, update counts)
  *     def add_instance(self, f_words, e_words, alignment):             # <<<<<<<<<<<<<<
@@ -992,7 +1010,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_21_add_instance {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":74
+/* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -1009,7 +1027,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_2_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":85
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":84
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1028,7 +1046,7 @@ struct __pyx_obj_3_sa_PhraseLocation {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":141
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1043,7 +1061,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_15___iter__ {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2060
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2054
  * 
  *     # Create a rule from source, target, non-terminals, and alignments
  *     def form_rule(self, f_i, e_i, f_span, e_span, nt, al):             # <<<<<<<<<<<<<<
@@ -1057,7 +1075,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_22_form_rule {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2126
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2120
  *     # Rule string from rule
  *     def fmt_rule(self, f, e, a):
  *         a_str = ' '.join('{0}-{1}'.format(*self.alignment.unlink(packed)) for packed in a)             # <<<<<<<<<<<<<<
@@ -1074,7 +1092,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_25_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2125
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2119
  * 
  *     # Rule string from rule
  *     def fmt_rule(self, f, e, a):             # <<<<<<<<<<<<<<
@@ -1088,7 +1106,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_24_fmt_rule {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -1101,7 +1119,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_28___str__ {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":72
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -1115,7 +1133,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_1_read_bitext {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":124
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":124
  *     return tuple(sym_fromstring(word, True) for word in words)
  * 
  * def decode_words(syms):             # <<<<<<<<<<<<<<
@@ -1141,7 +1159,7 @@ struct __pyx_obj_3_sa_FeatureVector {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":114
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":114
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -1154,7 +1172,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_7_decode_lattice {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":968
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":973
  *         return sorted(result);
  * 
  *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
@@ -1236,20 +1254,16 @@ struct __pyx_obj_3_sa___pyx_scope_struct_19_input {
   PyObject *__pyx_v_xroot;
   Py_ssize_t __pyx_t_0;
   Py_ssize_t __pyx_t_1;
-  int __pyx_t_2;
+  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_10)(PyObject *);
-  PyObject *(*__pyx_t_11)(PyObject *);
+  PyObject *(*__pyx_t_5)(PyObject *);
+  Py_ssize_t __pyx_t_6;
+  PyObject *(*__pyx_t_7)(PyObject *);
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":23
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1263,7 +1277,7 @@ struct __pyx_obj_3_sa_Scorer {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1278,7 +1292,7 @@ struct __pyx_obj_3_sa_Alignment {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":118
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":118
  * # (entirely C-implemented) _BitSet struct.
  * # Very slow; use only for debugging
  * cdef class BitSet:             # <<<<<<<<<<<<<<
@@ -1291,7 +1305,7 @@ struct __pyx_obj_3_sa_BitSet {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":107
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":106
  * 
  * 
  * cdef class Sampler:             # <<<<<<<<<<<<<<
@@ -1305,7 +1319,7 @@ struct __pyx_obj_3_sa_Sampler {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1319,7 +1333,7 @@ struct __pyx_obj_3_sa_StringMap {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2172
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2166
  *     # (Used for EGivenFCoherent)
  *     # Return set of (fphrase, lex_i, lex_j)
  *     def get_f_phrases(self, f_words):             # <<<<<<<<<<<<<<
@@ -1336,7 +1350,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_26_get_f_phrases {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":47
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":46
  * cdef int EPSILON = sym_fromstring('*EPS*', True)
  * 
  * cdef class TrieNode:             # <<<<<<<<<<<<<<
@@ -1349,7 +1363,7 @@ struct __pyx_obj_3_sa_TrieNode {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":53
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":52
  *         self.children = {}
  * 
  * cdef class ExtendedTrieNode(TrieNode):             # <<<<<<<<<<<<<<
@@ -1364,7 +1378,7 @@ struct __pyx_obj_3_sa_ExtendedTrieNode {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1379,7 +1393,7 @@ struct __pyx_obj_3_sa_TrieMap {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":115
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":115
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -1406,7 +1420,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":110
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":110
  *     return sym_isvar(sym)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -1437,7 +1451,7 @@ struct __pyx_obj_3_sa_Phrase {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":15
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1453,7 +1467,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_27___iter__ {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":81
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -1469,7 +1483,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct____iter__ {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":64
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":63
  * 
  * 
  * cdef class TrieTable:             # <<<<<<<<<<<<<<
@@ -1484,7 +1498,7 @@ struct __pyx_obj_3_sa_TrieTable {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":111
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":111
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -1501,7 +1515,7 @@ struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr {
 };
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":119
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":119
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -1537,7 +1551,7 @@ struct __pyx_obj_3_sa_FloatList {
 
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":8
  *     char* stringmap_word(StrMap *vocab, int i)
  * 
  * cdef class StringMap:             # <<<<<<<<<<<<<<
@@ -1552,7 +1566,7 @@ struct __pyx_vtabstruct_3_sa_StringMap {
 static struct __pyx_vtabstruct_3_sa_StringMap *__pyx_vtabptr_3_sa_StringMap;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":9
  * from libc.string cimport memset, strcpy
  * 
  * cdef class DataArray:             # <<<<<<<<<<<<<<
@@ -1567,7 +1581,7 @@ struct __pyx_vtabstruct_3_sa_DataArray {
 static struct __pyx_vtabstruct_3_sa_DataArray *__pyx_vtabptr_3_sa_DataArray;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":109
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":109
  *         trie_node_to_map(edge.node, result, prefix, include_zeros)
  * 
  * cdef class TrieMap:             # <<<<<<<<<<<<<<
@@ -1582,7 +1596,7 @@ struct __pyx_vtabstruct_3_sa_TrieMap {
 static struct __pyx_vtabstruct_3_sa_TrieMap *__pyx_vtabptr_3_sa_TrieMap;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":8
  * # May need to revisit if things get really tight, though.
  * 
  * cdef class Alignment:             # <<<<<<<<<<<<<<
@@ -1598,7 +1612,7 @@ struct __pyx_vtabstruct_3_sa_Alignment {
 static struct __pyx_vtabstruct_3_sa_Alignment *__pyx_vtabptr_3_sa_Alignment;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":47
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":47
  * 
  * 
  * cdef class BiLex:             # <<<<<<<<<<<<<<
@@ -1617,7 +1631,7 @@ struct __pyx_vtabstruct_3_sa_BiLex {
 static struct __pyx_vtabstruct_3_sa_BiLex *__pyx_vtabptr_3_sa_BiLex;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":9
  * from libc.string cimport memset, memcpy
  * 
  * cdef class IntList:             # <<<<<<<<<<<<<<
@@ -1637,7 +1651,7 @@ struct __pyx_vtabstruct_3_sa_IntList {
 static struct __pyx_vtabstruct_3_sa_IntList *__pyx_vtabptr_3_sa_IntList;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":4
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":4
  * from libc.string cimport strsep, strcpy, strlen
  * 
  * cdef class Phrase:             # <<<<<<<<<<<<<<
@@ -1652,7 +1666,7 @@ struct __pyx_vtabstruct_3_sa_Phrase {
 static struct __pyx_vtabstruct_3_sa_Phrase *__pyx_vtabptr_3_sa_Phrase;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":85
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":84
  * # in the suffix array; if discontiguous, it is the set of
  * # actual locations (packed into an array)
  * cdef class PhraseLocation:             # <<<<<<<<<<<<<<
@@ -1666,7 +1680,7 @@ struct __pyx_vtabstruct_3_sa_PhraseLocation {
 static struct __pyx_vtabstruct_3_sa_PhraseLocation *__pyx_vtabptr_3_sa_PhraseLocation;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":188
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":188
  * 
  * 
  * cdef class Precomputation:             # <<<<<<<<<<<<<<
@@ -1681,7 +1695,7 @@ struct __pyx_vtabstruct_3_sa_Precomputation {
 static struct __pyx_vtabstruct_3_sa_Precomputation *__pyx_vtabptr_3_sa_Precomputation;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":23
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":23
  *         return ' '.join('%s=%s' % feat for feat in self)
  * 
  * cdef class Scorer:             # <<<<<<<<<<<<<<
@@ -1695,7 +1709,7 @@ struct __pyx_vtabstruct_3_sa_Scorer {
 static struct __pyx_vtabstruct_3_sa_Scorer *__pyx_vtabptr_3_sa_Scorer;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":9
  * from libc.string cimport memset, strcpy, strlen
  * 
  * cdef class FloatList:             # <<<<<<<<<<<<<<
@@ -1711,7 +1725,7 @@ struct __pyx_vtabstruct_3_sa_FloatList {
 static struct __pyx_vtabstruct_3_sa_FloatList *__pyx_vtabptr_3_sa_FloatList;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":354
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":354
  * 
  * 
  * cdef class VEB:             # <<<<<<<<<<<<<<
@@ -1727,7 +1741,7 @@ struct __pyx_vtabstruct_3_sa_VEB {
 static struct __pyx_vtabstruct_3_sa_VEB *__pyx_vtabptr_3_sa_VEB;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":7
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":7
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1
  * 
  * cdef class Alphabet:             # <<<<<<<<<<<<<<
@@ -1750,7 +1764,7 @@ struct __pyx_vtabstruct_3_sa_Alphabet {
 static struct __pyx_vtabstruct_3_sa_Alphabet *__pyx_vtabptr_3_sa_Alphabet;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":223
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":228
  * 
  * 
  * cdef class HieroCachingRuleFactory:             # <<<<<<<<<<<<<<
@@ -1778,7 +1792,7 @@ struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory {
 static struct __pyx_vtabstruct_3_sa_HieroCachingRuleFactory *__pyx_vtabptr_3_sa_HieroCachingRuleFactory;
 
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":6
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":6
  * from libc.stdio cimport FILE, fclose, fopen
  * 
  * cdef class SuffixArray:             # <<<<<<<<<<<<<<
@@ -1909,18 +1923,11 @@ static int __Pyx_PyBytes_Tailmatch(PyObject* self, PyObject* substr, Py_ssize_t
                                    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
+        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);
-#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;
             }
@@ -1959,47 +1966,42 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j
                                                     __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)))) {
@@ -2015,36 +2017,30 @@ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i)
             Py_INCREF(r);
             return r;
         }
-    } else {  /* inlined PySequence_GetItem() */
+    }
+    else if (likely(i >= 0)) {
         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 (PySequence_Check(o)) {
-        return PySequence_GetItem(o, i);
-    }
-#endif
     return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
 }
 
-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;
@@ -2062,11 +2058,9 @@ 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*/
 
@@ -2081,7 +2075,6 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Generic(PyObject *o, PyObject *j, PyOb
     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)))) {
@@ -2091,79 +2084,26 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje
             Py_DECREF(old);
             return 1;
         }
-    } else {  /* inlined PySequence_SetItem() */
+    }
+    else if (likely(i >= 0)) {
         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 CYTHON_COMPILING_IN_PYPY
-    if (PySequence_Check(o) && !PyDict_Check(o)) {
-#else
-    if (PySequence_Check(o)) {
-#endif
-        return PySequence_SetItem(o, i, 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
 
 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) \
@@ -2197,9 +2137,15 @@ static CYTHON_INLINE int PySet_Add(PyObject *set, PyObject *key) {
 #endif /* PyAnySet_CheckExact (<= 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())
@@ -2240,6 +2186,18 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level);
 
 static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name);
 
+#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_CyFunction_USED 1
 #include <structmember.h>
 #define __Pyx_CYFUNCTION_STATICMETHOD  0x01
@@ -2282,12 +2240,6 @@ static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
                                                             PyObject *tuple);
 static int __Pyx_CyFunction_init(void);
 
-static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/
-#if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3
-static PyObject* __pyx_print = 0;
-static PyObject* __pyx_print_kwargs = 0;
-#endif
-
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
 
 static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
@@ -2327,30 +2279,22 @@ static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value,
 
 #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;
+    int is_running;
+    int resume_label;
     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);
 
@@ -2819,31 +2763,30 @@ 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[] = "[X,1] specific policy choices faced [X,2] , not";
-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[] = "    Intersect time = %f seconds";
-static char __pyx_k_128[] = "No aligned terminals";
-static char __pyx_k_129[] = "Unaligned chunk";
-static char __pyx_k_130[] = "Gaps are not tight phrases";
-static char __pyx_k_131[] = "Inside edges of preceding subphrase are not tight";
-static char __pyx_k_132[] = "Inside edges of following subphrase are not tight";
-static char __pyx_k_133[] = "Subphrase [%d, %d] failed integrity check";
-static char __pyx_k_134[] = "Didn't extract anything from [%d, %d] -> [%d, %d]";
-static char __pyx_k_135[] = "Unable to extract basic phrase";
-static char __pyx_k_138[] = "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi";
-static char __pyx_k_139[] = "{0}-{1}";
-static char __pyx_k_140[] = "[X] ||| {0} ||| {1} ||| {2}";
-static char __pyx_k_141[] = "------------------------------";
-static char __pyx_k_143[] = "         Online Stats         ";
-static char __pyx_k_147[] = " : ";
-static char __pyx_k_153[] = "OnlineFeatureContext";
-static char __pyx_k_156[] = "%s=%s";
-static char __pyx_k_158[] = "/home/pauldb/workspace/cdec/python/src/sa/_sa.pyx";
-static char __pyx_k_161[] = "cdec.sa";
-static char __pyx_k_165[] = "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi";
-static char __pyx_k_176[] = "*EPS*";
+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[] = "    Intersect 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_137[] = "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi";
+static char __pyx_k_138[] = "{0}-{1}";
+static char __pyx_k_139[] = "[X] ||| {0} ||| {1} ||| {2}";
+static char __pyx_k_140[] = "------------------------------";
+static char __pyx_k_142[] = "         Online Stats         ";
+static char __pyx_k_146[] = " : ";
+static char __pyx_k_152[] = "OnlineFeatureContext";
+static char __pyx_k_155[] = "%s=%s";
+static char __pyx_k_157[] = "/home/paulb/workspace/cdec/python/src/sa/_sa.pyx";
+static char __pyx_k_160[] = "cdec.sa";
+static char __pyx_k_164[] = "/home/paulb/workspace/cdec/python/src/sa/sym.pxi";
+static char __pyx_k_175[] = "*EPS*";
 static char __pyx_k__FE[] = "FE";
 static char __pyx_k__al[] = "al";
 static char __pyx_k__fe[] = "fe";
@@ -2875,7 +2818,6 @@ static char __pyx_k__pop[] = "pop";
 static char __pyx_k__res[] = "res";
 static char __pyx_k__set[] = "set";
 static char __pyx_k__sym[] = "sym";
-static char __pyx_k__sys[] = "sys";
 static char __pyx_k__vec[] = "vec";
 static char __pyx_k__zip[] = "zip";
 static char __pyx_k__NULL[] = "NULL";
@@ -2944,7 +2886,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__stderr[] = "stderr";
 static char __pyx_k__unlink[] = "unlink";
 static char __pyx_k__Counter[] = "Counter";
 static char __pyx_k__advance[] = "advance";
@@ -3107,8 +3048,8 @@ static PyObject *__pyx_kp_s_118;
 static PyObject *__pyx_n_s_119;
 static PyObject *__pyx_kp_s_120;
 static PyObject *__pyx_kp_s_121;
-static PyObject *__pyx_kp_s_123;
-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;
@@ -3120,19 +3061,18 @@ 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_140;
-static PyObject *__pyx_kp_s_141;
-static PyObject *__pyx_kp_s_143;
-static PyObject *__pyx_kp_s_147;
-static PyObject *__pyx_n_s_153;
-static PyObject *__pyx_kp_s_156;
-static PyObject *__pyx_kp_s_158;
-static PyObject *__pyx_kp_s_161;
-static PyObject *__pyx_kp_s_165;
+static PyObject *__pyx_kp_s_142;
+static PyObject *__pyx_kp_s_146;
+static PyObject *__pyx_n_s_152;
+static PyObject *__pyx_kp_s_155;
+static PyObject *__pyx_kp_s_157;
+static PyObject *__pyx_kp_s_160;
+static PyObject *__pyx_kp_s_164;
 static PyObject *__pyx_kp_s_18;
 static PyObject *__pyx_kp_s_2;
 static PyObject *__pyx_kp_s_21;
@@ -3409,12 +3349,10 @@ static PyObject *__pyx_n_s__spanlen;
 static PyObject *__pyx_n_s__split;
 static PyObject *__pyx_n_s__start;
 static PyObject *__pyx_n_s__stats;
-static PyObject *__pyx_n_s__stderr;
 static PyObject *__pyx_n_s__stop;
 static PyObject *__pyx_n_s__suffix_link;
 static PyObject *__pyx_n_s__sym;
 static PyObject *__pyx_n_s__syms;
-static PyObject *__pyx_n_s__sys;
 static PyObject *__pyx_n_s__test_sentence;
 static PyObject *__pyx_n_s__tight_phrases;
 static PyObject *__pyx_n_s__toMap;
@@ -3498,41 +3436,41 @@ 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_142;
+static PyObject *__pyx_k_tuple_135;
+static PyObject *__pyx_k_tuple_141;
+static PyObject *__pyx_k_tuple_143;
 static PyObject *__pyx_k_tuple_144;
 static PyObject *__pyx_k_tuple_145;
-static PyObject *__pyx_k_tuple_146;
+static PyObject *__pyx_k_tuple_147;
 static PyObject *__pyx_k_tuple_148;
 static PyObject *__pyx_k_tuple_149;
 static PyObject *__pyx_k_tuple_150;
 static PyObject *__pyx_k_tuple_151;
-static PyObject *__pyx_k_tuple_152;
-static PyObject *__pyx_k_tuple_154;
-static PyObject *__pyx_k_tuple_159;
+static PyObject *__pyx_k_tuple_153;
+static PyObject *__pyx_k_tuple_158;
+static PyObject *__pyx_k_tuple_161;
 static PyObject *__pyx_k_tuple_162;
-static PyObject *__pyx_k_tuple_163;
-static PyObject *__pyx_k_tuple_166;
-static PyObject *__pyx_k_tuple_168;
-static PyObject *__pyx_k_tuple_170;
-static PyObject *__pyx_k_tuple_172;
-static PyObject *__pyx_k_tuple_174;
-static PyObject *__pyx_k_tuple_177;
-static PyObject *__pyx_k_tuple_179;
-static PyObject *__pyx_k_tuple_181;
-static PyObject *__pyx_k_codeobj_137;
-static PyObject *__pyx_k_codeobj_155;
-static PyObject *__pyx_k_codeobj_157;
-static PyObject *__pyx_k_codeobj_160;
-static PyObject *__pyx_k_codeobj_164;
-static PyObject *__pyx_k_codeobj_167;
-static PyObject *__pyx_k_codeobj_169;
-static PyObject *__pyx_k_codeobj_171;
-static PyObject *__pyx_k_codeobj_173;
-static PyObject *__pyx_k_codeobj_175;
-static PyObject *__pyx_k_codeobj_178;
-static PyObject *__pyx_k_codeobj_180;
-static PyObject *__pyx_k_codeobj_182;
+static PyObject *__pyx_k_tuple_165;
+static PyObject *__pyx_k_tuple_167;
+static PyObject *__pyx_k_tuple_169;
+static PyObject *__pyx_k_tuple_171;
+static PyObject *__pyx_k_tuple_173;
+static PyObject *__pyx_k_tuple_176;
+static PyObject *__pyx_k_tuple_178;
+static PyObject *__pyx_k_tuple_180;
+static PyObject *__pyx_k_codeobj_136;
+static PyObject *__pyx_k_codeobj_154;
+static PyObject *__pyx_k_codeobj_156;
+static PyObject *__pyx_k_codeobj_159;
+static PyObject *__pyx_k_codeobj_163;
+static PyObject *__pyx_k_codeobj_166;
+static PyObject *__pyx_k_codeobj_168;
+static PyObject *__pyx_k_codeobj_170;
+static PyObject *__pyx_k_codeobj_172;
+static PyObject *__pyx_k_codeobj_174;
+static PyObject *__pyx_k_codeobj_177;
+static PyObject *__pyx_k_codeobj_179;
+static PyObject *__pyx_k_codeobj_181;
 
 /* Python wrapper */
 static PyObject *__pyx_pw_3_sa_1monitor_cpu(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
@@ -3541,6 +3479,7 @@ static PyObject *__pyx_pw_3_sa_1monitor_cpu(PyObject *__pyx_self, CYTHON_UNUSED
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("monitor_cpu (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_monitor_cpu(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -3657,6 +3596,7 @@ static PyObject *__pyx_pw_3_sa_3gzip_or_text(PyObject *__pyx_self, PyObject *__p
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("gzip_or_text (wrapper)", 0);
+  __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;}
   }
@@ -3779,11 +3719,11 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -3816,6 +3756,18 @@ 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 (values[0]) {
+      } else {
+        __pyx_v_size = ((int)0);
+      }
+      if (values[1]) {
+      } else {
+        __pyx_v_increment = ((int)1);
+      }
+      if (values[2]) {
+      } else {
+        __pyx_v_initial_len = ((int)0);
+      }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -3854,7 +3806,7 @@ static int __pyx_pw_3_sa_9FloatList_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":11
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":11
  * cdef class FloatList:
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
@@ -3868,7 +3820,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":12
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -3878,7 +3830,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":13
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -3890,7 +3842,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
@@ -3899,7 +3851,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
@@ -3908,7 +3860,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
@@ -3917,7 +3869,7 @@ static int __pyx_pf_3_sa_9FloatList___cinit__(struct __pyx_obj_3_sa_FloatList *_
  */
   __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <float*> malloc(size*sizeof(float))             # <<<<<<<<<<<<<<
@@ -3926,7 +3878,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":18
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -3949,7 +3901,7 @@ static void __pyx_pw_3_sa_9FloatList_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(float))
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -3961,7 +3913,7 @@ static void __pyx_pf_3_sa_9FloatList_2__dealloc__(struct __pyx_obj_3_sa_FloatLis
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":21
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":21
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -3984,7 +3936,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_5__getitem__(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":23
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":23
  *         free(self.arr)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -4007,7 +3959,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":24
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":24
  * 
  *     def __getitem__(self, i):
  *         j = i             # <<<<<<<<<<<<<<
@@ -4017,19 +3969,20 @@ 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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":25
+  /* "/home/paulb/workspace/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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":26
+    /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":26
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -4048,20 +4001,22 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":27
+  /* "/home/paulb/workspace/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_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;
@@ -4071,7 +4026,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   if (__pyx_t_5) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":28
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -4106,7 +4061,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":29
+  /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -4135,7 +4090,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_4__getitem__(struct __pyx_obj_3_sa_Flo
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":31
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":31
  *         return self.arr[j]
  * 
  *     cdef void set(self, int i, float v):             # <<<<<<<<<<<<<<
@@ -4157,7 +4112,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":32
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":32
  * 
  *     cdef void set(self, int i, float v):
  *         j = i             # <<<<<<<<<<<<<<
@@ -4166,7 +4121,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
  */
   __pyx_v_j = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":33
  *     cdef void set(self, int i, float v):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -4176,7 +4131,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/pauldb/workspace/cdec/python/src/sa/float_list.pxi":34
+    /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":34
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -4188,7 +4143,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":35
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":35
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -4204,7 +4159,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":36
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -4241,7 +4196,7 @@ static void __pyx_f_3_sa_9FloatList_set(struct __pyx_obj_3_sa_FloatList *__pyx_v
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":37
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -4271,7 +4226,7 @@ static int __pyx_pw_3_sa_9FloatList_7__setitem__(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":39
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":39
  *         self.arr[j] = v
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -4289,7 +4244,7 @@ static int __pyx_pf_3_sa_9FloatList_6__setitem__(struct __pyx_obj_3_sa_FloatList
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":40
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -4321,7 +4276,7 @@ static Py_ssize_t __pyx_pw_3_sa_9FloatList_9__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":42
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":42
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -4334,7 +4289,7 @@ static Py_ssize_t __pyx_pf_3_sa_9FloatList_8__len__(struct __pyx_obj_3_sa_FloatL
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":43
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":43
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
@@ -4371,7 +4326,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_11append(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":45
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":45
  *         return self.len
  * 
  *     def append(self, float val):             # <<<<<<<<<<<<<<
@@ -4385,7 +4340,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("append", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":46
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":46
  * 
  *     def append(self, float val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -4395,7 +4350,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":47
+    /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":47
  *     def append(self, float val):
  *         if self.len == self.size:
  *             self.size = self.size + self.increment             # <<<<<<<<<<<<<<
@@ -4404,7 +4359,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":48
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -4416,7 +4371,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":49
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -4425,7 +4380,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":50
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -4440,7 +4395,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_10append(struct __pyx_obj_3_sa_FloatLi
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":52
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":52
  *         self.len = self.len + 1
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -4452,7 +4407,7 @@ static void __pyx_f_3_sa_9FloatList_write_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":53
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":53
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(float), 1, f)             # <<<<<<<<<<<<<<
@@ -4461,7 +4416,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/pauldb/workspace/cdec/python/src/sa/float_list.pxi":54
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -4494,7 +4449,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_13write(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":56
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":56
  *         fwrite(self.arr, sizeof(float), self.len, f)
  * 
  *     def write(self, char* filename):             # <<<<<<<<<<<<<<
@@ -4508,7 +4463,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":58
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":58
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -4517,7 +4472,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":59
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -4526,7 +4481,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":60
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":60
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -4541,7 +4496,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_12write(struct __pyx_obj_3_sa_FloatLis
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":62
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":62
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -4553,7 +4508,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":63
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":63
  * 
  *     cdef void read_handle(self, FILE* f):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -4562,7 +4517,7 @@ static void __pyx_f_3_sa_9FloatList_read_handle(struct __pyx_obj_3_sa_FloatList
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":64
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -4571,7 +4526,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/pauldb/workspace/cdec/python/src/sa/float_list.pxi":65
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -4580,7 +4535,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/pauldb/workspace/cdec/python/src/sa/float_list.pxi":66
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -4589,7 +4544,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/pauldb/workspace/cdec/python/src/sa/float_list.pxi":67
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -4622,7 +4577,7 @@ static PyObject *__pyx_pw_3_sa_9FloatList_15read(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":69
+/* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":69
  *         fread(self.arr, sizeof(float), self.len, f)
  * 
  *     def read(self, char* filename):             # <<<<<<<<<<<<<<
@@ -4636,7 +4591,7 @@ static PyObject *__pyx_pf_3_sa_9FloatList_14read(struct __pyx_obj_3_sa_FloatList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":71
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -4645,7 +4600,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":72
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":72
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -4653,7 +4608,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/float_list.pxi":73
+  /* "/home/paulb/workspace/cdec/python/src/sa/float_list.pxi":73
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -4672,11 +4627,11 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   int __pyx_v_size;
   int __pyx_v_increment;
   int __pyx_v_initial_len;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,&__pyx_n_s__increment,&__pyx_n_s__initial_len,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -4709,6 +4664,18 @@ 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 (values[0]) {
+      } else {
+        __pyx_v_size = ((int)0);
+      }
+      if (values[1]) {
+      } else {
+        __pyx_v_increment = ((int)1);
+      }
+      if (values[2]) {
+      } else {
+        __pyx_v_initial_len = ((int)0);
+      }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
@@ -4747,7 +4714,7 @@ static int __pyx_pw_3_sa_7IntList_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":11
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":11
  * cdef class IntList:
  * 
  *     def __cinit__(self, int size=0, int increment=1, int initial_len=0):             # <<<<<<<<<<<<<<
@@ -4761,7 +4728,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":12
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -4771,7 +4738,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":13
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -4783,7 +4750,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":14
  *         if initial_len > size:
  *             size = initial_len
  *         self.size = size             # <<<<<<<<<<<<<<
@@ -4792,7 +4759,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->size = __pyx_v_size;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":15
  *             size = initial_len
  *         self.size = size
  *         self.increment = increment             # <<<<<<<<<<<<<<
@@ -4801,7 +4768,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->increment = __pyx_v_increment;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":16
  *         self.size = size
  *         self.increment = increment
  *         self.len = initial_len             # <<<<<<<<<<<<<<
@@ -4810,7 +4777,7 @@ static int __pyx_pf_3_sa_7IntList___cinit__(struct __pyx_obj_3_sa_IntList *__pyx
  */
   __pyx_v_self->len = __pyx_v_initial_len;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":17
  *         self.increment = increment
  *         self.len = initial_len
  *         self.arr = <int*> malloc(size*sizeof(int))             # <<<<<<<<<<<<<<
@@ -4819,7 +4786,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":18
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -4844,7 +4811,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_3__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":20
  *         memset(self.arr, 0, initial_len*sizeof(int))
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -4867,7 +4834,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":22
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":22
  *     def __str__(self):
  *         cdef unsigned i
  *         ret = "IntList["             # <<<<<<<<<<<<<<
@@ -4877,7 +4844,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":23
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":23
  *         cdef unsigned i
  *         ret = "IntList["
  *         for idx in range(self.size):             # <<<<<<<<<<<<<<
@@ -4888,7 +4855,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":24
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":24
  *         ret = "IntList["
  *         for idx in range(self.size):
  *             if idx>0:             # <<<<<<<<<<<<<<
@@ -4898,7 +4865,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":25
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":25
  *         for idx in range(self.size):
  *             if idx>0:
  *                 ret += ","             # <<<<<<<<<<<<<<
@@ -4914,7 +4881,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":26
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":26
  *             if idx>0:
  *                 ret += ","
  *             ret += str(self.arr[idx])             # <<<<<<<<<<<<<<
@@ -4939,7 +4906,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_2__str__(struct __pyx_obj_3_sa_IntList *
     __pyx_t_5 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":27
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":27
  *                 ret += ","
  *             ret += str(self.arr[idx])
  *         ret += "]"             # <<<<<<<<<<<<<<
@@ -4952,7 +4919,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":28
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":28
  *             ret += str(self.arr[idx])
  *         ret += "]"
  *         ret += "len="             # <<<<<<<<<<<<<<
@@ -4965,7 +4932,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":29
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":29
  *         ret += "]"
  *         ret += "len="
  *         ret += str(self.len)             # <<<<<<<<<<<<<<
@@ -4989,7 +4956,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":30
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":30
  *         ret += "len="
  *         ret += str(self.len)
  *         return ret             # <<<<<<<<<<<<<<
@@ -5026,7 +4993,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_5index(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":32
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":32
  *         return ret
  * 
  *     def index(self, val):             # <<<<<<<<<<<<<<
@@ -5048,7 +5015,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":34
  *     def index(self, val):
  *         cdef unsigned i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
@@ -5059,7 +5026,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":35
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":35
  *         cdef unsigned i
  *         for i in range(self.len):
  *             if self.arr[i] == val:             # <<<<<<<<<<<<<<
@@ -5068,13 +5035,14 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
  */
     __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); __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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":36
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":36
  *         for i in range(self.len):
  *             if self.arr[i] == val:
  *                 return i             # <<<<<<<<<<<<<<
@@ -5092,7 +5060,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_4index(struct __pyx_obj_3_sa_IntList *__
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":37
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":37
  *             if self.arr[i] == val:
  *                 return i
  *         return IndexError             # <<<<<<<<<<<<<<
@@ -5122,11 +5090,11 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -5140,10 +5108,12 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -5173,7 +5143,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_7partition(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":39
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":39
  *         return IndexError
  * 
  *     def partition(self,start,end):             # <<<<<<<<<<<<<<
@@ -5199,7 +5169,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("partition", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":40
  * 
  *     def partition(self,start,end):
  *         pivot = self.arr[end]             # <<<<<<<<<<<<<<
@@ -5212,7 +5182,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":41
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":41
  *     def partition(self,start,end):
  *         pivot = self.arr[end]
  *         bottom = start-1             # <<<<<<<<<<<<<<
@@ -5224,7 +5194,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":42
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":42
  *         pivot = self.arr[end]
  *         bottom = start-1
  *         top = end             # <<<<<<<<<<<<<<
@@ -5234,7 +5204,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":43
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":43
  *         bottom = start-1
  *         top = end
  *         done = 0             # <<<<<<<<<<<<<<
@@ -5243,7 +5213,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
   __pyx_v_done = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":44
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":44
  *         top = end
  *         done = 0
  *         while not done:             # <<<<<<<<<<<<<<
@@ -5254,7 +5224,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":45
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":45
  *         done = 0
  *         while not done:
  *             while not done:             # <<<<<<<<<<<<<<
@@ -5265,7 +5235,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":46
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":46
  *         while not done:
  *             while not done:
  *                 bottom += 1             # <<<<<<<<<<<<<<
@@ -5278,19 +5248,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":47
+      /* "/home/paulb/workspace/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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":48
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":48
  *                 bottom += 1
  *                 if bottom == top:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -5299,7 +5270,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":49
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":49
  *                 if bottom == top:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
@@ -5311,7 +5282,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       }
       __pyx_L7:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":50
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":50
  *                     done = 1
  *                     break
  *                 if self.arr[bottom] > pivot:             # <<<<<<<<<<<<<<
@@ -5321,13 +5292,14 @@ 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 = 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); __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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":51
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":51
  *                     break
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]             # <<<<<<<<<<<<<<
@@ -5338,7 +5310,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":52
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":52
  *                 if self.arr[bottom] > pivot:
  *                     self.arr[top] = self.arr[bottom]
  *                     break             # <<<<<<<<<<<<<<
@@ -5352,7 +5324,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     }
     __pyx_L6_break:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":53
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":53
  *                     self.arr[top] = self.arr[bottom]
  *                     break
  *             while not done:             # <<<<<<<<<<<<<<
@@ -5363,7 +5335,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":54
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":54
  *                     break
  *             while not done:
  *                 top -= 1             # <<<<<<<<<<<<<<
@@ -5376,19 +5348,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":55
+      /* "/home/paulb/workspace/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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":56
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":56
  *                 top -= 1
  *                 if top == bottom:
  *                     done = 1             # <<<<<<<<<<<<<<
@@ -5397,7 +5370,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
  */
         __pyx_v_done = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":57
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":57
  *                 if top == bottom:
  *                     done = 1
  *                     break             # <<<<<<<<<<<<<<
@@ -5409,7 +5382,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
       }
       __pyx_L11:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":58
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":58
  *                     done = 1
  *                     break
  *                 if self.arr[top] < pivot:             # <<<<<<<<<<<<<<
@@ -5419,13 +5392,14 @@ 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 = 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); __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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":59
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":59
  *                     break
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]             # <<<<<<<<<<<<<<
@@ -5436,7 +5410,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":60
+        /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":60
  *                 if self.arr[top] < pivot:
  *                     self.arr[bottom] = self.arr[top]
  *                     break             # <<<<<<<<<<<<<<
@@ -5451,7 +5425,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_6partition(struct __pyx_obj_3_sa_IntList
     __pyx_L10_break:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":61
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":61
  *                     self.arr[bottom] = self.arr[top]
  *                     break
  *         self.arr[top] = pivot             # <<<<<<<<<<<<<<
@@ -5462,7 +5436,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":62
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":62
  *                     break
  *         self.arr[top] = pivot
  *         return top             # <<<<<<<<<<<<<<
@@ -5495,11 +5469,11 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__end,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -5513,10 +5487,12 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -5546,7 +5522,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_9_doquicksort(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":64
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":64
  *         return top
  * 
  *     def _doquicksort(self,start,end):             # <<<<<<<<<<<<<<
@@ -5567,19 +5543,20 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_doquicksort", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":65
+  /* "/home/paulb/workspace/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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":66
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":66
  *     def _doquicksort(self,start,end):
  *         if start < end:
  *             split = self.partition(start,end)             # <<<<<<<<<<<<<<
@@ -5603,7 +5580,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":67
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":67
  *         if start < end:
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)             # <<<<<<<<<<<<<<
@@ -5628,7 +5605,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":68
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":68
  *             split = self.partition(start,end)
  *             self._doquicksort(start,split-1)
  *             self._doquicksort(split+1,end)             # <<<<<<<<<<<<<<
@@ -5656,7 +5633,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_8_doquicksort(struct __pyx_obj_3_sa_IntL
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":70
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":70
  *             self._doquicksort(split+1,end)
  *         else:
  *             return             # <<<<<<<<<<<<<<
@@ -5695,7 +5672,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_11sort(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":72
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":72
  *             return
  * 
  *     def sort(self):             # <<<<<<<<<<<<<<
@@ -5714,7 +5691,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_10sort(struct __pyx_obj_3_sa_IntList *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sort", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":73
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":73
  * 
  *     def sort(self):
  *         self._doquicksort(0,self.len-1)             # <<<<<<<<<<<<<<
@@ -5764,7 +5741,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_13reset(PyObject *__pyx_v_self, CYTHON_U
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":75
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":75
  *         self._doquicksort(0,self.len-1)
  * 
  *     def reset(self):             # <<<<<<<<<<<<<<
@@ -5777,7 +5754,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_12reset(struct __pyx_obj_3_sa_IntList *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("reset", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":76
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":76
  * 
  *     def reset(self):
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -5801,7 +5778,7 @@ static void __pyx_pw_3_sa_7IntList_15__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":78
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":78
  *         self.len = 0
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -5813,7 +5790,7 @@ static void __pyx_pf_3_sa_7IntList_14__dealloc__(struct __pyx_obj_3_sa_IntList *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":79
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":79
  * 
  *     def __dealloc__(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -5837,7 +5814,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_17__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":81
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":81
  *         free(self.arr)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -5900,7 +5877,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;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":83
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":83
  *     def __iter__(self):
  *         cdef int i
  *         for i in range(self.len):             # <<<<<<<<<<<<<<
@@ -5911,7 +5888,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":84
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":84
  *         cdef int i
  *         for i in range(self.len):
  *             yield self.arr[i]             # <<<<<<<<<<<<<<
@@ -5942,7 +5919,6 @@ static PyObject *__pyx_gb_3_sa_7IntList_18generator(__pyx_GeneratorObject *__pyx
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -5958,7 +5934,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_20__getitem__(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":86
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":86
  *             yield self.arr[i]
  * 
  *     def __getitem__(self, index):             # <<<<<<<<<<<<<<
@@ -5988,7 +5964,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":88
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":88
  *     def __getitem__(self, index):
  *         cdef int i, j, k
  *         if isinstance(index, int):             # <<<<<<<<<<<<<<
@@ -6001,7 +5977,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":89
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":89
  *         cdef int i, j, k
  *         if isinstance(index, int):
  *             j = index             # <<<<<<<<<<<<<<
@@ -6011,7 +5987,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":90
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":90
  *         if isinstance(index, int):
  *             j = index
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -6021,7 +5997,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":91
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":91
  *             j = index
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
@@ -6033,7 +6009,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":92
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":92
  *             if j < 0:
  *                 j = self.len + j
  *             if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -6049,7 +6025,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":93
+      /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6084,7 +6060,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":94
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -6100,7 +6076,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":95
+  /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -6113,7 +6089,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":96
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":96
  *             return self.arr[j]
  *         elif isinstance(index, slice):
  *             i = index.start             # <<<<<<<<<<<<<<
@@ -6126,7 +6102,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":97
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":97
  *         elif isinstance(index, slice):
  *             i = index.start
  *             j = index.stop             # <<<<<<<<<<<<<<
@@ -6139,7 +6115,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":98
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":98
  *             i = index.start
  *             j = index.stop
  *             if i < 0:             # <<<<<<<<<<<<<<
@@ -6149,7 +6125,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":99
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":99
  *             j = index.stop
  *             if i < 0:
  *                 i = self.len + i             # <<<<<<<<<<<<<<
@@ -6161,7 +6137,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L6:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":100
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":100
  *             if i < 0:
  *                 i = self.len + i
  *             if j < 0:             # <<<<<<<<<<<<<<
@@ -6171,7 +6147,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":101
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":101
  *                 i = self.len + i
  *             if j < 0:
  *                 j = self.len + j             # <<<<<<<<<<<<<<
@@ -6183,7 +6159,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":102
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -6211,7 +6187,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":103
+      /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6253,7 +6229,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
     }
     __pyx_L8:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":104
+    /* "/home/paulb/workspace/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 = ()             # <<<<<<<<<<<<<<
@@ -6263,7 +6239,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":105
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -6273,7 +6249,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++) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":106
+      /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":106
  *             result = ()
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)             # <<<<<<<<<<<<<<
@@ -6295,7 +6271,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
       __pyx_t_9 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":107
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":107
  *             for k from i <= k < j:
  *                 result = result + (self.arr[k],)
  *             return result             # <<<<<<<<<<<<<<
@@ -6310,7 +6286,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":109
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":109
  *             return result
  *         else:
  *             raise TypeError("Illegal key type %s for IntList" % type(index))             # <<<<<<<<<<<<<<
@@ -6349,7 +6325,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_19__getitem__(struct __pyx_obj_3_sa_IntL
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":111
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -6371,7 +6347,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":112
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":112
  * 
  *     cdef void set(self, int i, int val):
  *         j = i             # <<<<<<<<<<<<<<
@@ -6380,7 +6356,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":113
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":113
  *     cdef void set(self, int i, int val):
  *         j = i
  *         if i<0:             # <<<<<<<<<<<<<<
@@ -6390,7 +6366,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":114
+    /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":114
  *         j = i
  *         if i<0:
  *             j = self.len + i             # <<<<<<<<<<<<<<
@@ -6402,7 +6378,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":115
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":115
  *         if i<0:
  *             j = self.len + i
  *         if j<0 or j>=self.len:             # <<<<<<<<<<<<<<
@@ -6418,7 +6394,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":116
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6455,7 +6431,7 @@ static void __pyx_f_3_sa_7IntList_set(struct __pyx_obj_3_sa_IntList *__pyx_v_sel
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":117
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6485,7 +6461,7 @@ static int __pyx_pw_3_sa_7IntList_22__setitem__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":119
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":119
  *         self.arr[j] = val
  * 
  *     def __setitem__(self, i, val):             # <<<<<<<<<<<<<<
@@ -6503,7 +6479,7 @@ static int __pyx_pf_3_sa_7IntList_21__setitem__(struct __pyx_obj_3_sa_IntList *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__setitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":120
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":120
  * 
  *     def __setitem__(self, i, val):
  *         self.set(i, val)             # <<<<<<<<<<<<<<
@@ -6535,7 +6511,7 @@ static Py_ssize_t __pyx_pw_3_sa_7IntList_24__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":122
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":122
  *         self.set(i, val)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -6548,7 +6524,7 @@ static Py_ssize_t __pyx_pf_3_sa_7IntList_23__len__(struct __pyx_obj_3_sa_IntList
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":123
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":123
  * 
  *     def __len__(self):
  *         return self.len             # <<<<<<<<<<<<<<
@@ -6575,7 +6551,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_26get_size(PyObject *__pyx_v_self, CYTHO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":125
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":125
  *         return self.len
  * 
  *     def get_size(self):             # <<<<<<<<<<<<<<
@@ -6592,7 +6568,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":126
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":126
  * 
  *     def get_size(self):
  *         return self.size             # <<<<<<<<<<<<<<
@@ -6639,7 +6615,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_28append(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":128
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":128
  *         return self.size
  * 
  *     def append(self, int val):             # <<<<<<<<<<<<<<
@@ -6652,7 +6628,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("append", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":129
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":129
  * 
  *     def append(self, int val):
  *         self._append(val)             # <<<<<<<<<<<<<<
@@ -6667,7 +6643,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_27append(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":131
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":131
  *         self._append(val)
  * 
  *     cdef void _append(self, int val):             # <<<<<<<<<<<<<<
@@ -6680,7 +6656,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":132
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":132
  * 
  *     cdef void _append(self, int val):
  *         if self.len == self.size:             # <<<<<<<<<<<<<<
@@ -6690,7 +6666,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":133
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6699,7 +6675,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":134
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6711,7 +6687,7 @@ static void __pyx_f_3_sa_7IntList__append(struct __pyx_obj_3_sa_IntList *__pyx_v
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":135
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6720,7 +6696,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":136
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6743,7 +6719,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_30extend(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":138
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":138
  *         self.len = self.len + 1
  * 
  *     def extend(self, other):             # <<<<<<<<<<<<<<
@@ -6760,7 +6736,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extend", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":139
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":139
  * 
  *     def extend(self, other):
  *         self._extend(other)             # <<<<<<<<<<<<<<
@@ -6785,7 +6761,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_29extend(struct __pyx_obj_3_sa_IntList *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":141
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":141
  *         self._extend(other)
  * 
  *     cdef void _extend(self, IntList other):             # <<<<<<<<<<<<<<
@@ -6797,7 +6773,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_extend", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":142
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":142
  * 
  *     cdef void _extend(self, IntList other):
  *         self._extend_arr(other.arr, other.len)             # <<<<<<<<<<<<<<
@@ -6809,7 +6785,7 @@ static void __pyx_f_3_sa_7IntList__extend(struct __pyx_obj_3_sa_IntList *__pyx_v
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":144
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -6822,7 +6798,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":145
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -6832,7 +6808,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":146
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6841,7 +6817,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":147
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6853,7 +6829,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":148
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -6862,7 +6838,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":149
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -6874,7 +6850,7 @@ static void __pyx_f_3_sa_7IntList__extend_arr(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":151
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":151
  *         self.len = self.len + other_len
  * 
  *     cdef void _clear(self):             # <<<<<<<<<<<<<<
@@ -6886,7 +6862,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_clear", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":152
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":152
  * 
  *     cdef void _clear(self):
  *         free(self.arr)             # <<<<<<<<<<<<<<
@@ -6895,7 +6871,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   free(__pyx_v_self->arr);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":153
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":153
  *     cdef void _clear(self):
  *         free(self.arr)
  *         self.len = 0             # <<<<<<<<<<<<<<
@@ -6904,7 +6880,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":154
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":154
  *         free(self.arr)
  *         self.len = 0
  *         self.size = 0             # <<<<<<<<<<<<<<
@@ -6913,7 +6889,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
  */
   __pyx_v_self->size = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":155
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":155
  *         self.len = 0
  *         self.size = 0
  *         self.arr = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -6925,7 +6901,7 @@ static void __pyx_f_3_sa_7IntList__clear(struct __pyx_obj_3_sa_IntList *__pyx_v_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":157
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":157
  *         self.arr = <int*> malloc(0)
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -6937,7 +6913,7 @@ static void __pyx_f_3_sa_7IntList_write_handle(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":158
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":158
  * 
  *     cdef void write_handle(self, FILE* f):
  *         fwrite(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -6946,7 +6922,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":159
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -6979,7 +6955,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_32write(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":161
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":161
  *         fwrite(self.arr, sizeof(int), self.len, f)
  * 
  *     def write(self, char* filename):             # <<<<<<<<<<<<<<
@@ -6993,7 +6969,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":163
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":163
  *     def write(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -7002,7 +6978,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":164
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":164
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -7011,7 +6987,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":165
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":165
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -7026,7 +7002,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_31write(struct __pyx_obj_3_sa_IntList *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":167
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":167
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -7038,7 +7014,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":168
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":168
  * 
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)             # <<<<<<<<<<<<<<
@@ -7047,7 +7023,7 @@ static void __pyx_f_3_sa_7IntList_read_handle(struct __pyx_obj_3_sa_IntList *__p
  */
   __pyx_v_self->arr;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":169
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":169
  *     cdef void read_handle(self, FILE* f):
  *         (self.arr)
  *         fread(&(self.len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -7056,7 +7032,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":170
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -7065,7 +7041,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":171
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -7074,7 +7050,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/pauldb/workspace/cdec/python/src/sa/int_list.pxi":172
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7107,7 +7083,7 @@ static PyObject *__pyx_pw_3_sa_7IntList_34read(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":174
+/* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":174
  *         fread(self.arr, sizeof(int), self.len, f)
  * 
  *     def read(self, char* filename):             # <<<<<<<<<<<<<<
@@ -7121,7 +7097,7 @@ static PyObject *__pyx_pf_3_sa_7IntList_33read(struct __pyx_obj_3_sa_IntList *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":176
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":176
  *     def read(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -7130,7 +7106,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":177
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":177
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -7138,7 +7114,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/int_list.pxi":178
+  /* "/home/paulb/workspace/cdec/python/src/sa/int_list.pxi":178
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -7165,7 +7141,7 @@ static int __pyx_pw_3_sa_9StringMap_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":13
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":13
  *     cdef int index(self, char *s)
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -7178,7 +7154,7 @@ static int __pyx_pf_3_sa_9StringMap___cinit__(struct __pyx_obj_3_sa_StringMap *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":14
  * 
  *     def __cinit__(self):
  *         self.vocab = stringmap_new()             # <<<<<<<<<<<<<<
@@ -7201,7 +7177,7 @@ static void __pyx_pw_3_sa_9StringMap_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":16
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":16
  *         self.vocab = stringmap_new()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -7213,7 +7189,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":17
  * 
  *     def __dealloc__(self):
  *         stringmap_delete(self.vocab)             # <<<<<<<<<<<<<<
@@ -7225,7 +7201,7 @@ static void __pyx_pf_3_sa_9StringMap_2__dealloc__(struct __pyx_obj_3_sa_StringMa
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":19
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":19
  *         stringmap_delete(self.vocab)
  * 
  *     cdef char *word(self, int i):             # <<<<<<<<<<<<<<
@@ -7238,7 +7214,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("word", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":20
+  /* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":20
  * 
  *     cdef char *word(self, int i):
  *         return stringmap_word(self.vocab, i)             # <<<<<<<<<<<<<<
@@ -7254,7 +7230,7 @@ static char *__pyx_f_3_sa_9StringMap_word(struct __pyx_obj_3_sa_StringMap *__pyx
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":22
+/* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":22
  *         return stringmap_word(self.vocab, i)
  * 
  *     cdef int index(self, char *s):             # <<<<<<<<<<<<<<
@@ -7266,7 +7242,7 @@ static int __pyx_f_3_sa_9StringMap_index(struct __pyx_obj_3_sa_StringMap *__pyx_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("index", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/str_map.pxi":23
+  /* "/home/paulb/workspace/cdec/python/src/sa/str_map.pxi":23
  * 
  *     cdef int index(self, char *s):
  *         return stringmap_index(self.vocab, s)             # <<<<<<<<<<<<<<
@@ -7287,14 +7263,14 @@ static int __pyx_pw_3_sa_9DataArray_1__cinit__(PyObject *__pyx_v_self, PyObject
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
   int __pyx_v_use_sent_id;
+  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};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":17
+    /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -7341,6 +7317,10 @@ 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 (values[3]) {
+      } else {
+        __pyx_v_use_sent_id = ((int)0);
+      }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
         case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
@@ -7386,7 +7366,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":18
+  /* "/home/paulb/workspace/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}             # <<<<<<<<<<<<<<
@@ -7403,7 +7383,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":19
+  /* "/home/paulb/workspace/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"]             # <<<<<<<<<<<<<<
@@ -7424,7 +7404,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7439,7 +7419,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7454,7 +7434,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7469,7 +7449,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":23
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -7478,7 +7458,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":24
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":24
  *         self.sent_index = IntList(1000,1000)
  *         self.use_sent_id = use_sent_id
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -7488,7 +7468,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":25
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":25
  *         self.use_sent_id = use_sent_id
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -7510,7 +7490,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":26
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":26
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -7520,7 +7500,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":27
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":27
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             if side:             # <<<<<<<<<<<<<<
@@ -7530,7 +7510,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":28
+      /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":28
  *         elif from_text:
  *             if side:
  *                 self.read_bitext(from_text, (0 if side == 'source' else 1))             # <<<<<<<<<<<<<<
@@ -7539,9 +7519,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
  */
       __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_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 {
@@ -7566,7 +7544,7 @@ static int __pyx_pf_3_sa_9DataArray___cinit__(struct __pyx_obj_3_sa_DataArray *_
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":30
+      /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7615,7 +7593,7 @@ static Py_ssize_t __pyx_pw_3_sa_9DataArray_3__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":32
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":32
  *                 self.read_text(from_text)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -7633,7 +7611,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":33
  * 
  *     def __len__(self):
  *         return len(self.data)             # <<<<<<<<<<<<<<
@@ -7669,7 +7647,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_5get_sentence_id(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":35
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":35
  *         return len(self.data)
  * 
  *     def get_sentence_id(self, i):             # <<<<<<<<<<<<<<
@@ -7687,7 +7665,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":36
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":36
  * 
  *     def get_sentence_id(self, i):
  *         return self.sent_id.arr[i]             # <<<<<<<<<<<<<<
@@ -7725,7 +7703,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7get_sentence(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":38
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":38
  *         return self.sent_id.arr[i]
  * 
  *     def get_sentence(self, i):             # <<<<<<<<<<<<<<
@@ -7750,7 +7728,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":40
  *     def get_sentence(self, i):
  *         cdef int j, start, stop
  *         sent = []             # <<<<<<<<<<<<<<
@@ -7762,7 +7740,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":41
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":41
  *         cdef int j, start, stop
  *         sent = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -7772,7 +7750,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]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":42
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":42
  *         sent = []
  *         start = self.sent_index.arr[i]
  *         stop = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -7785,7 +7763,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]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -7800,7 +7778,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":44
+    /* "/home/paulb/workspace/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]])             # <<<<<<<<<<<<<<
@@ -7815,7 +7793,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;}
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":43
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -7828,7 +7806,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":45
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":45
  *         for i from start <= i < stop:
  *             sent.append(self.id2word[self.data.arr[i]])
  *         return sent             # <<<<<<<<<<<<<<
@@ -7865,7 +7843,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_9get_id(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":47
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":47
  *         return sent
  * 
  *     def get_id(self, word):             # <<<<<<<<<<<<<<
@@ -7885,18 +7863,18 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_id", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":48
+  /* "/home/paulb/workspace/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 = 48; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->word2id, __pyx_v_word))); 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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":49
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -7912,7 +7890,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":50
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":50
  *         if not word in self.word2id:
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)             # <<<<<<<<<<<<<<
@@ -7926,7 +7904,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_8get_id(struct __pyx_obj_3_sa_DataArra
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":51
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":51
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *         return self.word2id[word]             # <<<<<<<<<<<<<<
@@ -7963,7 +7941,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_11__getitem__(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":53
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":53
  *         return self.word2id[word]
  * 
  *     def __getitem__(self, loc):             # <<<<<<<<<<<<<<
@@ -7981,7 +7959,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_10__getitem__(struct __pyx_obj_3_sa_Da
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":54
  * 
  *     def __getitem__(self, loc):
  *         return self.id2word[self.data.arr[loc]]             # <<<<<<<<<<<<<<
@@ -8019,7 +7997,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_13get_sentence_bounds(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":56
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":56
  *         return self.id2word[self.data.arr[loc]]
  * 
  *     def get_sentence_bounds(self, loc):             # <<<<<<<<<<<<<<
@@ -8040,7 +8018,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_12get_sentence_bounds(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_sentence_bounds", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":57
  * 
  *     def get_sentence_bounds(self, loc):
  *         cdef int sid = self.sent_id.arr[loc]             # <<<<<<<<<<<<<<
@@ -8050,7 +8028,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]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":58
+  /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -8109,7 +8087,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_15write_text(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":60
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -8141,7 +8119,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":61
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8181,7 +8159,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":62
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -8199,18 +8177,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
           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 = 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 = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } 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 = 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 = 62; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_1)) {
@@ -8226,19 +8196,20 @@ 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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":63
+            /* "/home/paulb/workspace/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 = 63; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __pyx_t_1 = PyObject_RichCompare(__pyx_v_w_id, __pyx_int_1, Py_GT); 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_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) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":64
+              /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -8275,19 +8246,20 @@ static PyObject *__pyx_pf_3_sa_9DataArray_14write_text(struct __pyx_obj_3_sa_Dat
             }
             __pyx_L18:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":65
+            /* "/home/paulb/workspace/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 = 65; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+            __Pyx_GOTREF(__pyx_t_11);
             __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) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":66
+              /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -8317,7 +8289,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":61
+        /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -8436,7 +8408,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_17read_text(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":68
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":68
  *                     f.write("\n")
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -8464,7 +8436,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":69
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8504,7 +8476,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":70
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -8533,7 +8505,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":69
+        /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8634,11 +8606,11 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
   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;
@@ -8652,10 +8624,12 @@ static PyObject *__pyx_pw_3_sa_9DataArray_19read_bitext(PyObject *__pyx_v_self,
       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--;
+        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_bitext", 1, 2, 2, 1); {__pyx_filename = __pyx_f[3]; __pyx_lineno = 72; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -8686,7 +8660,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 */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":74
+/* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -8762,18 +8736,10 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   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[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 = 74; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 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 = 74; __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)) {
@@ -8828,12 +8794,11 @@ static PyObject *__pyx_gb_3_sa_9DataArray_11read_bitext_2generator6(__pyx_Genera
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":72
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":72
  *             self.read_text_data(fp)
  * 
  *     def read_bitext(self, char* filename, int side):             # <<<<<<<<<<<<<<
@@ -8869,7 +8834,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -8910,7 +8875,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":74
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -8922,7 +8887,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":75
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -8951,7 +8916,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":73
+        /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -9059,7 +9024,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_21read_text_data(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":77
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":77
  *             self.read_text_data(data)
  * 
  *     def read_text_data(self, data):             # <<<<<<<<<<<<<<
@@ -9089,7 +9054,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":78
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":78
  * 
  *     def read_text_data(self, data):
  *         cdef int word_count = 0             # <<<<<<<<<<<<<<
@@ -9098,7 +9063,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
   __pyx_v_word_count = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":79
+  /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -9118,18 +9083,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
   for (;;) {
     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 = 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 = 79; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } 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 = 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 = 79; __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)) {
@@ -9153,7 +9110,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":80
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9167,7 +9124,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":81
+    /* "/home/paulb/workspace/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():             # <<<<<<<<<<<<<<
@@ -9191,18 +9148,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     for (;;) {
       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 = 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 = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++;
       } 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 = 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 = 81; __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)) {
@@ -9218,7 +9167,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":82
+      /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -9241,7 +9190,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":83
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -9250,7 +9199,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
       if (__pyx_v_self->use_sent_id) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":84
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9264,7 +9213,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
       }
       __pyx_L7:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":85
+      /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":85
  *                 if self.use_sent_id:
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -9275,7 +9224,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":86
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":86
  *                     self.sent_id.append(line_num)
  *                 word_count = word_count + 1
  *             self.data.append(1)             # <<<<<<<<<<<<<<
@@ -9286,7 +9235,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":87
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":87
  *                 word_count = word_count + 1
  *             self.data.append(1)
  *             if self.use_sent_id:             # <<<<<<<<<<<<<<
@@ -9295,7 +9244,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
  */
     if (__pyx_v_self->use_sent_id) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":88
+      /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":88
  *             self.data.append(1)
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)             # <<<<<<<<<<<<<<
@@ -9309,7 +9258,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_20read_text_data(struct __pyx_obj_3_sa
     }
     __pyx_L8:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":89
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":89
  *             if self.use_sent_id:
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1             # <<<<<<<<<<<<<<
@@ -9321,7 +9270,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":90
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":90
  *                 self.sent_id.append(line_num)
  *             word_count = word_count + 1
  *         self.data.append(0)             # <<<<<<<<<<<<<<
@@ -9332,7 +9281,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":91
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":91
  *             word_count = word_count + 1
  *         self.data.append(0)
  *         self.sent_index.append(word_count)             # <<<<<<<<<<<<<<
@@ -9387,7 +9336,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_23read_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":94
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":94
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9401,7 +9350,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":96
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":96
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -9410,7 +9359,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":97
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":97
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9419,7 +9368,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":98
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":98
  *         f = fopen(filename, "r")
  *         self.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9434,7 +9383,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_22read_binary(struct __pyx_obj_3_sa_Da
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":100
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":100
  *         fclose(f)
  * 
  *     cdef void read_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9459,7 +9408,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":105
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":105
  *         cdef char* word
  * 
  *         self.data.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9468,7 +9417,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":106
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":106
  * 
  *         self.data.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -9477,7 +9426,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":107
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9486,7 +9435,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":108
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9495,7 +9444,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":109
+  /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -9506,7 +9455,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":110
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9515,7 +9464,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":111
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -9524,7 +9473,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":112
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9533,7 +9482,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":113
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9552,7 +9501,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":114
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9566,7 +9515,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":115
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":115
  *             self.word2id[word] = len(self.id2word)
  *             self.id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -9576,7 +9525,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
     free(__pyx_v_word);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":116
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":116
  *             self.id2word.append(word)
  *             free(word)
  *         if len(self.sent_id) == 0:             # <<<<<<<<<<<<<<
@@ -9590,7 +9539,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":117
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":117
  *             free(word)
  *         if len(self.sent_id) == 0:
  *             self.use_sent_id = False             # <<<<<<<<<<<<<<
@@ -9602,7 +9551,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":119
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":119
  *             self.use_sent_id = False
  *         else:
  *             self.use_sent_id = True             # <<<<<<<<<<<<<<
@@ -9622,7 +9571,7 @@ static void __pyx_f_3_sa_9DataArray_read_handle(struct __pyx_obj_3_sa_DataArray
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":121
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":121
  *             self.use_sent_id = True
  * 
  *     cdef void write_handle(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -9646,7 +9595,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":125
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":125
  *         cdef int num_words
  * 
  *         self.data.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9655,7 +9604,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":126
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":126
  * 
  *         self.data.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9664,7 +9613,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":127
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9673,7 +9622,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":128
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -9686,7 +9635,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":129
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9695,7 +9644,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":130
+  /* "/home/paulb/workspace/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:]:             # <<<<<<<<<<<<<<
@@ -9716,18 +9665,10 @@ static void __pyx_f_3_sa_9DataArray_write_handle(struct __pyx_obj_3_sa_DataArray
   for (;;) {
     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 = 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 = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } 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 = 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 = 130; __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)) {
@@ -9743,7 +9684,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":131
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -9753,7 +9694,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":132
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9762,7 +9703,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/pauldb/workspace/cdec/python/src/sa/data_array.pxi":133
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -9805,7 +9746,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_25write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":135
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":135
  *             fwrite(<char *>word, sizeof(char), word_len, f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -9819,7 +9760,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_24write_binary(struct __pyx_obj_3_sa_D
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":137
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":137
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -9828,7 +9769,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":138
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":138
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.write_handle(f)             # <<<<<<<<<<<<<<
@@ -9837,7 +9778,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":139
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":139
  *         f = fopen(filename, "w")
  *         self.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -9863,7 +9804,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_27write_enhanced_handle(PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":141
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":141
  *         fclose(f)
  * 
  *     def write_enhanced_handle(self, f):             # <<<<<<<<<<<<<<
@@ -9887,7 +9828,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced_handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":142
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":142
  * 
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:             # <<<<<<<<<<<<<<
@@ -9905,18 +9846,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   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[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 = 142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 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 = 142; __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)) {
@@ -9932,7 +9865,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":143
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":143
  *     def write_enhanced_handle(self, f):
  *         for i in self.data:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -9956,7 +9889,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -9970,7 +9903,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":145
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":145
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -9988,18 +9921,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   for (;;) {
     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 = 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 = 145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
     } 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 = 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 = 145; __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)) {
@@ -10015,7 +9940,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":146
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":146
  *         f.write("\n")
  *         for i in self.sent_index:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -10039,7 +9964,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -10053,7 +9978,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":148
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":148
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for i in self.sent_id:             # <<<<<<<<<<<<<<
@@ -10071,18 +9996,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   for (;;) {
     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 = 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 = 148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } 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 = 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 = 148; __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)) {
@@ -10098,7 +10015,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_i = __pyx_t_5;
     __pyx_t_5 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":149
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":149
  *         f.write("\n")
  *         for i in self.sent_id:
  *             f.write("%d " %i)             # <<<<<<<<<<<<<<
@@ -10122,7 +10039,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -10136,7 +10053,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":151
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":151
  *             f.write("%d " %i)
  *         f.write("\n")
  *         for word in self.id2word:             # <<<<<<<<<<<<<<
@@ -10154,18 +10071,10 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   for (;;) {
     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 = 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 = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } 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 = 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 = 151; __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)) {
@@ -10181,7 +10090,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
     __pyx_v_word = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":152
+    /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":152
  *         f.write("\n")
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))             # <<<<<<<<<<<<<<
@@ -10216,7 +10125,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_26write_enhanced_handle(struct __pyx_o
   }
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":153
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -10268,7 +10177,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_29write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":155
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":155
  *         f.write("\n")
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -10296,7 +10205,7 @@ static PyObject *__pyx_pf_3_sa_9DataArray_28write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":156
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10335,7 +10244,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":157
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -10365,7 +10274,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":156
+        /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -10471,7 +10380,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7word2id_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":10
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":10
  * 
  * cdef class DataArray:
  *     cdef public word2id             # <<<<<<<<<<<<<<
@@ -10558,7 +10467,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7id2word_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":11
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":11
  * cdef class DataArray:
  *     cdef public word2id
  *     cdef public id2word             # <<<<<<<<<<<<<<
@@ -10645,7 +10554,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_4data_1__get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":12
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":12
  *     cdef public word2id
  *     cdef public id2word
  *     cdef public IntList data             # <<<<<<<<<<<<<<
@@ -10741,7 +10650,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_7sent_id_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":13
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":13
  *     cdef public id2word
  *     cdef public IntList data
  *     cdef public IntList sent_id             # <<<<<<<<<<<<<<
@@ -10837,7 +10746,7 @@ static PyObject *__pyx_pw_3_sa_9DataArray_10sent_index_1__get__(PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":14
+/* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":14
  *     cdef public IntList data
  *     cdef public IntList sent_id
  *     cdef public IntList sent_index             # <<<<<<<<<<<<<<
@@ -10922,7 +10831,7 @@ static int __pyx_pf_3_sa_9DataArray_10sent_index_4__del__(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":12
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":12
  *     cdef IntList sent_index
  * 
  *     cdef int link(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -10935,7 +10844,7 @@ static int __pyx_f_3_sa_9Alignment_link(CYTHON_UNUSED struct __pyx_obj_3_sa_Alig
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("link", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":14
  *     cdef int link(self, int i, int j):
  *         """Integerizes an alignment link pair"""
  *         return i*65536 + j             # <<<<<<<<<<<<<<
@@ -10963,7 +10872,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_1unlink(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":16
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":16
  *         return i*65536 + j
  * 
  *     def unlink(self, link):             # <<<<<<<<<<<<<<
@@ -10982,7 +10891,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("unlink", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":18
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":18
  *     def unlink(self, link):
  *         """De-integerizes an alignment link pair"""
  *         return (link/65536, link%65536)             # <<<<<<<<<<<<<<
@@ -11020,7 +10929,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_unlink(CYTHON_UNUSED struct __pyx_obj_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":20
  *         return (link/65536, link%65536)
  * 
  *     cdef _unlink(self, int link, int* f, int* e):             # <<<<<<<<<<<<<<
@@ -11033,7 +10942,7 @@ static PyObject *__pyx_f_3_sa_9Alignment__unlink(CYTHON_UNUSED struct __pyx_obj_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_unlink", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":21
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":21
  * 
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536             # <<<<<<<<<<<<<<
@@ -11042,7 +10951,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":22
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":22
  *     cdef _unlink(self, int link, int* f, int* e):
  *         f[0] = link/65536
  *         e[0] = link%65536             # <<<<<<<<<<<<<<
@@ -11078,7 +10987,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_3get_sent_links(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":24
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":24
  *         e[0] = link%65536
  * 
  *     def get_sent_links(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -11098,7 +11007,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":28
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":28
  *         cdef int* arr
  *         cdef int arr_len
  *         sent_links = IntList()             # <<<<<<<<<<<<<<
@@ -11110,7 +11019,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":29
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":29
  *         cdef int arr_len
  *         sent_links = IntList()
  *         arr = self._get_sent_links(sent_id, &arr_len)             # <<<<<<<<<<<<<<
@@ -11119,7 +11028,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));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":30
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -11128,7 +11037,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));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":31
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -11137,7 +11046,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
  */
   free(__pyx_v_arr);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":32
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":32
  *         sent_links._extend_arr(arr, arr_len*2)
  *         free(arr)
  *         return sent_links             # <<<<<<<<<<<<<<
@@ -11162,7 +11071,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_2get_sent_links(struct __pyx_obj_3_sa_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":34
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":34
  *         return sent_links
  * 
  *     cdef int* _get_sent_links(self, int sent_id, int* num_links):             # <<<<<<<<<<<<<<
@@ -11184,7 +11093,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":37
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":37
  *         cdef int* sent_links
  *         cdef int i, start, end
  *         start = self.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -11193,7 +11102,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":38
+  /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -11202,7 +11111,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":39
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -11211,7 +11120,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":40
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -11220,7 +11129,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":41
+  /* "/home/paulb/workspace/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]:             # <<<<<<<<<<<<<<
@@ -11230,7 +11139,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":42
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -11242,7 +11151,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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":43
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -11268,14 +11177,14 @@ static int __pyx_pw_3_sa_9Alignment_5__cinit__(PyObject *__pyx_v_self, PyObject
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":45
+    /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":45
  *         return sent_links
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):             # <<<<<<<<<<<<<<
@@ -11345,7 +11254,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -11360,7 +11269,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -11375,7 +11284,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":48
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":48
  *         self.links = IntList(1000,1000)
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -11385,7 +11294,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":49
+    /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":49
  *         self.sent_index = IntList(1000,1000)
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -11407,7 +11316,7 @@ static int __pyx_pf_3_sa_9Alignment_4__cinit__(struct __pyx_obj_3_sa_Alignment *
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":50
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":50
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -11417,7 +11326,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":51
+    /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":51
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
@@ -11474,7 +11383,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_7read_text(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":53
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":53
  *             self.read_text(from_text)
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11516,7 +11425,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -11556,7 +11465,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":55
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":55
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -11574,18 +11483,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
           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
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } 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
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
               __pyx_t_2 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_2)) {
@@ -11601,7 +11502,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":56
+            /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -11619,7 +11520,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":57
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":57
  *             for line in f:
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()             # <<<<<<<<<<<<<<
@@ -11635,7 +11536,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":58
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":58
  *                 self.sent_index.append(len(self.links))
  *                 pairs = line.split()
  *                 for pair in pairs:             # <<<<<<<<<<<<<<
@@ -11653,18 +11554,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
             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
+                __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
               } 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
+                __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
               } else {
                 __pyx_t_3 = __pyx_t_11(__pyx_t_2);
                 if (unlikely(!__pyx_t_3)) {
@@ -11680,7 +11573,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;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":59
+              /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -11705,33 +11598,27 @@ 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;
               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_L7_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[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_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);
-                #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_GOTREF(__pyx_t_14);
@@ -11742,13 +11629,12 @@ static PyObject *__pyx_pf_3_sa_9Alignment_6read_text(struct __pyx_obj_3_sa_Align
                 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_L7_error;}
-                __pyx_t_15 = NULL;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
                 goto __pyx_L21_unpacking_done;
                 __pyx_L20_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
-                __pyx_t_15 = 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[4]; __pyx_lineno = 59; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
                 __pyx_L21_unpacking_done:;
               }
@@ -11759,7 +11645,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;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":60
+              /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":60
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))
  *                     self.links.append(self.link(i, j))             # <<<<<<<<<<<<<<
@@ -11779,7 +11665,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":61
+          /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -11809,7 +11695,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":54
+        /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -11933,7 +11819,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_9read_binary(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":63
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":63
  *             self.sent_index.append(len(self.links))
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -11947,7 +11833,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_8read_binary(struct __pyx_obj_3_sa_Ali
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":65
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":65
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -11956,7 +11842,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":66
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":66
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)             # <<<<<<<<<<<<<<
@@ -11965,7 +11851,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":67
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":67
  *         f = fopen(filename, "r")
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -11974,7 +11860,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":68
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":68
  *         self.links.read_handle(f)
  *         self.sent_index.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -12010,7 +11896,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_11write_text(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":70
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":70
  *         fclose(f)
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12045,7 +11931,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12085,7 +11971,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":72
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":72
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 0             # <<<<<<<<<<<<<<
@@ -12095,7 +11981,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":73
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":73
  *         with open(filename, "w") as f:
  *             sent_num = 0
  *             for i, link in enumerate(self.links):             # <<<<<<<<<<<<<<
@@ -12115,18 +12001,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
           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
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } 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
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
               __pyx_t_2 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_2)) {
@@ -12150,7 +12028,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":74
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":74
  *             sent_num = 0
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:             # <<<<<<<<<<<<<<
@@ -12160,13 +12038,14 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
             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_t_10 = PyObject_RichCompare(__pyx_v_i, __pyx_t_2, Py_GE); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 74; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_10);
               __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/pauldb/workspace/cdec/python/src/sa/alignment.pxi":75
+              /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -12180,7 +12059,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;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":76
+              /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":76
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")
  *                     sent_num = sent_num + 1             # <<<<<<<<<<<<<<
@@ -12194,7 +12073,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_10write_text(struct __pyx_obj_3_sa_Ali
               __pyx_t_2 = 0;
             }
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":77
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":77
  *                     f.write("\n")
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))             # <<<<<<<<<<<<<<
@@ -12231,7 +12110,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":78
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -12257,7 +12136,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":71
+        /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12379,7 +12258,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_13write_binary(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":80
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":80
  *             f.write("\n")
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12393,7 +12272,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_12write_binary(struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":82
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":82
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -12402,7 +12281,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":83
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":83
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)             # <<<<<<<<<<<<<<
@@ -12411,7 +12290,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":84
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":84
  *         f = fopen(filename, "w")
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -12420,7 +12299,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":85
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":85
  *         self.links.write_handle(f)
  *         self.sent_index.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -12456,7 +12335,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_15write_enhanced(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":87
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":87
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -12489,7 +12368,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12529,7 +12408,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":89
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":89
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:
  *             sent_num = 1             # <<<<<<<<<<<<<<
@@ -12538,7 +12417,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
  */
           __pyx_v_sent_num = 1;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":90
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":90
  *         with open(filename, "w") as f:
  *             sent_num = 1
  *             for link in self.links:             # <<<<<<<<<<<<<<
@@ -12556,18 +12435,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           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
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } 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
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_1)) {
@@ -12583,7 +12454,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":91
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":91
  *             sent_num = 1
  *             for link in self.links:
  *                 f.write("%d " % link)             # <<<<<<<<<<<<<<
@@ -12607,7 +12478,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":92
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -12621,7 +12492,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":93
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":93
  *                 f.write("%d " % link)
  *             f.write("\n")
  *             for i in self.sent_index:             # <<<<<<<<<<<<<<
@@ -12639,18 +12510,10 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           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
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++;
             } 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
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++;
             } else {
               __pyx_t_4 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_4)) {
@@ -12666,7 +12529,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":94
+            /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":94
  *             f.write("\n")
  *             for i in self.sent_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
@@ -12690,7 +12553,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_14write_enhanced(struct __pyx_obj_3_sa
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":95
+          /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -12714,7 +12577,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":88
+        /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -12824,7 +12687,7 @@ static PyObject *__pyx_pw_3_sa_9Alignment_17alignment(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":97
+/* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":97
  *             f.write("\n")
  * 
  *     def alignment(self, i):             # <<<<<<<<<<<<<<
@@ -12850,7 +12713,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("alignment", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":100
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":100
  *         """Return all (e,f) pairs for sentence i"""
  *         cdef int j, start, end
  *         result = []             # <<<<<<<<<<<<<<
@@ -12862,7 +12725,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":101
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":101
  *         cdef int j, start, end
  *         result = []
  *         start = self.sent_index.arr[i]             # <<<<<<<<<<<<<<
@@ -12872,7 +12735,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]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":102
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":102
  *         result = []
  *         start = self.sent_index.arr[i]
  *         end = self.sent_index.arr[i+1]             # <<<<<<<<<<<<<<
@@ -12885,7 +12748,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]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":103
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -12895,7 +12758,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":104
+    /* "/home/paulb/workspace/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]))             # <<<<<<<<<<<<<<
@@ -12918,7 +12781,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":105
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":105
  *         for j from start <= j < end:
  *             result.append(self.unlink(self.links.arr[j]))
  *         return result             # <<<<<<<<<<<<<<
@@ -12943,7 +12806,7 @@ static PyObject *__pyx_pf_3_sa_9Alignment_16alignment(struct __pyx_obj_3_sa_Alig
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":15
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":15
  *     int val
  * 
  * cdef _node* new_node(int key):             # <<<<<<<<<<<<<<
@@ -12957,7 +12820,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":17
  * cdef _node* new_node(int key):
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))             # <<<<<<<<<<<<<<
@@ -12966,7 +12829,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":18
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":18
  *     cdef _node* n
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL             # <<<<<<<<<<<<<<
@@ -12975,7 +12838,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->smaller = NULL;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":19
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":19
  *     n = <_node*> malloc(sizeof(_node))
  *     n.smaller = NULL
  *     n.bigger = NULL             # <<<<<<<<<<<<<<
@@ -12984,7 +12847,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->bigger = NULL;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":20
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":20
  *     n.smaller = NULL
  *     n.bigger = NULL
  *     n.key = key             # <<<<<<<<<<<<<<
@@ -12993,7 +12856,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":21
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":21
  *     n.bigger = NULL
  *     n.key = key
  *     n.val = 0             # <<<<<<<<<<<<<<
@@ -13002,7 +12865,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
  */
   __pyx_v_n->val = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":22
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":22
  *     n.key = key
  *     n.val = 0
  *     return n             # <<<<<<<<<<<<<<
@@ -13018,7 +12881,7 @@ static struct __pyx_t_3_sa__node *__pyx_f_3_sa_new_node(int __pyx_v_key) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":25
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":25
  * 
  * 
  * cdef del_node(_node* n):             # <<<<<<<<<<<<<<
@@ -13036,7 +12899,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":26
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":26
  * 
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:             # <<<<<<<<<<<<<<
@@ -13046,7 +12909,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":27
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":27
  * cdef del_node(_node* n):
  *     if n.smaller != NULL:
  *         del_node(n.smaller)             # <<<<<<<<<<<<<<
@@ -13060,7 +12923,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":28
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":28
  *     if n.smaller != NULL:
  *         del_node(n.smaller)
  *     if n.bigger != NULL:             # <<<<<<<<<<<<<<
@@ -13070,7 +12933,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":29
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":29
  *         del_node(n.smaller)
  *     if n.bigger != NULL:
  *         del_node(n.bigger)             # <<<<<<<<<<<<<<
@@ -13084,7 +12947,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":30
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":30
  *     if n.bigger != NULL:
  *         del_node(n.bigger)
  *     free(n)             # <<<<<<<<<<<<<<
@@ -13105,7 +12968,7 @@ static PyObject *__pyx_f_3_sa_del_node(struct __pyx_t_3_sa__node *__pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":32
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":32
  *     free(n)
  * 
  * cdef int* get_val(_node* n, int key):             # <<<<<<<<<<<<<<
@@ -13119,7 +12982,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":33
  * 
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:             # <<<<<<<<<<<<<<
@@ -13129,7 +12992,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":34
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":34
  * cdef int* get_val(_node* n, int key):
  *     if key == n.key:
  *         return &n.val             # <<<<<<<<<<<<<<
@@ -13141,7 +13004,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":35
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":35
  *     if key == n.key:
  *         return &n.val
  *     elif key < n.key:             # <<<<<<<<<<<<<<
@@ -13151,7 +13014,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":36
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":36
  *         return &n.val
  *     elif key < n.key:
  *         if n.smaller == NULL:             # <<<<<<<<<<<<<<
@@ -13161,7 +13024,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":37
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":37
  *     elif key < n.key:
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)             # <<<<<<<<<<<<<<
@@ -13170,7 +13033,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":38
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":38
  *         if n.smaller == NULL:
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)             # <<<<<<<<<<<<<<
@@ -13183,7 +13046,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":39
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":39
  *             n.smaller = new_node(key)
  *             return &(n.smaller.val)
  *         return get_val(n.smaller, key)             # <<<<<<<<<<<<<<
@@ -13196,7 +13059,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":41
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":41
  *         return get_val(n.smaller, key)
  *     else:
  *         if n.bigger == NULL:             # <<<<<<<<<<<<<<
@@ -13206,7 +13069,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":42
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":42
  *     else:
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)             # <<<<<<<<<<<<<<
@@ -13215,7 +13078,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":43
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":43
  *         if n.bigger == NULL:
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)             # <<<<<<<<<<<<<<
@@ -13228,7 +13091,7 @@ static int *__pyx_f_3_sa_get_val(struct __pyx_t_3_sa__node *__pyx_v_n, int __pyx
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":44
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":44
  *             n.bigger = new_node(key)
  *             return &(n.bigger.val)
  *         return get_val(n.bigger, key)             # <<<<<<<<<<<<<<
@@ -13255,14 +13118,14 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   PyObject *__pyx_v_earray = 0;
   PyObject *__pyx_v_fsarray = 0;
   PyObject *__pyx_v_alignment = 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};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":54
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -13273,7 +13136,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":55
+    /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -13364,7 +13227,7 @@ static int __pyx_pw_3_sa_5BiLex_1__cinit__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":54
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -13385,7 +13248,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":56
+  /* "/home/paulb/workspace/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 = []             # <<<<<<<<<<<<<<
@@ -13400,7 +13263,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":57
  *             earray=None, fsarray=None, alignment=None):
  *         self.id2eword = []
  *         self.id2fword = []             # <<<<<<<<<<<<<<
@@ -13415,7 +13278,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":58
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":58
  *         self.id2eword = []
  *         self.id2fword = []
  *         self.eword2id = {}             # <<<<<<<<<<<<<<
@@ -13430,7 +13293,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":59
  *         self.id2fword = []
  *         self.eword2id = {}
  *         self.fword2id = {}             # <<<<<<<<<<<<<<
@@ -13445,7 +13308,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":60
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":60
  *         self.eword2id = {}
  *         self.fword2id = {}
  *         self.e_index = IntList()             # <<<<<<<<<<<<<<
@@ -13460,7 +13323,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":61
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":61
  *         self.fword2id = {}
  *         self.e_index = IntList()
  *         self.f_index = IntList()             # <<<<<<<<<<<<<<
@@ -13475,7 +13338,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":62
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":62
  *         self.e_index = IntList()
  *         self.f_index = IntList()
  *         self.col1 = FloatList()             # <<<<<<<<<<<<<<
@@ -13490,7 +13353,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":63
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":63
  *         self.f_index = IntList()
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()             # <<<<<<<<<<<<<<
@@ -13505,7 +13368,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":64
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":64
  *         self.col1 = FloatList()
  *         self.col2 = FloatList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -13515,7 +13378,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":65
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":65
  *         self.col2 = FloatList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -13537,7 +13400,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":66
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":66
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_data:             # <<<<<<<<<<<<<<
@@ -13547,7 +13410,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":67
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":67
  *             self.read_binary(from_binary)
  *         elif from_data:
  *             self.compute_from_data(fsarray, earray, alignment)             # <<<<<<<<<<<<<<
@@ -13573,7 +13436,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":69
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":69
  *             self.compute_from_data(fsarray, earray, alignment)
  *         else:
  *             self.read_text(from_text)             # <<<<<<<<<<<<<<
@@ -13609,7 +13472,7 @@ static int __pyx_pf_3_sa_5BiLex___cinit__(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":72
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":72
  * 
  * 
  *     cdef compute_from_data(self, SuffixArray fsa, DataArray eda, Alignment aa):             # <<<<<<<<<<<<<<
@@ -13663,7 +13526,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":79
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":79
  *         cdef int null_word
  * 
  *         null_word = 0             # <<<<<<<<<<<<<<
@@ -13672,7 +13535,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_null_word = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":80
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":80
  * 
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions             # <<<<<<<<<<<<<<
@@ -13690,18 +13553,10 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   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[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 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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[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)) {
@@ -13717,7 +13572,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":81
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":81
  *         null_word = 0
  *         for word in fsa.darray.id2word: # I miss list comprehensions
  *             self.id2fword.append(word)             # <<<<<<<<<<<<<<
@@ -13730,7 +13585,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":82
+  /* "/home/paulb/workspace/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"             # <<<<<<<<<<<<<<
@@ -13739,7 +13594,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":83
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":83
  *             self.id2fword.append(word)
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):             # <<<<<<<<<<<<<<
@@ -13759,18 +13614,10 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   for (;;) {
     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_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
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } 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_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)) {
@@ -13794,7 +13641,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":84
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":84
  *         self.id2fword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2fword):
  *             self.fword2id[word] = id             # <<<<<<<<<<<<<<
@@ -13806,7 +13653,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":86
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":86
  *             self.fword2id[word] = id
  * 
  *         for word in eda.id2word:             # <<<<<<<<<<<<<<
@@ -13824,18 +13671,10 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   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[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 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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[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)) {
@@ -13851,7 +13690,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":87
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":87
  * 
  *         for word in eda.id2word:
  *             self.id2eword.append(word)             # <<<<<<<<<<<<<<
@@ -13864,7 +13703,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":88
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":88
  *         for word in eda.id2word:
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"             # <<<<<<<<<<<<<<
@@ -13873,7 +13712,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":89
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":89
  *             self.id2eword.append(word)
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -13893,18 +13732,10 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   for (;;) {
     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_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
+      __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_2); __Pyx_INCREF(__pyx_t_5); __pyx_t_2++;
     } 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_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)) {
@@ -13928,7 +13759,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":90
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":90
  *         self.id2eword[null_word] = "NULL"
  *         for id, word in enumerate(self.id2eword):
  *             self.eword2id[word] = id             # <<<<<<<<<<<<<<
@@ -13940,7 +13771,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":92
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":92
  *             self.eword2id[word] = id
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -13949,7 +13780,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":94
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":94
  *         num_pairs = 0
  * 
  *         V_E = len(eda.id2word)             # <<<<<<<<<<<<<<
@@ -13962,7 +13793,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":95
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":95
  * 
  *         V_E = len(eda.id2word)
  *         V_F = len(fsa.darray.id2word)             # <<<<<<<<<<<<<<
@@ -13975,7 +13806,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":96
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -13984,7 +13815,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":97
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -13993,7 +13824,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":98
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14002,7 +13833,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":99
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14011,7 +13842,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":101
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":101
  *         memset(emargin, 0, V_E*sizeof(int))
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -14020,7 +13851,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":102
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":102
  * 
  *         dict = <_node**> malloc(V_F*sizeof(_node*))
  *         memset(dict, 0, V_F*sizeof(_node*))             # <<<<<<<<<<<<<<
@@ -14029,7 +13860,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":104
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":104
  *         memset(dict, 0, V_F*sizeof(_node*))
  * 
  *         num_sents = len(fsa.darray.sent_index)             # <<<<<<<<<<<<<<
@@ -14045,7 +13876,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":105
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":105
  * 
  *         num_sents = len(fsa.darray.sent_index)
  *         for sent_id from 0 <= sent_id < num_sents-1:             # <<<<<<<<<<<<<<
@@ -14058,7 +13889,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":107
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -14067,7 +13898,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":108
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14076,7 +13907,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":109
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14085,7 +13916,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":110
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14094,7 +13925,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":112
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":112
  *             memset(faligned, 0, I*sizeof(int))
  * 
  *             esent = eda.data.arr + eda.sent_index.arr[sent_id]             # <<<<<<<<<<<<<<
@@ -14103,7 +13934,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":113
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14112,7 +13943,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":114
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14121,7 +13952,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":115
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14130,7 +13961,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":117
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":117
  *             memset(ealigned, 0, J*sizeof(int))
  * 
  *             links = aa._get_sent_links(sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -14139,7 +13970,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":119
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":119
  *             links = aa._get_sent_links(sent_id, &num_links)
  * 
  *             for l from 0 <= l < num_links:             # <<<<<<<<<<<<<<
@@ -14149,7 +13980,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":120
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":120
  * 
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]             # <<<<<<<<<<<<<<
@@ -14158,7 +13989,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":121
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":121
  *             for l from 0 <= l < num_links:
  *                 i = links[l*2]
  *                 j = links[l*2+1]             # <<<<<<<<<<<<<<
@@ -14167,7 +13998,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":122
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":122
  *                 i = links[l*2]
  *                 j = links[l*2+1]
  *                 if i >= I or j >= J:             # <<<<<<<<<<<<<<
@@ -14183,7 +14014,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       if (__pyx_t_10) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":123
+        /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -14235,7 +14066,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L15:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":124
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -14244,7 +14075,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":125
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -14253,7 +14084,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":126
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":126
  *                 f_i = fsent[i]
  *                 e_j = esent[j]
  *                 fmargin[f_i] = fmargin[f_i]+1             # <<<<<<<<<<<<<<
@@ -14262,7 +14093,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":127
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14271,7 +14102,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":128
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -14281,7 +14112,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":129
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14290,7 +14121,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":130
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":130
  *                 if dict[f_i] == NULL:
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -14299,7 +14130,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":131
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":131
  *                     dict[f_i] = new_node(e_j)
  *                     dict[f_i].val = 1
  *                     num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14311,7 +14142,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":133
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":133
  *                     num_pairs = num_pairs + 1
  *                 else:
  *                     count = get_val(dict[f_i], e_j)             # <<<<<<<<<<<<<<
@@ -14320,7 +14151,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":134
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":134
  *                 else:
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -14330,7 +14161,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":135
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":135
  *                     count = get_val(dict[f_i], e_j)
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14342,7 +14173,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         __pyx_L17:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":136
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":136
  *                     if count[0] == 0:
  *                         num_pairs = num_pairs + 1
  *                     count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -14353,7 +14184,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       }
       __pyx_L16:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":138
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":138
  *                     count[0] = count[0] + 1
  *                 # add count
  *                 faligned[i] = 1             # <<<<<<<<<<<<<<
@@ -14362,7 +14193,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":139
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":139
  *                 # add count
  *                 faligned[i] = 1
  *                 ealigned[j] = 1             # <<<<<<<<<<<<<<
@@ -14372,7 +14203,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":140
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":140
  *                 faligned[i] = 1
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:             # <<<<<<<<<<<<<<
@@ -14382,7 +14213,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":141
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":141
  *                 ealigned[j] = 1
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:             # <<<<<<<<<<<<<<
@@ -14392,7 +14223,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":142
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":142
  *             for i from 0 <= i < I:
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]             # <<<<<<<<<<<<<<
@@ -14401,7 +14232,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":143
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":143
  *                 if faligned[i] == 0:
  *                     f_i = fsent[i]
  *                     fmargin[f_i] = fmargin[f_i] + 1             # <<<<<<<<<<<<<<
@@ -14410,7 +14241,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":144
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14419,7 +14250,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":145
+        /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -14429,7 +14260,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":146
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14438,7 +14269,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":147
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":147
  *                     if dict[f_i] == NULL:
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1             # <<<<<<<<<<<<<<
@@ -14447,7 +14278,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":148
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":148
  *                         dict[f_i] = new_node(null_word)
  *                         dict[f_i].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14459,7 +14290,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":150
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":150
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[f_i], null_word)             # <<<<<<<<<<<<<<
@@ -14468,7 +14299,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":151
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":151
  *                     else:
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -14478,7 +14309,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":152
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":152
  *                         count = get_val(dict[f_i], null_word)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14490,7 +14321,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L22:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":153
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":153
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -14505,7 +14336,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L20:;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":154
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":154
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:             # <<<<<<<<<<<<<<
@@ -14515,7 +14346,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":155
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":155
  *                         count[0] = count[0] + 1
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:             # <<<<<<<<<<<<<<
@@ -14525,7 +14356,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":156
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":156
  *             for j from 0 <= j < J:
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]             # <<<<<<<<<<<<<<
@@ -14534,7 +14365,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":157
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":157
  *                 if ealigned[j] == 0:
  *                     e_j = esent[j]
  *                     fmargin[null_word] = fmargin[null_word] + 1             # <<<<<<<<<<<<<<
@@ -14543,7 +14374,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":158
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14552,7 +14383,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":159
+        /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -14562,7 +14393,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":160
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14571,7 +14402,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":161
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":161
  *                     if dict[null_word] == NULL:
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1             # <<<<<<<<<<<<<<
@@ -14580,7 +14411,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":162
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":162
  *                         dict[null_word] = new_node(e_j)
  *                         dict[null_word].val = 1
  *                         num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14592,7 +14423,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":164
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":164
  *                         num_pairs = num_pairs + 1
  *                     else:
  *                         count = get_val(dict[null_word], e_j)             # <<<<<<<<<<<<<<
@@ -14601,7 +14432,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":165
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":165
  *                     else:
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:             # <<<<<<<<<<<<<<
@@ -14611,7 +14442,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":166
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":166
  *                         count = get_val(dict[null_word], e_j)
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1             # <<<<<<<<<<<<<<
@@ -14623,7 +14454,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
           }
           __pyx_L27:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":167
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":167
  *                         if count[0] == 0:
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1             # <<<<<<<<<<<<<<
@@ -14638,7 +14469,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
       __pyx_L25:;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":168
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":168
  *                             num_pairs = num_pairs + 1
  *                         count[0] = count[0] + 1
  *             free(links)             # <<<<<<<<<<<<<<
@@ -14647,7 +14478,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_links);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":169
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":169
  *                         count[0] = count[0] + 1
  *             free(links)
  *             free(faligned)             # <<<<<<<<<<<<<<
@@ -14656,7 +14487,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
     free(__pyx_v_faligned);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":170
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":170
  *             free(links)
  *             free(faligned)
  *             free(ealigned)             # <<<<<<<<<<<<<<
@@ -14666,7 +14497,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     free(__pyx_v_ealigned);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":171
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":171
  *             free(faligned)
  *             free(ealigned)
  *         self.f_index = IntList(initial_len=V_F)             # <<<<<<<<<<<<<<
@@ -14688,7 +14519,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":172
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14710,7 +14541,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":173
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14732,7 +14563,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":174
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14754,7 +14585,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":176
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":176
  *         self.col2 = FloatList(initial_len=num_pairs)
  * 
  *         num_pairs = 0             # <<<<<<<<<<<<<<
@@ -14763,7 +14594,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   __pyx_v_num_pairs = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":177
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":177
  * 
  *         num_pairs = 0
  *         for i from 0 <= i < V_F:             # <<<<<<<<<<<<<<
@@ -14773,7 +14604,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":179
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14782,7 +14613,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":180
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":180
  *             #self.f_index[i] = num_pairs
  *             self.f_index.set(i, num_pairs)
  *             if dict[i] != NULL:             # <<<<<<<<<<<<<<
@@ -14792,7 +14623,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":181
+      /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14803,7 +14634,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":182
+      /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -14818,7 +14649,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
     __pyx_L30:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":183
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":183
  *                 self._add_node(dict[i], &num_pairs, float(fmargin[i]), emargin)
  *                 del_node(dict[i])
  *         free(fmargin)             # <<<<<<<<<<<<<<
@@ -14827,7 +14658,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_fmargin);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":184
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":184
  *                 del_node(dict[i])
  *         free(fmargin)
  *         free(emargin)             # <<<<<<<<<<<<<<
@@ -14836,7 +14667,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_emargin);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":185
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":185
  *         free(fmargin)
  *         free(emargin)
  *         free(dict)             # <<<<<<<<<<<<<<
@@ -14845,7 +14676,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
  */
   free(__pyx_v_dict);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":186
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":186
  *         free(emargin)
  *         free(dict)
  *         return             # <<<<<<<<<<<<<<
@@ -14876,7 +14707,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_compute_from_data(struct __pyx_obj_3_sa_BiL
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":189
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":189
  * 
  * 
  *     cdef _add_node(self, _node* n, int* num_pairs, float fmargin, int* emargin):             # <<<<<<<<<<<<<<
@@ -14895,7 +14726,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":191
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -14905,7 +14736,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":192
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":192
  *         cdef int loc
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)             # <<<<<<<<<<<<<<
@@ -14919,7 +14750,7 @@ static PyObject *__pyx_f_3_sa_5BiLex__add_node(struct __pyx_obj_3_sa_BiLex *__py
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":193
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":193
  *         if n.smaller != NULL:
  *             self._add_node(n.smaller, num_pairs, fmargin, emargin)
  *         loc = num_pairs[0]             # <<<<<<<<<<<<<<
@@ -14928,7 +14759,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":194
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14937,7 +14768,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":195
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -14950,7 +14781,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":196
+  /* "/home/paulb/workspace/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]))             # <<<<<<<<<<<<<<
@@ -14963,7 +14794,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":197
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -14972,7 +14803,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":198
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -14982,7 +14813,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":199
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15029,7 +14860,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_3write_binary(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":202
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":202
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15048,7 +14879,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":204
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":204
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -15057,7 +14888,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":205
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":205
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -15066,7 +14897,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":206
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":206
  *         f = fopen(filename, "w")
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)             # <<<<<<<<<<<<<<
@@ -15075,7 +14906,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":207
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":207
  *         self.f_index.write_handle(f)
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)             # <<<<<<<<<<<<<<
@@ -15084,7 +14915,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":208
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":208
  *         self.e_index.write_handle(f)
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)             # <<<<<<<<<<<<<<
@@ -15093,7 +14924,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":209
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":209
  *         self.col1.write_handle(f)
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)             # <<<<<<<<<<<<<<
@@ -15107,7 +14938,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":210
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":210
  *         self.col2.write_handle(f)
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)             # <<<<<<<<<<<<<<
@@ -15121,7 +14952,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":211
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":211
  *         self.write_wordlist(self.id2fword, f)
  *         self.write_wordlist(self.id2eword, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -15143,7 +14974,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_2write_binary(struct __pyx_obj_3_sa_BiLex
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":214
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":214
  * 
  * 
  *     cdef write_wordlist(self, wordlist, FILE* f):             # <<<<<<<<<<<<<<
@@ -15168,7 +14999,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_wordlist", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":218
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":218
  *         cdef int num_words
  * 
  *         num_words = len(wordlist)             # <<<<<<<<<<<<<<
@@ -15178,7 +15009,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":219
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":219
  * 
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -15187,7 +15018,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":220
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":220
  *         num_words = len(wordlist)
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:             # <<<<<<<<<<<<<<
@@ -15205,18 +15036,10 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   for (;;) {
     if (!__pyx_t_3 && 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
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_4); __pyx_t_1++;
     } else if (!__pyx_t_3 && 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)) {
@@ -15232,7 +15055,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":221
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":221
  *         fwrite(&(num_words), sizeof(int), 1, f)
  *         for word in wordlist:
  *             word_len = len(word) + 1             # <<<<<<<<<<<<<<
@@ -15242,7 +15065,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":222
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":222
  *         for word in wordlist:
  *             word_len = len(word) + 1
  *             fwrite(&(word_len), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -15251,7 +15074,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":223
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15277,7 +15100,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_write_wordlist(CYTHON_UNUSED struct __pyx_o
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":226
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":226
  * 
  * 
  *     cdef read_wordlist(self, word2id, id2word, FILE* f):             # <<<<<<<<<<<<<<
@@ -15301,7 +15124,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_read_wordlist(CYTHON_UNUSED struct __pyx_ob
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_wordlist", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":231
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":231
  *         cdef char* word
  * 
  *         fread(&(num_words), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -15310,7 +15133,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":232
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":232
  * 
  *         fread(&(num_words), sizeof(int), 1, f)
  *         for i from 0 <= i < num_words:             # <<<<<<<<<<<<<<
@@ -15320,7 +15143,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":233
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15329,7 +15152,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":234
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -15338,7 +15161,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)))));
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":235
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15347,7 +15170,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":236
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15363,7 +15186,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":237
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":237
  *             fread(word, sizeof(char), word_len, f)
  *             word2id[word] = len(id2word)
  *             id2word.append(word)             # <<<<<<<<<<<<<<
@@ -15377,7 +15200,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":238
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":238
  *             word2id[word] = len(id2word)
  *             id2word.append(word)
  *             free(word)             # <<<<<<<<<<<<<<
@@ -15421,7 +15244,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_5read_binary(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":240
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":240
  *             free(word)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15441,7 +15264,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":242
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":242
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -15450,7 +15273,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":243
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":243
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15459,7 +15282,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":244
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":244
  *         f = fopen(filename, "r")
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15468,7 +15291,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":245
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":245
  *         self.f_index.read_handle(f)
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15477,7 +15300,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":246
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":246
  *         self.e_index.read_handle(f)
  *         self.col1.read_handle(f)
  *         self.col2.read_handle(f)             # <<<<<<<<<<<<<<
@@ -15486,7 +15309,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":247
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15503,7 +15326,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":248
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15520,7 +15343,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":249
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -15554,7 +15377,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_7get_e_id(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":252
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":252
  * 
  * 
  *     def get_e_id(self, eword):             # <<<<<<<<<<<<<<
@@ -15574,17 +15397,17 @@ 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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":253
+  /* "/home/paulb/workspace/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(__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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":254
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":254
  *     def get_e_id(self, eword):
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)             # <<<<<<<<<<<<<<
@@ -15600,7 +15423,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":255
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":255
  *         if eword not in self.eword2id:
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)             # <<<<<<<<<<<<<<
@@ -15611,7 +15434,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":256
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":256
  *             e_id = len(self.id2eword)
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id             # <<<<<<<<<<<<<<
@@ -15623,7 +15446,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_6get_e_id(struct __pyx_obj_3_sa_BiLex *__p
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":257
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":257
  *             self.id2eword.append(eword)
  *             self.eword2id[eword] = e_id
  *         return self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -15661,7 +15484,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_9get_f_id(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":260
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":260
  * 
  * 
  *     def get_f_id(self, fword):             # <<<<<<<<<<<<<<
@@ -15681,17 +15504,17 @@ 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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":261
+  /* "/home/paulb/workspace/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(__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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":262
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":262
  *     def get_f_id(self, fword):
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)             # <<<<<<<<<<<<<<
@@ -15707,7 +15530,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":263
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":263
  *         if fword not in self.fword2id:
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)             # <<<<<<<<<<<<<<
@@ -15718,7 +15541,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":264
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":264
  *             f_id = len(self.id2fword)
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id             # <<<<<<<<<<<<<<
@@ -15730,7 +15553,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_8get_f_id(struct __pyx_obj_3_sa_BiLex *__p
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":265
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":265
  *             self.id2fword.append(fword)
  *             self.fword2id[fword] = f_id
  *         return self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -15778,7 +15601,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_11read_text(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":268
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":268
  * 
  * 
  *     def read_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -15833,7 +15656,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":272
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":272
  *         cdef IntList fcount
  * 
  *         fcount = IntList()             # <<<<<<<<<<<<<<
@@ -15845,7 +15668,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -15885,7 +15708,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":275
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -15903,18 +15726,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           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
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } 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
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
               __pyx_t_2 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_2)) {
@@ -15930,7 +15745,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":276
+            /* "/home/paulb/workspace/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()             # <<<<<<<<<<<<<<
@@ -15944,23 +15759,22 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
             __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_L7_error;}
+                }
                 __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_L7_error;}
+                }
                 __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
@@ -15970,36 +15784,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
               __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
-            {
+            } 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_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 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;
-              }
+              index = 0; __pyx_t_2 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_2)) goto __pyx_L18_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_2);
+              index = 1; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L18_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_L18_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_L18_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_L7_error;}
-              __pyx_t_14 = NULL;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
               goto __pyx_L19_unpacking_done;
               __pyx_L18_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = 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[5]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __pyx_L19_unpacking_done:;
             }
@@ -16016,7 +15822,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":277
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":277
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
@@ -16038,7 +15844,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":278
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16060,7 +15866,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":279
+            /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -16071,13 +15877,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
               __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_t_12 = PyObject_RichCompare(__pyx_v_f_id, __pyx_t_3, Py_GE); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_12);
               __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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":280
+              /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":280
  *                 e_id = self.get_e_id(eword)
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)             # <<<<<<<<<<<<<<
@@ -16089,7 +15896,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;
             }
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":281
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":281
  *                 while f_id >= len(fcount):
  *                     fcount.append(0)
  *                 fcount.arr[f_id] = fcount.arr[f_id] + 1             # <<<<<<<<<<<<<<
@@ -16102,7 +15909,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":284
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":284
  * 
  *             # Allocate space for dictionary in arrays
  *             N = 0             # <<<<<<<<<<<<<<
@@ -16112,7 +15919,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":285
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":285
  *             # Allocate space for dictionary in arrays
  *             N = 0
  *             n_f = len(fcount)             # <<<<<<<<<<<<<<
@@ -16125,7 +15932,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":286
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":286
  *             N = 0
  *             n_f = len(fcount)
  *             self.f_index = IntList(initial_len=n_f+1)             # <<<<<<<<<<<<<<
@@ -16147,7 +15954,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -16162,7 +15969,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":288
+            /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -16173,7 +15980,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":289
+            /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -16190,7 +15997,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":290
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":290
  *                 self.f_index.arr[i] = N
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -16202,7 +16009,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;}
           }
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":287
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -16215,7 +16022,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":291
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":291
  *                 N = N + fcount.arr[i]
  *                 fcount.arr[i] = 0
  *             self.f_index.arr[n_f] = N             # <<<<<<<<<<<<<<
@@ -16226,7 +16033,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":292
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16245,7 +16052,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":293
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16264,7 +16071,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":294
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16283,7 +16090,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":297
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -16297,7 +16104,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":298
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":298
  *             # Re-read file, placing words into buckets
  *             f.seek(0)
  *             for line in f:             # <<<<<<<<<<<<<<
@@ -16315,18 +16122,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
           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
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
             } 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
+              __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_12); __pyx_t_8++;
             } else {
               __pyx_t_12 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_12)) {
@@ -16342,7 +16141,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":299
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":299
  *             f.seek(0)
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()             # <<<<<<<<<<<<<<
@@ -16356,23 +16155,22 @@ 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 ((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_L7_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); 
               } 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_L7_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); 
@@ -16382,36 +16180,28 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
               __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
-            {
+            } 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_GOTREF(__pyx_t_13);
               __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 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;
-              }
+              index = 0; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L26_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_L26_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_L26_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_10);
+              index = 3; __pyx_t_2 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_2)) goto __pyx_L26_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_2);
               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_L27_unpacking_done;
               __pyx_L26_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-              __pyx_t_14 = 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[5]; __pyx_lineno = 299; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __pyx_L27_unpacking_done:;
             }
@@ -16428,7 +16218,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":300
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":300
  *             for line in f:
  *                 (fword, eword, score1, score2) = line.split()
  *                 f_id = self.get_f_id(fword)             # <<<<<<<<<<<<<<
@@ -16450,7 +16240,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":301
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16472,7 +16262,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":302
+            /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -16487,7 +16277,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":303
+            /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -16498,7 +16288,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);
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":304
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16518,7 +16308,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":305
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16531,7 +16321,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":306
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -16559,7 +16349,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":273
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -16639,7 +16429,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
     __pyx_L31:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
@@ -16655,7 +16445,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":310
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":310
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:
  *             i = self.f_index.arr[b]             # <<<<<<<<<<<<<<
@@ -16669,7 +16459,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":311
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -16686,7 +16476,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":312
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":312
  *             i = self.f_index.arr[b]
  *             j = self.f_index.arr[b+1]
  *             self.qsort(i,j, "")             # <<<<<<<<<<<<<<
@@ -16704,7 +16494,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;}
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":309
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":309
  * 
  *         # Sort buckets by eword
  *         for b from 0 <= b < n_f:             # <<<<<<<<<<<<<<
@@ -16750,7 +16540,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_10read_text(struct __pyx_obj_3_sa_BiLex *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":315
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":315
  * 
  * 
  *     cdef swap(self, int i, int j):             # <<<<<<<<<<<<<<
@@ -16766,7 +16556,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":319
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":319
  *         cdef float ftmp
  * 
  *         if i == j:             # <<<<<<<<<<<<<<
@@ -16776,7 +16566,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":320
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":320
  * 
  *         if i == j:
  *             return             # <<<<<<<<<<<<<<
@@ -16790,7 +16580,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":322
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":322
  *             return
  * 
  *         itmp = self.e_index.arr[i]             # <<<<<<<<<<<<<<
@@ -16799,7 +16589,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":323
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":323
  * 
  *         itmp = self.e_index.arr[i]
  *         self.e_index.arr[i] = self.e_index.arr[j]             # <<<<<<<<<<<<<<
@@ -16808,7 +16598,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":324
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -16817,7 +16607,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":326
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":326
  *         self.e_index.arr[j] = itmp
  * 
  *         ftmp = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -16826,7 +16616,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":327
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":327
  * 
  *         ftmp = self.col1.arr[i]
  *         self.col1.arr[i] = self.col1.arr[j]             # <<<<<<<<<<<<<<
@@ -16835,7 +16625,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":328
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -16844,7 +16634,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":330
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":330
  *         self.col1.arr[j] = ftmp
  * 
  *         ftmp = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -16853,7 +16643,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":331
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":331
  * 
  *         ftmp = self.col2.arr[i]
  *         self.col2.arr[i] = self.col2.arr[j]             # <<<<<<<<<<<<<<
@@ -16862,7 +16652,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":332
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -16878,7 +16668,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_swap(struct __pyx_obj_3_sa_BiLex *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":335
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":335
  * 
  * 
  *     cdef qsort(self, int i, int j, pad):             # <<<<<<<<<<<<<<
@@ -16901,7 +16691,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":338
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":338
  *         cdef int pval, p
  * 
  *         if i > j:             # <<<<<<<<<<<<<<
@@ -16911,7 +16701,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":339
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -16927,7 +16717,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":340
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":340
  *         if i > j:
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval             # <<<<<<<<<<<<<<
@@ -16937,7 +16727,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":341
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":341
  *             raise Exception("Sort error in CLex")
  *         if i == j: #empty interval
  *             return             # <<<<<<<<<<<<<<
@@ -16951,7 +16741,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":342
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":342
  *         if i == j: #empty interval
  *             return
  *         if i == j-1: # singleton interval             # <<<<<<<<<<<<<<
@@ -16961,7 +16751,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":343
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":343
  *             return
  *         if i == j-1: # singleton interval
  *             return             # <<<<<<<<<<<<<<
@@ -16975,7 +16765,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":345
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":345
  *             return
  * 
  *         p = (i+j)/2             # <<<<<<<<<<<<<<
@@ -16984,7 +16774,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":346
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":346
  * 
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]             # <<<<<<<<<<<<<<
@@ -16993,7 +16783,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":347
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":347
  *         p = (i+j)/2
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)             # <<<<<<<<<<<<<<
@@ -17004,7 +16794,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":348
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":348
  *         pval = self.e_index.arr[p]
  *         self.swap(i, p)
  *         p = i             # <<<<<<<<<<<<<<
@@ -17013,7 +16803,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
  */
   __pyx_v_p = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":349
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":349
  *         self.swap(i, p)
  *         p = i
  *         for k from i+1 <= k < j:             # <<<<<<<<<<<<<<
@@ -17023,7 +16813,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":350
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":350
  *         p = i
  *         for k from i+1 <= k < j:
  *             if pval >= self.e_index.arr[k]:             # <<<<<<<<<<<<<<
@@ -17033,7 +16823,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":351
+      /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -17044,7 +16834,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":352
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":352
  *             if pval >= self.e_index.arr[k]:
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)             # <<<<<<<<<<<<<<
@@ -17055,7 +16845,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":353
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":353
  *                 self.swap(p+1, k)
  *                 self.swap(p, p+1)
  *                 p = p + 1             # <<<<<<<<<<<<<<
@@ -17068,7 +16858,7 @@ static PyObject *__pyx_f_3_sa_5BiLex_qsort(struct __pyx_obj_3_sa_BiLex *__pyx_v_
     __pyx_L8:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":354
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":354
  *                 self.swap(p, p+1)
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")             # <<<<<<<<<<<<<<
@@ -17082,7 +16872,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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":355
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":355
  *                 p = p + 1
  *         self.qsort(i,p, pad+"    ")
  *         self.qsort(p+1,j, pad+"    ")             # <<<<<<<<<<<<<<
@@ -17130,7 +16920,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_13write_enhanced(PyObject *__pyx_v_self, P
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":358
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":358
  * 
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -17167,7 +16957,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17207,7 +16997,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":360
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -17225,18 +17015,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           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
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } 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
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_1)) {
@@ -17252,7 +17034,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":361
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":361
  *         with open(filename, "w") as f:
  *             for i in self.f_index:
  *                 f.write("%d " % i)             # <<<<<<<<<<<<<<
@@ -17276,7 +17058,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":362
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17290,7 +17072,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":363
+          /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -17323,18 +17105,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           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
+              __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++;
             } 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
+              __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_4); __pyx_t_8++;
             } else {
               __pyx_t_4 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_4)) {
@@ -17348,22 +17122,21 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
             }
             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_L7_error;}
+                }
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
                 __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_L7_error;}
+                }
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_1 = PyList_GET_ITEM(sequence, 1); 
                 __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
@@ -17371,14 +17144,8 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
               __Pyx_INCREF(__pyx_t_10);
               __Pyx_INCREF(__pyx_t_1);
               __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
-            {
+            } 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_GOTREF(__pyx_t_12);
@@ -17391,13 +17158,12 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
               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_L7_error;}
-              __pyx_t_13 = NULL;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
               goto __pyx_L21_unpacking_done;
               __pyx_L20_unpacking_failed:;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_13 = 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[5]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
               __pyx_L21_unpacking_done:;
             }
@@ -17411,7 +17177,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":364
+            /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -17447,7 +17213,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":365
+          /* "/home/paulb/workspace/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")             # <<<<<<<<<<<<<<
@@ -17461,7 +17227,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":366
+          /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -17481,18 +17247,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           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
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++;
             } 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
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_11); __pyx_t_8++;
             } else {
               __pyx_t_11 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_11)) {
@@ -17516,7 +17274,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":367
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":367
  *             f.write("\n")
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
@@ -17550,7 +17308,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":368
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17564,7 +17322,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":369
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":369
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):             # <<<<<<<<<<<<<<
@@ -17584,18 +17342,10 @@ static PyObject *__pyx_pf_3_sa_5BiLex_12write_enhanced(struct __pyx_obj_3_sa_BiL
           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
+              __pyx_t_10 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++;
             } 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
+              __pyx_t_10 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_10); __pyx_t_8++;
             } else {
               __pyx_t_10 = __pyx_t_9(__pyx_t_1);
               if (unlikely(!__pyx_t_10)) {
@@ -17619,7 +17369,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":370
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":370
  *             f.write("\n")
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))             # <<<<<<<<<<<<<<
@@ -17653,7 +17403,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":371
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -17679,7 +17429,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":359
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -17787,11 +17537,11 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
   PyObject *__pyx_v_fword = 0;
   PyObject *__pyx_v_eword = 0;
   PyObject *__pyx_v_col = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fword,&__pyx_n_s__eword,&__pyx_n_s__col,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -17806,15 +17556,18 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -17846,7 +17599,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_15get_score(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":374
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":374
  * 
  * 
  *     def get_score(self, fword, eword, col):             # <<<<<<<<<<<<<<
@@ -17872,17 +17625,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_score", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":377
+  /* "/home/paulb/workspace/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(__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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":378
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":378
  * 
  *         if eword not in self.eword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -17897,17 +17650,17 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":379
+  /* "/home/paulb/workspace/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(__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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":380
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":380
  *             return None
  *         if fword not in self.fword2id:
  *             return None             # <<<<<<<<<<<<<<
@@ -17922,7 +17675,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":381
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":381
  *         if fword not in self.fword2id:
  *             return None
  *         f_id = self.fword2id[fword]             # <<<<<<<<<<<<<<
@@ -17934,7 +17687,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":382
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":382
  *             return None
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]             # <<<<<<<<<<<<<<
@@ -17946,7 +17699,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":383
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":383
  *         f_id = self.fword2id[fword]
  *         e_id = self.eword2id[eword]
  *         low = self.f_index.arr[f_id]             # <<<<<<<<<<<<<<
@@ -17959,7 +17712,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":384
+  /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -17975,7 +17728,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":385
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -17985,13 +17738,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":386
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":386
  *         high = self.f_index.arr[f_id+1]
  *         while high - low > 0:
  *             midpoint = (low+high)/2             # <<<<<<<<<<<<<<
@@ -18007,7 +17761,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":387
+    /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":387
  *         while high - low > 0:
  *             midpoint = (low+high)/2
  *             val = self.e_index.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -18021,31 +17775,33 @@ 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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":388
+    /* "/home/paulb/workspace/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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":389
+      /* "/home/paulb/workspace/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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":390
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":390
  *             if val == e_id:
  *                 if col == 0:
  *                     return self.col1.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -18063,19 +17819,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
       }
       __pyx_L8:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":391
+      /* "/home/paulb/workspace/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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":392
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":392
  *                     return self.col1.arr[midpoint]
  *                 if col == 1:
  *                     return self.col2.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -18096,19 +17853,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":393
+    /* "/home/paulb/workspace/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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":394
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":394
  *                     return self.col2.arr[midpoint]
  *             if val > e_id:
  *                 high = midpoint             # <<<<<<<<<<<<<<
@@ -18122,19 +17880,20 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     }
     __pyx_L10:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":395
+    /* "/home/paulb/workspace/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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":396
+      /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":396
  *                 high = midpoint
  *             if val < e_id:
  *                 low = midpoint + 1             # <<<<<<<<<<<<<<
@@ -18151,7 +17910,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_14get_score(struct __pyx_obj_3_sa_BiLex *_
     __pyx_L11:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":397
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":397
  *             if val < e_id:
  *                 low = midpoint + 1
  *         return None             # <<<<<<<<<<<<<<
@@ -18204,7 +17963,7 @@ static PyObject *__pyx_pw_3_sa_5BiLex_17write_text(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":400
+/* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":400
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -18241,7 +18000,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -18281,7 +18040,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":405
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":405
  * 
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)             # <<<<<<<<<<<<<<
@@ -18297,7 +18056,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":406
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":406
  *         with open(filename, "w") as f:
  *             N = len(self.e_index)
  *             f_id = 0             # <<<<<<<<<<<<<<
@@ -18307,7 +18066,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -18322,7 +18081,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":408
+            /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -18336,13 +18095,14 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
               __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_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_v_i, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[5]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
+              __Pyx_GOTREF(__pyx_t_1);
               __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;
               if (!__pyx_t_11) break;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":409
+              /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -18356,7 +18116,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
               __pyx_t_1 = 0;
             }
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":410
+            /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -18370,7 +18130,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":411
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":411
  *                     f_id = f_id + 1
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]             # <<<<<<<<<<<<<<
@@ -18384,7 +18144,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":412
+            /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":412
  *                 e_id = self.e_index.arr[i]
  *                 score1 = self.col1.arr[i]
  *                 score2 = self.col2.arr[i]             # <<<<<<<<<<<<<<
@@ -18397,7 +18157,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":413
+            /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -18438,7 +18198,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;}
           }
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":407
+          /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":407
  *             N = len(self.e_index)
  *             f_id = 0
  *             for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -18461,7 +18221,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":404
+        /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -18563,7 +18323,7 @@ static PyObject *__pyx_pf_3_sa_5BiLex_16write_text(struct __pyx_obj_3_sa_BiLex *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":21
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":21
  * cdef int LOWER_MASK[32]
  * 
  * cdef void _init_lower_mask():             # <<<<<<<<<<<<<<
@@ -18579,7 +18339,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   unsigned int __pyx_t_2;
   __Pyx_RefNannySetupContext("_init_lower_mask", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":23
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":23
  * cdef void _init_lower_mask():
  *     cdef unsigned i
  *     cdef int mask = 0             # <<<<<<<<<<<<<<
@@ -18588,7 +18348,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
   __pyx_v_mask = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":24
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":24
  *     cdef unsigned i
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -18599,7 +18359,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":25
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":25
  *     cdef int mask = 0
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1             # <<<<<<<<<<<<<<
@@ -18608,7 +18368,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
  */
     __pyx_v_mask = ((__pyx_v_mask << 1) + 1);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":26
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":26
  *     for i in range(MIN_BOTTOM_SIZE):
  *         mask = (mask << 1) + 1
  *         LOWER_MASK[i] = mask             # <<<<<<<<<<<<<<
@@ -18621,7 +18381,7 @@ static void __pyx_f_3_sa__init_lower_mask(void) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":37
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":37
  * 
  * 
  * cdef _BitSet* new_BitSet():             # <<<<<<<<<<<<<<
@@ -18635,7 +18395,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("new_BitSet", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":40
  *     cdef _BitSet* b
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))             # <<<<<<<<<<<<<<
@@ -18644,7 +18404,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":41
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":41
  * 
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0             # <<<<<<<<<<<<<<
@@ -18653,7 +18413,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->bitset = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":42
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":42
  *     b = <_BitSet*> malloc(sizeof(_BitSet))
  *     b.bitset = 0
  *     b.min_val = -1             # <<<<<<<<<<<<<<
@@ -18662,7 +18422,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->min_val = -1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":43
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":43
  *     b.bitset = 0
  *     b.min_val = -1
  *     b.max_val = -1             # <<<<<<<<<<<<<<
@@ -18671,7 +18431,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->max_val = -1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":44
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":44
  *     b.min_val = -1
  *     b.max_val = -1
  *     b.size = 0             # <<<<<<<<<<<<<<
@@ -18680,7 +18440,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
  */
   __pyx_v_b->size = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":45
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":45
  *     b.max_val = -1
  *     b.size = 0
  *     return b             # <<<<<<<<<<<<<<
@@ -18696,7 +18456,7 @@ static struct __pyx_t_3_sa__BitSet *__pyx_f_3_sa_new_BitSet(void) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":48
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":48
  * 
  * 
  * cdef int bitset_findsucc(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -18717,7 +18477,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":52
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":52
  *     cdef int low, high, mid
  * 
  *     if b.max_val == -1 or i >= b.max_val:             # <<<<<<<<<<<<<<
@@ -18733,7 +18493,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":53
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":53
  * 
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -18746,7 +18506,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":54
  *     if b.max_val == -1 or i >= b.max_val:
  *         return -1
  *     if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -18756,7 +18516,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":55
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":55
  *         return -1
  *     if i < b.min_val:
  *         return b.min_val             # <<<<<<<<<<<<<<
@@ -18769,7 +18529,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":57
  *         return b.min_val
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]             # <<<<<<<<<<<<<<
@@ -18778,7 +18538,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":58
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":58
  * 
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1             # <<<<<<<<<<<<<<
@@ -18787,7 +18547,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":59
  *     bitset = b.bitset & ~LOWER_MASK[i]
  *     low = i+1
  *     high = b.max_val+1             # <<<<<<<<<<<<<<
@@ -18796,7 +18556,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":60
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":60
  *     low = i+1
  *     high = b.max_val+1
  *     while low < high-1:             # <<<<<<<<<<<<<<
@@ -18807,7 +18567,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":61
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":61
  *     high = b.max_val+1
  *     while low < high-1:
  *         mid = (high + low)/2             # <<<<<<<<<<<<<<
@@ -18816,7 +18576,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":62
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":62
  *     while low < high-1:
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])             # <<<<<<<<<<<<<<
@@ -18825,7 +18585,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":63
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":63
  *         mid = (high + low)/2
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:             # <<<<<<<<<<<<<<
@@ -18835,7 +18595,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":64
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":64
  *         mask = ~(LOWER_MASK[high-1] ^ LOWER_MASK[mid-1])
  *         if bitset & mask == 0:
  *             low = mid             # <<<<<<<<<<<<<<
@@ -18847,7 +18607,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":66
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":66
  *             low = mid
  *         else:
  *             bitset = bitset & mask             # <<<<<<<<<<<<<<
@@ -18856,7 +18616,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":67
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":67
  *         else:
  *             bitset = bitset & mask
  *             high = mid             # <<<<<<<<<<<<<<
@@ -18868,7 +18628,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
     __pyx_L7:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":68
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":68
  *             bitset = bitset & mask
  *             high = mid
  *     return low             # <<<<<<<<<<<<<<
@@ -18884,7 +18644,7 @@ static int __pyx_f_3_sa_bitset_findsucc(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":71
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":71
  * 
  * 
  * cdef int bitset_insert(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -18899,7 +18659,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":74
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":74
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -18908,7 +18668,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":75
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":75
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -18918,7 +18678,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":76
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":76
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val             # <<<<<<<<<<<<<<
@@ -18927,7 +18687,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":77
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":77
  *     if b.bitset & val == 0:
  *         b.bitset = b.bitset | val
  *         if b.size == 0:             # <<<<<<<<<<<<<<
@@ -18937,7 +18697,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":78
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":78
  *         b.bitset = b.bitset | val
  *         if b.size == 0:
  *             b.min_val = i             # <<<<<<<<<<<<<<
@@ -18946,7 +18706,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":79
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":79
  *         if b.size == 0:
  *             b.min_val = i
  *             b.max_val = i             # <<<<<<<<<<<<<<
@@ -18958,7 +18718,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":81
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":81
  *             b.max_val = i
  *         else:
  *             if i < b.min_val:             # <<<<<<<<<<<<<<
@@ -18968,7 +18728,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":82
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":82
  *         else:
  *             if i < b.min_val:
  *                 b.min_val = i             # <<<<<<<<<<<<<<
@@ -18980,7 +18740,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
       }
       __pyx_L5:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":83
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":83
  *             if i < b.min_val:
  *                 b.min_val = i
  *             if i > b.max_val:             # <<<<<<<<<<<<<<
@@ -18990,7 +18750,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":84
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":84
  *                 b.min_val = i
  *             if i > b.max_val:
  *                 b.max_val = i             # <<<<<<<<<<<<<<
@@ -19004,7 +18764,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":85
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":85
  *             if i > b.max_val:
  *                 b.max_val = i
  *         b.size = b.size + 1             # <<<<<<<<<<<<<<
@@ -19013,7 +18773,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":86
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":86
  *                 b.max_val = i
  *         b.size = b.size + 1
  *         return 1             # <<<<<<<<<<<<<<
@@ -19026,7 +18786,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":87
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":87
  *         b.size = b.size + 1
  *         return 1
  *     return 0             # <<<<<<<<<<<<<<
@@ -19042,7 +18802,7 @@ static int __pyx_f_3_sa_bitset_insert(struct __pyx_t_3_sa__BitSet *__pyx_v_b, in
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":90
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":90
  * 
  * 
  * cdef int bitset_contains(_BitSet* b, int i):             # <<<<<<<<<<<<<<
@@ -19057,7 +18817,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":93
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":93
  *     cdef int val
  * 
  *     val = 1 << i             # <<<<<<<<<<<<<<
@@ -19066,7 +18826,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":94
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":94
  * 
  *     val = 1 << i
  *     if b.bitset & val == 0:             # <<<<<<<<<<<<<<
@@ -19076,7 +18836,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":95
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":95
  *     val = 1 << i
  *     if b.bitset & val == 0:
  *         return 0             # <<<<<<<<<<<<<<
@@ -19089,7 +18849,7 @@ static int __pyx_f_3_sa_bitset_contains(struct __pyx_t_3_sa__BitSet *__pyx_v_b,
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":97
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":97
  *         return 0
  *     else:
  *         return 1             # <<<<<<<<<<<<<<
@@ -19118,7 +18878,7 @@ static PyObject *__pyx_pw_3_sa_14BitSetIterator_1__next__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":104
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":104
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -19137,7 +18897,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":107
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":107
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
@@ -19147,7 +18907,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":108
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":108
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -19163,7 +18923,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":109
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":109
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
@@ -19172,7 +18932,7 @@ static PyObject *__pyx_pf_3_sa_14BitSetIterator___next__(struct __pyx_obj_3_sa_B
  */
   __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":110
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":110
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)             # <<<<<<<<<<<<<<
@@ -19181,7 +18941,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":111
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":111
  *         ret_val = self.next_val
  *         self.next_val = bitset_findsucc(self.b, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -19221,7 +18981,7 @@ static int __pyx_pw_3_sa_6BitSet_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":122
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":122
  *     cdef _BitSet* b
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -19234,7 +18994,7 @@ static int __pyx_pf_3_sa_6BitSet___cinit__(struct __pyx_obj_3_sa_BitSet *__pyx_v
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":123
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":123
  * 
  *     def __cinit__(self):
  *         self.b = new_BitSet()             # <<<<<<<<<<<<<<
@@ -19257,7 +19017,7 @@ static void __pyx_pw_3_sa_6BitSet_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":125
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":125
  *         self.b = new_BitSet()
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -19269,7 +19029,7 @@ static void __pyx_pf_3_sa_6BitSet_2__dealloc__(struct __pyx_obj_3_sa_BitSet *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":126
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":126
  * 
  *     def __dealloc__(self):
  *         free(self.b)             # <<<<<<<<<<<<<<
@@ -19292,7 +19052,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_5__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":128
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":128
  *         free(self.b)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -19310,7 +19070,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__iter__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":130
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":130
  *     def __iter__(self):
  *         cdef BitSetIterator it
  *         it = BitSetIterator()             # <<<<<<<<<<<<<<
@@ -19322,7 +19082,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":131
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":131
  *         cdef BitSetIterator it
  *         it = BitSetIterator()
  *         it.b = self.b             # <<<<<<<<<<<<<<
@@ -19331,7 +19091,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_4__iter__(struct __pyx_obj_3_sa_BitSet *_
  */
   __pyx_v_it->b = __pyx_v_self->b;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":132
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":132
  *         it = BitSetIterator()
  *         it.b = self.b
  *         it.next_val = self.b.min_val             # <<<<<<<<<<<<<<
@@ -19340,7 +19100,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":133
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":133
  *         it.b = self.b
  *         it.next_val = self.b.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -19376,7 +19136,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_7insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":135
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":135
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -19394,7 +19154,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_6insert(struct __pyx_obj_3_sa_BitSet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":136
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":136
  * 
  *     def insert(self, i):
  *         return bitset_insert(self.b, i)             # <<<<<<<<<<<<<<
@@ -19432,7 +19192,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_9findsucc(PyObject *__pyx_v_self, PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":138
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":138
  *         return bitset_insert(self.b, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -19450,7 +19210,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_8findsucc(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("findsucc", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":139
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":139
  * 
  *     def findsucc(self, i):
  *         return bitset_findsucc(self.b, i)             # <<<<<<<<<<<<<<
@@ -19488,7 +19248,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_11__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":141
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":141
  *         return bitset_findsucc(self.b, i)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -19507,7 +19267,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_10__str__(struct __pyx_obj_3_sa_BitSet *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":142
+  /* "/home/paulb/workspace/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)+")"             # <<<<<<<<<<<<<<
@@ -19600,7 +19360,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_13min(PyObject *__pyx_v_self, CYTHON_UNUS
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":144
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -19617,7 +19377,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_12min(struct __pyx_obj_3_sa_BitSet *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("min", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":145
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":145
  * 
  *     def min(self):
  *         return self.b.min_val             # <<<<<<<<<<<<<<
@@ -19654,7 +19414,7 @@ static PyObject *__pyx_pw_3_sa_6BitSet_15max(PyObject *__pyx_v_self, CYTHON_UNUS
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":147
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":147
  *         return self.b.min_val
  * 
  *     def max(self):             # <<<<<<<<<<<<<<
@@ -19671,7 +19431,7 @@ static PyObject *__pyx_pf_3_sa_6BitSet_14max(struct __pyx_obj_3_sa_BitSet *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("max", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":148
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":148
  * 
  *     def max(self):
  *         return self.b.max_val             # <<<<<<<<<<<<<<
@@ -19708,7 +19468,7 @@ static Py_ssize_t __pyx_pw_3_sa_6BitSet_17__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":150
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":150
  *         return self.b.max_val
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -19721,7 +19481,7 @@ static Py_ssize_t __pyx_pf_3_sa_6BitSet_16__len__(struct __pyx_obj_3_sa_BitSet *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":151
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":151
  * 
  *     def __len__(self):
  *         return self.b.size             # <<<<<<<<<<<<<<
@@ -19748,7 +19508,7 @@ static int __pyx_pw_3_sa_6BitSet_19__contains__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":153
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":153
  *         return self.b.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -19767,7 +19527,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__contains__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":154
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":154
  * 
  *     def __contains__(self, i):
  *         return bool(bitset_contains(self.b, i))             # <<<<<<<<<<<<<<
@@ -19793,7 +19553,7 @@ static int __pyx_pf_3_sa_6BitSet_18__contains__(struct __pyx_obj_3_sa_BitSet *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":157
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":157
  * 
  * 
  * cdef str dec2bin(long i):             # <<<<<<<<<<<<<<
@@ -19815,7 +19575,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("dec2bin", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":158
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":158
  * 
  * cdef str dec2bin(long i):
  *     cdef str result = ""             # <<<<<<<<<<<<<<
@@ -19825,7 +19585,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":160
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":160
  *     cdef str result = ""
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):             # <<<<<<<<<<<<<<
@@ -19836,7 +19596,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":161
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":161
  *     cdef unsigned d
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:             # <<<<<<<<<<<<<<
@@ -19846,7 +19606,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":162
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":162
  *     for d in range(MIN_BOTTOM_SIZE):
  *         if i & LOWER_MASK[0] == 0:
  *             result = "0"+result             # <<<<<<<<<<<<<<
@@ -19862,7 +19622,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":164
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":164
  *             result = "0"+result
  *         else:
  *             result = "1"+result             # <<<<<<<<<<<<<<
@@ -19877,7 +19637,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":165
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":165
  *         else:
  *             result = "1"+result
  *         i = i >> 1             # <<<<<<<<<<<<<<
@@ -19887,7 +19647,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
     __pyx_v_i = (__pyx_v_i >> 1);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":166
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":166
  *             result = "1"+result
  *         i = i >> 1
  *     return result             # <<<<<<<<<<<<<<
@@ -19912,7 +19672,7 @@ static PyObject *__pyx_f_3_sa_dec2bin(long __pyx_v_i) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":177
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":177
  *     void** bottom
  * 
  * cdef _VEB* new_VEB(int n):             # <<<<<<<<<<<<<<
@@ -19933,7 +19693,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":181
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":181
  *     cdef int num_bits, num_top_bits, i
  * 
  *     veb = <_VEB*> malloc(sizeof(_VEB))             # <<<<<<<<<<<<<<
@@ -19942,7 +19702,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":183
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":183
  *     veb = <_VEB*> malloc(sizeof(_VEB))
  * 
  *     num_bits = int(ceil(log(n) / log(2)))             # <<<<<<<<<<<<<<
@@ -19957,7 +19717,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":184
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":184
  * 
  *     num_bits = int(ceil(log(n) / log(2)))
  *     veb.num_bottom_bits = num_bits/2             # <<<<<<<<<<<<<<
@@ -19966,7 +19726,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":185
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -19976,7 +19736,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":186
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -19988,7 +19748,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":187
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -19997,7 +19757,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":189
+  /* "/home/paulb/workspace/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*))             # <<<<<<<<<<<<<<
@@ -20006,7 +19766,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":190
+  /* "/home/paulb/workspace/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*))             # <<<<<<<<<<<<<<
@@ -20015,7 +19775,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":192
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20025,7 +19785,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":193
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":193
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         veb.top = new_VEB(veb.top_universe_size)             # <<<<<<<<<<<<<<
@@ -20037,7 +19797,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":195
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":195
  *         veb.top = new_VEB(veb.top_universe_size)
  *     else:
  *         veb.top = new_BitSet()             # <<<<<<<<<<<<<<
@@ -20048,7 +19808,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":197
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":197
  *         veb.top = new_BitSet()
  * 
  *     veb.max_val = -1             # <<<<<<<<<<<<<<
@@ -20057,7 +19817,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":198
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":198
  * 
  *     veb.max_val = -1
  *     veb.min_val = -1             # <<<<<<<<<<<<<<
@@ -20066,7 +19826,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":199
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":199
  *     veb.max_val = -1
  *     veb.min_val = -1
  *     veb.size = 0             # <<<<<<<<<<<<<<
@@ -20075,7 +19835,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
  */
   __pyx_v_veb->size = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":200
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":200
  *     veb.min_val = -1
  *     veb.size = 0
  *     return veb             # <<<<<<<<<<<<<<
@@ -20095,7 +19855,7 @@ static struct __pyx_t_3_sa__VEB *__pyx_f_3_sa_new_VEB(int __pyx_v_n) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":203
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":203
  * 
  * 
  * cdef int VEB_insert(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -20116,7 +19876,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":208
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":208
  *     cdef int a, b, tmp
  * 
  *     if veb.size == 0:             # <<<<<<<<<<<<<<
@@ -20126,7 +19886,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":209
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":209
  * 
  *     if veb.size == 0:
  *         veb.min_val = i             # <<<<<<<<<<<<<<
@@ -20135,7 +19895,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":210
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":210
  *     if veb.size == 0:
  *         veb.min_val = i
  *         veb.max_val = i             # <<<<<<<<<<<<<<
@@ -20146,7 +19906,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":211
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20162,7 +19922,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":212
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":212
  *         veb.max_val = i
  *     elif i == veb.min_val or i == veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -20175,7 +19935,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":214
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":214
  *         return 0
  *     else:
  *         if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -20185,7 +19945,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":215
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":215
  *     else:
  *         if i < veb.min_val:
  *             tmp = i             # <<<<<<<<<<<<<<
@@ -20194,7 +19954,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":216
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":216
  *         if i < veb.min_val:
  *             tmp = i
  *             i = veb.min_val             # <<<<<<<<<<<<<<
@@ -20203,7 +19963,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":217
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":217
  *             tmp = i
  *             i = veb.min_val
  *             veb.min_val = tmp             # <<<<<<<<<<<<<<
@@ -20215,7 +19975,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":218
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":218
  *             i = veb.min_val
  *             veb.min_val = tmp
  *         a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -20224,7 +19984,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":219
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -20233,7 +19993,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":220
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20243,7 +20003,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":221
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20253,7 +20013,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":222
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":222
  *         if veb.bottom[a] == NULL:
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -20262,7 +20022,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":223
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":223
  *             if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *                 subv = <_VEB*> veb.top
  *                 VEB_insert(subv, a)             # <<<<<<<<<<<<<<
@@ -20274,7 +20034,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":225
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":225
  *                 VEB_insert(subv, a)
  *             else:
  *                 subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -20283,7 +20043,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":226
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":226
  *             else:
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)             # <<<<<<<<<<<<<<
@@ -20294,7 +20054,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       __pyx_L6:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":227
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":227
  *                 subb = <_BitSet*> veb.top
  *                 bitset_insert(subb, a)
  *             if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20304,7 +20064,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":228
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -20316,7 +20076,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":230
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":230
  *                 veb.bottom[a] = new_VEB(1 << veb.num_bottom_bits)
  *             else:
  *                 veb.bottom[a] = new_BitSet()             # <<<<<<<<<<<<<<
@@ -20330,7 +20090,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":231
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":231
  *             else:
  *                 veb.bottom[a] = new_BitSet()
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20340,7 +20100,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":232
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -20349,7 +20109,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":233
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20359,7 +20119,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":234
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":234
  *             subv = <_VEB*> veb.bottom[a]
  *             if VEB_insert(subv, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -20375,7 +20135,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":236
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":236
  *                 return 0
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20384,7 +20144,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":237
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":237
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:             # <<<<<<<<<<<<<<
@@ -20394,7 +20154,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":238
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":238
  *             subb = <_BitSet*> veb.bottom[a]
  *             if bitset_insert(subb, b) == 0:
  *                 return 0             # <<<<<<<<<<<<<<
@@ -20409,7 +20169,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
     }
     __pyx_L8:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":240
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":240
  *                 return 0
  * 
  *         if i > veb.max_val:             # <<<<<<<<<<<<<<
@@ -20419,7 +20179,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":241
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":241
  * 
  *         if i > veb.max_val:
  *             veb.max_val = i             # <<<<<<<<<<<<<<
@@ -20433,7 +20193,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":242
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":242
  *         if i > veb.max_val:
  *             veb.max_val = i
  *     veb.size = veb.size + 1             # <<<<<<<<<<<<<<
@@ -20442,7 +20202,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":243
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":243
  *             veb.max_val = i
  *     veb.size = veb.size + 1
  *     return 1             # <<<<<<<<<<<<<<
@@ -20458,7 +20218,7 @@ static int __pyx_f_3_sa_VEB_insert(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int __
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":246
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":246
  * 
  * 
  * cdef del_VEB(_VEB* veb):             # <<<<<<<<<<<<<<
@@ -20477,7 +20237,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":249
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":249
  *     cdef int i
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20487,7 +20247,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":250
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":250
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         i = (<_VEB*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -20499,7 +20259,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":252
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":252
  *         i = (<_VEB*> veb.top).min_val
  *     else:
  *         i = (<_BitSet*> veb.top).min_val             # <<<<<<<<<<<<<<
@@ -20510,7 +20270,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":254
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":254
  *         i = (<_BitSet*> veb.top).min_val
  * 
  *     while i != -1:             # <<<<<<<<<<<<<<
@@ -20521,7 +20281,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":255
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":255
  * 
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20531,7 +20291,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":256
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":256
  *     while i != -1:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             del_VEB(<_VEB*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -20545,7 +20305,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":258
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":258
  *             del_VEB(<_VEB*> veb.bottom[i])
  *         else:
  *             free(<_BitSet*> veb.bottom[i])             # <<<<<<<<<<<<<<
@@ -20556,7 +20316,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     __pyx_L6:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":260
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":260
  *             free(<_BitSet*> veb.bottom[i])
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20566,7 +20326,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":261
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":261
  * 
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             i = VEB_findsucc(<_VEB*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -20578,7 +20338,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":263
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":263
  *             i = VEB_findsucc(<_VEB*> veb.top, i)
  *         else:
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)             # <<<<<<<<<<<<<<
@@ -20590,7 +20350,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
     __pyx_L7:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":265
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":265
  *             i = bitset_findsucc(<_BitSet*> veb.top, i)
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20600,7 +20360,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":266
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":266
  * 
  *     if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *         del_VEB(<_VEB*> veb.top)             # <<<<<<<<<<<<<<
@@ -20614,7 +20374,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":268
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":268
  *         del_VEB(<_VEB*> veb.top)
  *     else:
  *         free(<_BitSet*> veb.top)             # <<<<<<<<<<<<<<
@@ -20625,7 +20385,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   }
   __pyx_L8:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":269
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":269
  *     else:
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)             # <<<<<<<<<<<<<<
@@ -20634,7 +20394,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
  */
   free(__pyx_v_veb->bottom);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":270
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":270
  *         free(<_BitSet*> veb.top)
  *     free(veb.bottom)
  *     free(veb)             # <<<<<<<<<<<<<<
@@ -20655,7 +20415,7 @@ static PyObject *__pyx_f_3_sa_del_VEB(struct __pyx_t_3_sa__VEB *__pyx_v_veb) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":273
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":273
  * 
  * 
  * cdef int VEB_findsucc(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -20678,7 +20438,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":278
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":278
  *     cdef int a, b, j, c, found
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:             # <<<<<<<<<<<<<<
@@ -20694,7 +20454,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":279
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":279
  * 
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1             # <<<<<<<<<<<<<<
@@ -20707,7 +20467,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":280
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":280
  *     if veb.max_val == -1 or i>=veb.max_val:
  *         return -1
  *     if i < veb.min_val:             # <<<<<<<<<<<<<<
@@ -20717,7 +20477,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":281
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":281
  *         return -1
  *     if i < veb.min_val:
  *         return veb.min_val             # <<<<<<<<<<<<<<
@@ -20730,7 +20490,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":283
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":283
  *         return veb.min_val
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -20739,7 +20499,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":284
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":284
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -20748,7 +20508,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":285
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":285
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0             # <<<<<<<<<<<<<<
@@ -20757,7 +20517,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
  */
   __pyx_v_found = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":286
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":286
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     found = 0
  *     if veb.bottom[a] != NULL:             # <<<<<<<<<<<<<<
@@ -20767,7 +20527,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":287
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":287
  *     found = 0
  *     if veb.bottom[a] != NULL:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20777,7 +20537,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":288
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -20786,7 +20546,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":289
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -20796,7 +20556,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":290
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -20805,7 +20565,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":291
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":291
  *             if subv.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + VEB_findsucc(subv, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -20820,7 +20580,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":293
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":293
  *                 found = 1
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -20829,7 +20589,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":294
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":294
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             if subb.max_val > b:             # <<<<<<<<<<<<<<
@@ -20839,7 +20599,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":295
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -20848,7 +20608,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":296
+        /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":296
  *             if subb.max_val > b:
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1             # <<<<<<<<<<<<<<
@@ -20865,7 +20625,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":297
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":297
  *                 j = (a << veb.num_bottom_bits) + bitset_findsucc(subb, b)
  *                 found = 1
  *     if found==0:             # <<<<<<<<<<<<<<
@@ -20875,7 +20635,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":298
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":298
  *                 found = 1
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:             # <<<<<<<<<<<<<<
@@ -20885,7 +20645,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":299
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":299
  *     if found==0:
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top             # <<<<<<<<<<<<<<
@@ -20894,7 +20654,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":300
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":300
  *         if veb.top_universe_size > MIN_BOTTOM_SIZE:
  *             subv = <_VEB*> veb.top
  *             c = VEB_findsucc(subv, a)             # <<<<<<<<<<<<<<
@@ -20906,7 +20666,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":302
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":302
  *             c = VEB_findsucc(subv, a)
  *         else:
  *             subb = <_BitSet*> veb.top             # <<<<<<<<<<<<<<
@@ -20915,7 +20675,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":303
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":303
  *         else:
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)             # <<<<<<<<<<<<<<
@@ -20926,7 +20686,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     __pyx_L10:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":304
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":304
  *             subb = <_BitSet*> veb.top
  *             c = bitset_findsucc(subb, a)
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -20936,7 +20696,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":305
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -20945,7 +20705,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":306
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -20957,7 +20717,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":308
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":308
  *             j = (c << veb.num_bottom_bits) + subv.min_val
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]             # <<<<<<<<<<<<<<
@@ -20966,7 +20726,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":309
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":309
  *         else:
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val             # <<<<<<<<<<<<<<
@@ -20980,7 +20740,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L9:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":310
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":310
  *             subb = <_BitSet*> veb.bottom[c]
  *             j = (c << veb.num_bottom_bits) + subb.min_val
  *     return j             # <<<<<<<<<<<<<<
@@ -20996,7 +20756,7 @@ static int __pyx_f_3_sa_VEB_findsucc(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":313
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":313
  * 
  * 
  * cdef int VEB_contains(_VEB* veb, int i):             # <<<<<<<<<<<<<<
@@ -21017,7 +20777,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":318
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -21039,7 +20799,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":319
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":319
  * 
  *     if veb.size == 0 or i < veb.min_val or i > veb.max_val:
  *         return 0             # <<<<<<<<<<<<<<
@@ -21052,7 +20812,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":321
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":321
  *         return 0
  * 
  *     if veb.min_val == i:             # <<<<<<<<<<<<<<
@@ -21062,7 +20822,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":322
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":322
  * 
  *     if veb.min_val == i:
  *         return 1             # <<<<<<<<<<<<<<
@@ -21075,7 +20835,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":324
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":324
  *         return 1
  *     else:
  *         if veb.size == 1:             # <<<<<<<<<<<<<<
@@ -21085,7 +20845,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":325
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":325
  *     else:
  *         if veb.size == 1:
  *             return 0             # <<<<<<<<<<<<<<
@@ -21100,7 +20860,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":327
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":327
  *             return 0
  * 
  *     a = i >> veb.num_bottom_bits             # <<<<<<<<<<<<<<
@@ -21109,7 +20869,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":328
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":328
  * 
  *     a = i >> veb.num_bottom_bits
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]             # <<<<<<<<<<<<<<
@@ -21118,7 +20878,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":329
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -21128,7 +20888,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":330
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":330
  *     b = i & LOWER_MASK[veb.num_bottom_bits-1]
  *     if veb.bottom[a] == NULL:
  *         return 0             # <<<<<<<<<<<<<<
@@ -21141,7 +20901,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":332
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":332
  *         return 0
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:             # <<<<<<<<<<<<<<
@@ -21151,7 +20911,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":333
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":333
  *     else:
  *         if veb.num_bottom_bits > MIN_BOTTOM_BITS:
  *             subv = <_VEB*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -21160,7 +20920,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":334
+      /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -21173,7 +20933,7 @@ static int __pyx_f_3_sa_VEB_contains(struct __pyx_t_3_sa__VEB *__pyx_v_veb, int
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":336
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":336
  *             return VEB_contains(subv, b)
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]             # <<<<<<<<<<<<<<
@@ -21182,7 +20942,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/pauldb/workspace/cdec/python/src/sa/veb.pxi":337
+      /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":337
  *         else:
  *             subb = <_BitSet*> veb.bottom[a]
  *             return bitset_contains(subb, b)             # <<<<<<<<<<<<<<
@@ -21213,7 +20973,7 @@ static PyObject *__pyx_pw_3_sa_11VEBIterator_1__next__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":344
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":344
  *     cdef int next_val
  * 
  *     def __next__(self):             # <<<<<<<<<<<<<<
@@ -21232,7 +20992,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__next__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":347
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":347
  *         cdef int ret_val
  * 
  *         if self.next_val == -1:             # <<<<<<<<<<<<<<
@@ -21242,7 +21002,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":348
+    /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":348
  * 
  *         if self.next_val == -1:
  *             raise StopIteration()             # <<<<<<<<<<<<<<
@@ -21258,7 +21018,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":349
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":349
  *         if self.next_val == -1:
  *             raise StopIteration()
  *         ret_val = self.next_val             # <<<<<<<<<<<<<<
@@ -21267,7 +21027,7 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
  */
   __pyx_v_ret_val = __pyx_v_self->next_val;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":350
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":350
  *             raise StopIteration()
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)             # <<<<<<<<<<<<<<
@@ -21276,7 +21036,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":351
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":351
  *         ret_val = self.next_val
  *         self.next_val = VEB_findsucc(self.v, ret_val)
  *         return ret_val             # <<<<<<<<<<<<<<
@@ -21306,11 +21066,11 @@ static PyObject *__pyx_pf_3_sa_11VEBIterator___next__(struct __pyx_obj_3_sa_VEBI
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__size,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -21323,7 +21083,8 @@ static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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)) {
@@ -21349,7 +21110,7 @@ static int __pyx_pw_3_sa_3VEB_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":360
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":360
  *     cdef int _first(self)
  * 
  *     def __cinit__(self, int size):             # <<<<<<<<<<<<<<
@@ -21362,7 +21123,7 @@ static int __pyx_pf_3_sa_3VEB___cinit__(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":361
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":361
  * 
  *     def __cinit__(self, int size):
  *         self.veb = new_VEB(size)             # <<<<<<<<<<<<<<
@@ -21385,7 +21146,7 @@ static void __pyx_pw_3_sa_3VEB_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":363
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":363
  *         self.veb = new_VEB(size)
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -21401,7 +21162,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":364
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":364
  * 
  *     def __dealloc__(self):
  *         del_VEB(self.veb)             # <<<<<<<<<<<<<<
@@ -21431,7 +21192,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_5__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":366
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":366
  *         del_VEB(self.veb)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -21449,7 +21210,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":368
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":368
  *     def __iter__(self):
  *         cdef VEBIterator it
  *         it = VEBIterator()             # <<<<<<<<<<<<<<
@@ -21461,7 +21222,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":369
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":369
  *         cdef VEBIterator it
  *         it = VEBIterator()
  *         it.v = self.veb             # <<<<<<<<<<<<<<
@@ -21470,7 +21231,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":370
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":370
  *         it = VEBIterator()
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val             # <<<<<<<<<<<<<<
@@ -21479,7 +21240,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":371
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":371
  *         it.v = self.veb
  *         it.next_val = self.veb.min_val
  *         return it             # <<<<<<<<<<<<<<
@@ -21515,7 +21276,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_7insert(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":373
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":373
  *         return it
  * 
  *     def insert(self, i):             # <<<<<<<<<<<<<<
@@ -21533,7 +21294,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":374
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":374
  * 
  *     def insert(self, i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21560,7 +21321,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_6insert(struct __pyx_obj_3_sa_VEB *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":376
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":376
  *         return VEB_insert(self.veb, i)
  * 
  *     cdef int _insert(self, int i):             # <<<<<<<<<<<<<<
@@ -21573,7 +21334,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":377
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":377
  * 
  *     cdef int _insert(self, int i):
  *         return VEB_insert(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21600,7 +21361,7 @@ static PyObject *__pyx_pw_3_sa_3VEB_9findsucc(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":379
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":379
  *         return VEB_insert(self.veb, i)
  * 
  *     def findsucc(self, i):             # <<<<<<<<<<<<<<
@@ -21618,7 +21379,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":380
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":380
  * 
  *     def findsucc(self, i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21645,7 +21406,7 @@ static PyObject *__pyx_pf_3_sa_3VEB_8findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":382
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":382
  *         return VEB_findsucc(self.veb, i)
  * 
  *     cdef int _first(self):             # <<<<<<<<<<<<<<
@@ -21658,7 +21419,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_first", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":383
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":383
  * 
  *     cdef int _first(self):
  *         return self.veb.min_val             # <<<<<<<<<<<<<<
@@ -21674,7 +21435,7 @@ static int __pyx_f_3_sa_3VEB__first(struct __pyx_obj_3_sa_VEB *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":385
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":385
  *         return self.veb.min_val
  * 
  *     cdef int _findsucc(self, int i):             # <<<<<<<<<<<<<<
@@ -21687,7 +21448,7 @@ static int __pyx_f_3_sa_3VEB__findsucc(struct __pyx_obj_3_sa_VEB *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_findsucc", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":386
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":386
  * 
  *     cdef int _findsucc(self, int i):
  *         return VEB_findsucc(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21714,7 +21475,7 @@ static Py_ssize_t __pyx_pw_3_sa_3VEB_11__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":388
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":388
  *         return VEB_findsucc(self.veb, i)
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -21727,7 +21488,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":389
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":389
  * 
  *     def __len__(self):
  *         return self.veb.size             # <<<<<<<<<<<<<<
@@ -21754,7 +21515,7 @@ static int __pyx_pw_3_sa_3VEB_13__contains__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":391
+/* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":391
  *         return self.veb.size
  * 
  *     def __contains__(self, i):             # <<<<<<<<<<<<<<
@@ -21770,7 +21531,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":392
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":392
  * 
  *     def __contains__(self, i):
  *         return VEB_contains(self.veb, i)             # <<<<<<<<<<<<<<
@@ -21793,11 +21554,11 @@ static int __pyx_pf_3_sa_3VEB_12__contains__(struct __pyx_obj_3_sa_VEB *__pyx_v_
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sa,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -21810,7 +21571,8 @@ static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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)) {
@@ -21841,7 +21603,7 @@ static int __pyx_pw_3_sa_3LCP_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":9
+/* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":9
  *     cdef IntList lcp
  * 
  *     def __cinit__(self, SuffixArray sa):             # <<<<<<<<<<<<<<
@@ -21870,7 +21632,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -21887,7 +21649,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":14
  * 
  *         logger.info("Constructing LCP array")
  *         self.sa = sa             # <<<<<<<<<<<<<<
@@ -21900,7 +21662,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":15
  *         logger.info("Constructing LCP array")
  *         self.sa = sa
  *         n = self.sa.sa.len             # <<<<<<<<<<<<<<
@@ -21909,7 +21671,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":16
  *         self.sa = sa
  *         n = self.sa.sa.len
  *         self.lcp = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -21931,7 +21693,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":18
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":18
  *         self.lcp = IntList(initial_len=n)
  * 
  *         rank = IntList(initial_len=n)             # <<<<<<<<<<<<<<
@@ -21950,7 +21712,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":19
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":19
  * 
  *         rank = IntList(initial_len=n)
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21960,7 +21722,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":20
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -21970,7 +21732,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":22
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":22
  *             rank.arr[sa.sa.arr[i]] = i
  * 
  *         h = 0             # <<<<<<<<<<<<<<
@@ -21979,7 +21741,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
  */
   __pyx_v_h = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":23
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":23
  * 
  *         h = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -21989,7 +21751,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":24
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":24
  *         h = 0
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]             # <<<<<<<<<<<<<<
@@ -21998,7 +21760,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":25
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":25
  *         for i from 0 <= i < n:
  *             k = rank.arr[i]
  *             if k == 0:             # <<<<<<<<<<<<<<
@@ -22008,7 +21770,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":26
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":26
  *             k = rank.arr[i]
  *             if k == 0:
  *                 self.lcp.arr[k] = -1             # <<<<<<<<<<<<<<
@@ -22020,7 +21782,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":28
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":28
  *                 self.lcp.arr[k] = -1
  *             else:
  *                 j = sa.sa.arr[k-1]             # <<<<<<<<<<<<<<
@@ -22029,7 +21791,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)]);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":29
+      /* "/home/paulb/workspace/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]:             # <<<<<<<<<<<<<<
@@ -22052,7 +21814,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
         }
         if (!__pyx_t_5) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":30
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22062,7 +21824,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);
       }
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":31
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22073,7 +21835,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":32
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":32
  *                     h = h+1
  *                 self.lcp.arr[k] = h
  *             if h > 0:             # <<<<<<<<<<<<<<
@@ -22083,7 +21845,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":33
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":33
  *                 self.lcp.arr[k] = h
  *             if h > 0:
  *                 h = h-1             # <<<<<<<<<<<<<<
@@ -22096,7 +21858,7 @@ static int __pyx_pf_3_sa_3LCP___cinit__(struct __pyx_obj_3_sa_LCP *__pyx_v_self,
     __pyx_L10:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -22149,7 +21911,7 @@ static PyObject *__pyx_pw_3_sa_3LCP_3compute_stats(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":36
+/* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":36
  *         logger.info("LCP array completed")
  * 
  *     def compute_stats(self, int max_n):             # <<<<<<<<<<<<<<
@@ -22220,7 +21982,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;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":48
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":48
  *         cdef VEB veb
  * 
  *         N = self.sa.sa.len             # <<<<<<<<<<<<<<
@@ -22229,7 +21991,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":50
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":50
  *         N = self.sa.sa.len
  * 
  *         ngram_starts = []             # <<<<<<<<<<<<<<
@@ -22242,7 +22004,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":51
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":51
  * 
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -22252,7 +22014,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":52
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":52
  *         ngram_starts = []
  *         for n from 0 <= n < max_n:
  *             ngram_starts.append(IntList(initial_len=N))             # <<<<<<<<<<<<<<
@@ -22272,7 +22034,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":54
  *             ngram_starts.append(IntList(initial_len=N))
  * 
  *         run_start = IntList(initial_len=max_n)             # <<<<<<<<<<<<<<
@@ -22292,7 +22054,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":55
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":55
  * 
  *         run_start = IntList(initial_len=max_n)
  *         veb = VEB(N)             # <<<<<<<<<<<<<<
@@ -22313,7 +22075,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":57
  *         veb = VEB(N)
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -22323,7 +22085,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":58
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":58
  * 
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]             # <<<<<<<<<<<<<<
@@ -22332,7 +22094,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":59
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":59
  *         for i from 0 <= i < N:
  *             h = self.lcp.arr[i]
  *             if h < 0:             # <<<<<<<<<<<<<<
@@ -22342,7 +22104,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":60
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":60
  *             h = self.lcp.arr[i]
  *             if h < 0:
  *                 h = 0             # <<<<<<<<<<<<<<
@@ -22354,7 +22116,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
     __pyx_L8:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":61
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":61
  *             if h < 0:
  *                 h = 0
  *             for n from h <= n < max_n:             # <<<<<<<<<<<<<<
@@ -22364,7 +22126,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++) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":62
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":62
  *                 h = 0
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]             # <<<<<<<<<<<<<<
@@ -22373,7 +22135,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]);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":63
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":63
  *             for n from h <= n < max_n:
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i             # <<<<<<<<<<<<<<
@@ -22382,7 +22144,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":64
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":64
  *                 rs = run_start.arr[n]
  *                 run_start.arr[n] = i
  *                 freq = i - rs             # <<<<<<<<<<<<<<
@@ -22391,7 +22153,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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":65
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":65
  *                 run_start.arr[n] = i
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below             # <<<<<<<<<<<<<<
@@ -22401,7 +22163,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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":66
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":66
  *                 freq = i - rs
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)             # <<<<<<<<<<<<<<
@@ -22410,7 +22172,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":67
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":67
  *                 if freq > 1000: # arbitrary, but see note below
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -22426,7 +22188,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":68
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":68
  *                     veb._insert(freq)
  *                     ngram_start = ngram_starts[n]
  *                     while ngram_start.arr[freq] > 0:             # <<<<<<<<<<<<<<
@@ -22437,7 +22199,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":69
+          /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22447,7 +22209,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);
         }
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":70
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22461,7 +22223,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
     }
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":71
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22470,7 +22232,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":72
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":72
  *                     ngram_start.arr[freq] = rs
  *         i = veb.veb.min_val
  *         while i != -1:             # <<<<<<<<<<<<<<
@@ -22481,7 +22243,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":73
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":73
  *         i = veb.veb.min_val
  *         while i != -1:
  *             ii = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -22490,7 +22252,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":74
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":74
  *         while i != -1:
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:             # <<<<<<<<<<<<<<
@@ -22500,7 +22262,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++) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":75
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":75
  *             ii = veb._findsucc(i)
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]             # <<<<<<<<<<<<<<
@@ -22516,7 +22278,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":76
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":76
  *             for n from 0 <= n < max_n:
  *                 ngram_start = ngram_starts[n]
  *                 iii = i             # <<<<<<<<<<<<<<
@@ -22525,7 +22287,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":77
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":77
  *                 ngram_start = ngram_starts[n]
  *                 iii = i
  *                 rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -22534,7 +22296,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]);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":78
+      /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":78
  *                 iii = i
  *                 rs = ngram_start.arr[iii]
  *                 while (ii==-1 or iii < ii) and rs != 0:             # <<<<<<<<<<<<<<
@@ -22557,7 +22319,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":79
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -22566,7 +22328,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":80
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":80
  *                 while (ii==-1 or iii < ii) and rs != 0:
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1             # <<<<<<<<<<<<<<
@@ -22575,7 +22337,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         __pyx_cur_scope->__pyx_v_valid = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":81
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":81
  *                     j = self.sa.sa.arr[rs]
  *                     valid = 1
  *                     for k from 0 <= k < n+1:             # <<<<<<<<<<<<<<
@@ -22585,7 +22347,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++) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":82
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -22595,7 +22357,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) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":83
+            /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22608,7 +22370,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
           __pyx_L22:;
         }
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":84
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":84
  *                         if self.sa.darray.data.arr[j+k] < 2:
  *                             valid = 0
  *                     if valid:             # <<<<<<<<<<<<<<
@@ -22617,7 +22379,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
  */
         if (__pyx_cur_scope->__pyx_v_valid) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":85
+          /* "/home/paulb/workspace/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)])             # <<<<<<<<<<<<<<
@@ -22631,7 +22393,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
             __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_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;}
@@ -22643,7 +22405,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":86
+          /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22680,7 +22442,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
         }
         __pyx_L23:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":87
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -22689,7 +22451,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":88
+        /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":88
  *                         yield i, n+1, ngram
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]             # <<<<<<<<<<<<<<
@@ -22699,7 +22461,7 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
       }
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":89
+    /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":89
  *                     iii = iii + 1
  *                     rs = ngram_start.arr[iii]
  *             i = ii             # <<<<<<<<<<<<<<
@@ -22716,7 +22478,6 @@ static PyObject *__pyx_gb_3_sa_3LCP_4generator1(__pyx_GeneratorObject *__pyx_gen
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -22735,7 +22496,7 @@ static int __pyx_pw_3_sa_8Alphabet_1__cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":12
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":12
  *     cdef dict id2sym
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -22752,7 +22513,7 @@ static int __pyx_pf_3_sa_8Alphabet___cinit__(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":13
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":13
  * 
  *     def __cinit__(self):
  *         self.terminals = StringMap()             # <<<<<<<<<<<<<<
@@ -22767,7 +22528,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":14
  *     def __cinit__(self):
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()             # <<<<<<<<<<<<<<
@@ -22782,7 +22543,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":15
  *         self.terminals = StringMap()
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}             # <<<<<<<<<<<<<<
@@ -22797,7 +22558,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":16
  *         self.nonterminals = StringMap()
  *         self.id2sym = {}
  *         self.first_nonterminal = -1             # <<<<<<<<<<<<<<
@@ -22826,7 +22587,7 @@ static void __pyx_pw_3_sa_8Alphabet_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":18
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":18
  *         self.first_nonterminal = -1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -22841,7 +22602,7 @@ static void __pyx_pf_3_sa_8Alphabet_2__dealloc__(CYTHON_UNUSED struct __pyx_obj_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":21
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":21
  *         pass
  * 
  *     cdef int isvar(self, int sym):             # <<<<<<<<<<<<<<
@@ -22854,7 +22615,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("isvar", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":22
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":22
  * 
  *     cdef int isvar(self, int sym):
  *         return sym < 0             # <<<<<<<<<<<<<<
@@ -22870,7 +22631,7 @@ static int __pyx_f_3_sa_8Alphabet_isvar(CYTHON_UNUSED struct __pyx_obj_3_sa_Alph
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":24
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":24
  *         return sym < 0
  * 
  *     cdef int isword(self, int sym):             # <<<<<<<<<<<<<<
@@ -22883,7 +22644,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("isword", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":25
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":25
  * 
  *     cdef int isword(self, int sym):
  *         return sym >= 0             # <<<<<<<<<<<<<<
@@ -22899,7 +22660,7 @@ static int __pyx_f_3_sa_8Alphabet_isword(CYTHON_UNUSED struct __pyx_obj_3_sa_Alp
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":27
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":27
  *         return sym >= 0
  * 
  *     cdef int getindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -22912,7 +22673,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("getindex", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":28
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":28
  * 
  *     cdef int getindex(self, int sym):
  *         return -sym & INDEX_MASK             # <<<<<<<<<<<<<<
@@ -22928,7 +22689,7 @@ static int __pyx_f_3_sa_8Alphabet_getindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":30
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":30
  *         return -sym & INDEX_MASK
  * 
  *     cdef int setindex(self, int sym, int ind):             # <<<<<<<<<<<<<<
@@ -22941,7 +22702,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("setindex", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":31
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":31
  * 
  *     cdef int setindex(self, int sym, int ind):
  *         return -(-sym & ~INDEX_MASK | ind)             # <<<<<<<<<<<<<<
@@ -22957,7 +22718,7 @@ static int __pyx_f_3_sa_8Alphabet_setindex(CYTHON_UNUSED struct __pyx_obj_3_sa_A
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":33
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":33
  *         return -(-sym & ~INDEX_MASK | ind)
  * 
  *     cdef int clearindex(self, int sym):             # <<<<<<<<<<<<<<
@@ -22970,7 +22731,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("clearindex", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":34
  * 
  *     cdef int clearindex(self, int sym):
  *         return -(-sym& ~INDEX_MASK)             # <<<<<<<<<<<<<<
@@ -22986,7 +22747,7 @@ static int __pyx_f_3_sa_8Alphabet_clearindex(CYTHON_UNUSED struct __pyx_obj_3_sa
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":36
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":36
  *         return -(-sym& ~INDEX_MASK)
  * 
  *     cdef int match(self, int sym1, int sym2):             # <<<<<<<<<<<<<<
@@ -22999,7 +22760,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("match", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":37
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":37
  * 
  *     cdef int match(self, int sym1, int sym2):
  *         return self.clearindex(sym1) == self.clearindex(sym2);             # <<<<<<<<<<<<<<
@@ -23015,7 +22776,7 @@ static int __pyx_f_3_sa_8Alphabet_match(struct __pyx_obj_3_sa_Alphabet *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":39
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":39
  *         return self.clearindex(sym1) == self.clearindex(sym2);
  * 
  *     cdef char* tocat(self, int sym):             # <<<<<<<<<<<<<<
@@ -23028,7 +22789,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("tocat", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":40
  * 
  *     cdef char* tocat(self, int sym):
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)             # <<<<<<<<<<<<<<
@@ -23044,7 +22805,7 @@ static char *__pyx_f_3_sa_8Alphabet_tocat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":42
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":42
  *         return self.nonterminals.word((-sym >> INDEX_SHIFT)-1)
  * 
  *     cdef int fromcat(self, char *s):             # <<<<<<<<<<<<<<
@@ -23059,7 +22820,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("fromcat", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":44
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":44
  *     cdef int fromcat(self, char *s):
  *         cdef int i
  *         i = self.nonterminals.index(s)             # <<<<<<<<<<<<<<
@@ -23068,7 +22829,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":45
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":45
  *         cdef int i
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:             # <<<<<<<<<<<<<<
@@ -23078,7 +22839,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":46
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":46
  *         i = self.nonterminals.index(s)
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i             # <<<<<<<<<<<<<<
@@ -23090,7 +22851,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":47
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":47
  *         if self.first_nonterminal == -1:
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:             # <<<<<<<<<<<<<<
@@ -23100,7 +22861,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":48
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":48
  *             self.first_nonterminal = i
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i             # <<<<<<<<<<<<<<
@@ -23112,7 +22873,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":49
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":49
  *         if i > self.last_nonterminal:
  *             self.last_nonterminal = i
  *         return -(i+1 << INDEX_SHIFT)             # <<<<<<<<<<<<<<
@@ -23128,7 +22889,7 @@ static int __pyx_f_3_sa_8Alphabet_fromcat(struct __pyx_obj_3_sa_Alphabet *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":51
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":51
  *         return -(i+1 << INDEX_SHIFT)
  * 
  *     cdef char* tostring(self, int sym):             # <<<<<<<<<<<<<<
@@ -23151,7 +22912,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("tostring", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":53
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":53
  *     cdef char* tostring(self, int sym):
  *         cdef int ind
  *         if self.isvar(sym):             # <<<<<<<<<<<<<<
@@ -23161,7 +22922,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":54
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":54
  *         cdef int ind
  *         if self.isvar(sym):
  *             if sym in self.id2sym:             # <<<<<<<<<<<<<<
@@ -23171,24 +22932,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":55
+      /* "/home/paulb/workspace/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;}
@@ -23199,7 +22955,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":56
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":56
  *             if sym in self.id2sym:
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)             # <<<<<<<<<<<<<<
@@ -23208,7 +22964,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":57
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":57
  *                 return self.id2sym[sym]
  *             ind = self.getindex(sym)
  *             if ind > 0:             # <<<<<<<<<<<<<<
@@ -23218,7 +22974,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":58
+      /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":58
  *             ind = self.getindex(sym)
  *             if ind > 0:
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)             # <<<<<<<<<<<<<<
@@ -23240,17 +22996,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*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":60
+      /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":60
  *                 self.id2sym[sym] = "[%s,%d]" % (self.tocat(sym), ind)
  *             else:
  *                 self.id2sym[sym] = "[%s]" % self.tocat(sym)             # <<<<<<<<<<<<<<
@@ -23262,26 +23014,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:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":61
+    /* "/home/paulb/workspace/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;}
@@ -23292,7 +23036,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":63
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":63
  *             return self.id2sym[sym]
  *         else:
  *             return self.terminals.word(sym)             # <<<<<<<<<<<<<<
@@ -23317,7 +23061,7 @@ static char *__pyx_f_3_sa_8Alphabet_tostring(struct __pyx_obj_3_sa_Alphabet *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":65
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":65
  *             return self.terminals.word(sym)
  * 
  *     cdef int fromstring(self, char *s, bint terminal):             # <<<<<<<<<<<<<<
@@ -23345,7 +23089,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("fromstring", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":69
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":69
  *         cdef char *comma
  *         cdef int n
  *         n = strlen(s)             # <<<<<<<<<<<<<<
@@ -23354,7 +23098,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
   __pyx_v_n = strlen(__pyx_v_s);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":71
  *         n = strlen(s)
  *         cdef char *sep
  *         sep = strstr(s,"_SEP_")             # <<<<<<<<<<<<<<
@@ -23363,7 +23107,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":72
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -23391,7 +23135,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":73
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -23400,7 +23144,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     if (__pyx_v_terminal) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":74
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -23415,7 +23159,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":75
+      /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":75
  *             if terminal:
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)             # <<<<<<<<<<<<<<
@@ -23429,7 +23173,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":76
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":76
  *                 s1 = "\\"+s
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'             # <<<<<<<<<<<<<<
@@ -23438,7 +23182,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":77
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":77
  *                 return self.terminals.index(s1)
  *             s[n-1] = c'\0'
  *             s = s + 1             # <<<<<<<<<<<<<<
@@ -23447,7 +23191,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_s = (__pyx_v_s + 1);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":78
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":78
  *             s[n-1] = c'\0'
  *             s = s + 1
  *             comma = strrchr(s, c',')             # <<<<<<<<<<<<<<
@@ -23456,7 +23200,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
     __pyx_v_comma = strrchr(__pyx_v_s, ',');
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":79
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":79
  *             s = s + 1
  *             comma = strrchr(s, c',')
  *             if comma != NULL:             # <<<<<<<<<<<<<<
@@ -23466,7 +23210,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/pauldb/workspace/cdec/python/src/sa/sym.pxi":80
+      /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":80
  *             comma = strrchr(s, c',')
  *             if comma != NULL:
  *                 comma[0] = c'\0'             # <<<<<<<<<<<<<<
@@ -23475,7 +23219,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
  */
       (__pyx_v_comma[0]) = '\x00';
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":81
+      /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -23488,7 +23232,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":83
+      /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":83
  *                 return self.setindex(self.fromcat(s), strtol(comma+1, NULL, 10))
  *             else:
  *                 return self.fromcat(s)             # <<<<<<<<<<<<<<
@@ -23503,7 +23247,7 @@ static int __pyx_f_3_sa_8Alphabet_fromstring(struct __pyx_obj_3_sa_Alphabet *__p
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":85
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":85
  *                 return self.fromcat(s)
  *         else:
  *             return self.terminals.index(s)             # <<<<<<<<<<<<<<
@@ -23539,7 +23283,7 @@ static PyObject *__pyx_pw_3_sa_8Alphabet_9terminals_1__get__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":8
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":8
  * 
  * cdef class Alphabet:
  *     cdef readonly StringMap terminals, nonterminals             # <<<<<<<<<<<<<<
@@ -23590,7 +23334,7 @@ static PyObject *__pyx_pf_3_sa_8Alphabet_12nonterminals___get__(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":89
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":89
  * cdef Alphabet ALPHABET = Alphabet()
  * 
  * cdef char* sym_tostring(int sym):             # <<<<<<<<<<<<<<
@@ -23603,7 +23347,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_tostring", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":90
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":90
  * 
  * cdef char* sym_tostring(int sym):
  *     return ALPHABET.tostring(sym)             # <<<<<<<<<<<<<<
@@ -23619,7 +23363,7 @@ static char *__pyx_f_3_sa_sym_tostring(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":92
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":92
  *     return ALPHABET.tostring(sym)
  * 
  * cdef char* sym_tocat(int sym):             # <<<<<<<<<<<<<<
@@ -23632,7 +23376,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_tocat", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":93
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":93
  * 
  * cdef char* sym_tocat(int sym):
  *     return ALPHABET.tocat(sym)             # <<<<<<<<<<<<<<
@@ -23648,7 +23392,7 @@ static char *__pyx_f_3_sa_sym_tocat(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":95
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":95
  *     return ALPHABET.tocat(sym)
  * 
  * cdef int sym_isvar(int sym):             # <<<<<<<<<<<<<<
@@ -23661,7 +23405,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_isvar", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":96
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":96
  * 
  * cdef int sym_isvar(int sym):
  *     return ALPHABET.isvar(sym)             # <<<<<<<<<<<<<<
@@ -23677,7 +23421,7 @@ static int __pyx_f_3_sa_sym_isvar(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":98
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":98
  *     return ALPHABET.isvar(sym)
  * 
  * cdef int sym_getindex(int sym):             # <<<<<<<<<<<<<<
@@ -23690,7 +23434,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_getindex", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":99
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":99
  * 
  * cdef int sym_getindex(int sym):
  *     return ALPHABET.getindex(sym)             # <<<<<<<<<<<<<<
@@ -23706,7 +23450,7 @@ static int __pyx_f_3_sa_sym_getindex(int __pyx_v_sym) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":101
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":101
  *     return ALPHABET.getindex(sym)
  * 
  * cdef int sym_setindex(int sym, int id):             # <<<<<<<<<<<<<<
@@ -23719,7 +23463,7 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_setindex", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":102
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":102
  * 
  * cdef int sym_setindex(int sym, int id):
  *     return ALPHABET.setindex(sym, id)             # <<<<<<<<<<<<<<
@@ -23735,7 +23479,7 @@ static int __pyx_f_3_sa_sym_setindex(int __pyx_v_sym, int __pyx_v_id) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":104
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":104
  *     return ALPHABET.setindex(sym, id)
  * 
  * cdef int sym_fromstring(char* string, bint terminal):             # <<<<<<<<<<<<<<
@@ -23748,7 +23492,7 @@ static int __pyx_f_3_sa_sym_fromstring(char *__pyx_v_string, int __pyx_v_termina
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("sym_fromstring", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":105
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":105
  * 
  * cdef int sym_fromstring(char* string, bint terminal):
  *     return ALPHABET.fromstring(string, terminal)             # <<<<<<<<<<<<<<
@@ -23771,12 +23515,13 @@ static PyObject *__pyx_pw_3_sa_5isvar(PyObject *__pyx_self, PyObject *__pyx_v_sy
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("isvar (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_4isvar(__pyx_self, ((PyObject *)__pyx_v_sym));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":107
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def isvar(sym):             # <<<<<<<<<<<<<<
@@ -23794,7 +23539,7 @@ static PyObject *__pyx_pf_3_sa_4isvar(CYTHON_UNUSED PyObject *__pyx_self, PyObje
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("isvar", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":108
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":108
  * 
  * def isvar(sym):
  *     return sym_isvar(sym)             # <<<<<<<<<<<<<<
@@ -23828,13 +23573,14 @@ static PyObject *__pyx_pw_3_sa_7make_lattice(PyObject *__pyx_self, PyObject *__p
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("make_lattice (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_6make_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 */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":111
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":111
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -23910,18 +23656,10 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject
   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 = 111; __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 = 111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 111; __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 = 111; __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)) {
@@ -23970,13 +23708,12 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_2generator7(__pyx_GeneratorObject
   __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 */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":112
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":112
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -24052,18 +23789,10 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject
   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 = 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
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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
+      __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)) {
@@ -24126,12 +23855,11 @@ static PyObject *__pyx_gb_3_sa_12make_lattice_5generator8(__pyx_GeneratorObject
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":110
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":110
  *     return sym_isvar(sym)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -24159,7 +23887,7 @@ static PyObject *__pyx_pf_3_sa_6make_lattice(CYTHON_UNUSED PyObject *__pyx_self,
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_words);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":111
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":111
  * 
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -24172,7 +23900,7 @@ static PyObject *__pyx_pf_3_sa_6make_lattice(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_cur_scope->__pyx_v_word_ids = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":112
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":112
  * def make_lattice(words):
  *     word_ids = (sym_fromstring(word, True) for word in words)
  *     return tuple(((word, None, 1), ) for word in word_ids)             # <<<<<<<<<<<<<<
@@ -24215,13 +23943,14 @@ static PyObject *__pyx_pw_3_sa_9decode_lattice(PyObject *__pyx_self, PyObject *_
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("decode_lattice (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_8decode_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 */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":115
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":115
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24295,7 +24024,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 = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":116
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":116
  * 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)             # <<<<<<<<<<<<<<
@@ -24313,7 +24042,7 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
   }
   for (;;) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":115
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":115
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24322,18 +24051,10 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
  */
     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 = 115; __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 = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 115; __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 = 115; __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)) {
@@ -24347,22 +24068,21 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
     }
     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 = 115; __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[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __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 {
+        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[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -24370,14 +24090,8 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
       __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 = 115; __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 = 115; __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 = 115; __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_8 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
@@ -24390,13 +24104,12 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
       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 = 115; __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);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[10]; __pyx_lineno = 115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L7_unpacking_done:;
     }
@@ -24416,7 +24129,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":116
+    /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":116
  * 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)             # <<<<<<<<<<<<<<
@@ -24435,18 +24148,10 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
     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 = 116; __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 = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_7); __pyx_t_10++;
       } 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 = 116; __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 = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_7); __pyx_t_10++;
       } else {
         __pyx_t_7 = __pyx_t_11(__pyx_t_4);
         if (unlikely(!__pyx_t_7)) {
@@ -24475,18 +24180,10 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
       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 = 116; __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 = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_6 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_6); __pyx_t_12++;
         } 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 = 116; __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 = 116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_12); __Pyx_INCREF(__pyx_t_6); __pyx_t_12++;
         } else {
           __pyx_t_6 = __pyx_t_13(__pyx_t_7);
           if (unlikely(!__pyx_t_6)) {
@@ -24504,7 +24201,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":115
+        /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":115
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24580,12 +24277,11 @@ static PyObject *__pyx_gb_3_sa_14decode_lattice_2generator9(__pyx_GeneratorObjec
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":114
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":114
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -24613,7 +24309,7 @@ static PyObject *__pyx_pf_3_sa_8decode_lattice(CYTHON_UNUSED PyObject *__pyx_sel
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":115
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":115
  * 
  * def decode_lattice(lattice):
  *     return tuple((sym_tostring(sym), weight, dist) for (sym, weight, dist) in arc             # <<<<<<<<<<<<<<
@@ -24656,13 +24352,14 @@ static PyObject *__pyx_pw_3_sa_11decode_sentence(PyObject *__pyx_self, PyObject
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("decode_sentence (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_10decode_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 */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":119
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":119
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -24744,18 +24441,10 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
   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 = 119; __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 = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 119; __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 = 119; __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)) {
@@ -24769,29 +24458,24 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
     }
     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 = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      #if CYTHON_COMPILING_IN_CPYTHON
       if (likely(PyTuple_CheckExact(sequence))) {
+        if (unlikely(PyTuple_GET_SIZE(sequence) != 1)) {
+          if (PyTuple_GET_SIZE(sequence) > 1) __Pyx_RaiseTooManyValuesError(1);
+          else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
       } else {
+        if (unlikely(PyList_GET_SIZE(sequence) != 1)) {
+          if (PyList_GET_SIZE(sequence) > 1) __Pyx_RaiseTooManyValuesError(1);
+          else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+          {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __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 = 119; __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_6 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
@@ -24800,34 +24484,32 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
       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 = 119; __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);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __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 = 119; __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[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __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 {
+        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[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -24835,14 +24517,8 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
       __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 = 119; __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 = 119; __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 = 119; __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_10 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
@@ -24855,13 +24531,12 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
       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 = 119; __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);
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
       {__pyx_filename = __pyx_f[10]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L9_unpacking_done:;
     }
@@ -24917,12 +24592,11 @@ static PyObject *__pyx_gb_3_sa_15decode_sentence_2generator10(__pyx_GeneratorObj
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":118
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":118
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -24950,7 +24624,7 @@ static PyObject *__pyx_pf_3_sa_10decode_sentence(CYTHON_UNUSED PyObject *__pyx_s
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_lattice);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_lattice);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":119
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":119
  * 
  * def decode_sentence(lattice):
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)             # <<<<<<<<<<<<<<
@@ -24993,13 +24667,14 @@ static PyObject *__pyx_pw_3_sa_13encode_words(PyObject *__pyx_self, PyObject *__
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("encode_words (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_12encode_words(__pyx_self, ((PyObject *)__pyx_v_words));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 static PyObject *__pyx_gb_3_sa_12encode_words_2generator11(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":122
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":122
  * 
  * def encode_words(words):
  *     return tuple(sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -25075,18 +24750,10 @@ static PyObject *__pyx_gb_3_sa_12encode_words_2generator11(__pyx_GeneratorObject
   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 = 122; __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 = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 122; __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 = 122; __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)) {
@@ -25135,12 +24802,11 @@ static PyObject *__pyx_gb_3_sa_12encode_words_2generator11(__pyx_GeneratorObject
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":121
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":121
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  * 
  * def encode_words(words):             # <<<<<<<<<<<<<<
@@ -25168,7 +24834,7 @@ static PyObject *__pyx_pf_3_sa_12encode_words(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_words);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":122
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":122
  * 
  * def encode_words(words):
  *     return tuple(sym_fromstring(word, True) for word in words)             # <<<<<<<<<<<<<<
@@ -25211,13 +24877,14 @@ static PyObject *__pyx_pw_3_sa_15decode_words(PyObject *__pyx_self, PyObject *__
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("decode_words (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_pf_3_sa_14decode_words(__pyx_self, ((PyObject *)__pyx_v_syms));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 static PyObject *__pyx_gb_3_sa_12decode_words_2generator12(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":125
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":125
  * 
  * def decode_words(syms):
  *     return tuple(sym_tostring(sym) for sym in syms)             # <<<<<<<<<<<<<<
@@ -25291,18 +24958,10 @@ static PyObject *__pyx_gb_3_sa_12decode_words_2generator12(__pyx_GeneratorObject
   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 = 125; __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 = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 125; __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 = 125; __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)) {
@@ -25351,12 +25010,11 @@ static PyObject *__pyx_gb_3_sa_12decode_words_2generator12(__pyx_GeneratorObject
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":124
+/* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":124
  *     return tuple(sym_fromstring(word, True) for word in words)
  * 
  * def decode_words(syms):             # <<<<<<<<<<<<<<
@@ -25383,7 +25041,7 @@ static PyObject *__pyx_pf_3_sa_14decode_words(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_syms);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_syms);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":125
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":125
  * 
  * def decode_words(syms):
  *     return tuple(sym_tostring(sym) for sym in syms)             # <<<<<<<<<<<<<<
@@ -25421,11 +25079,11 @@ static PyObject *__pyx_pf_3_sa_14decode_words(CYTHON_UNUSED PyObject *__pyx_self
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__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;
@@ -25438,7 +25096,8 @@ static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__
       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--;
+        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)) {
@@ -25464,7 +25123,7 @@ static int __pyx_pw_3_sa_6Phrase_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":6
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":6
  * cdef class Phrase:
  * 
  *     def __cinit__(self, words):             # <<<<<<<<<<<<<<
@@ -25488,7 +25147,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":8
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":8
  *     def __cinit__(self, words):
  *         cdef int i, j, n, n_vars
  *         n_vars = 0             # <<<<<<<<<<<<<<
@@ -25497,7 +25156,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_n_vars = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":9
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":9
  *         cdef int i, j, n, n_vars
  *         n_vars = 0
  *         n = len(words)             # <<<<<<<<<<<<<<
@@ -25507,7 +25166,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":10
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":10
  *         n_vars = 0
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25516,7 +25175,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":11
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":11
  *         n = len(words)
  *         self.syms = <int *>malloc(n*sizeof(int))
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -25526,7 +25185,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":12
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -25539,7 +25198,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":13
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":13
  *         for i from 0 <= i < n:
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -25549,7 +25208,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":14
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":14
  *             self.syms[i] = words[i]
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1             # <<<<<<<<<<<<<<
@@ -25562,7 +25221,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":15
  *             if sym_isvar(self.syms[i]):
  *                 n_vars += 1
  *         self.n = n             # <<<<<<<<<<<<<<
@@ -25571,7 +25230,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_self->n = __pyx_v_n;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":16
  *                 n_vars += 1
  *         self.n = n
  *         self.n_vars = n_vars             # <<<<<<<<<<<<<<
@@ -25580,7 +25239,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":17
  *         self.n = n
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))             # <<<<<<<<<<<<<<
@@ -25589,7 +25248,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":18
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":18
  *         self.n_vars = n_vars
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0             # <<<<<<<<<<<<<<
@@ -25598,7 +25257,7 @@ static int __pyx_pf_3_sa_6Phrase___cinit__(struct __pyx_obj_3_sa_Phrase *__pyx_v
  */
   __pyx_v_j = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":19
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":19
  *         self.varpos = <int *>malloc(n_vars*sizeof(int))
  *         j = 0
  *         for i from 0 <= i < n:             # <<<<<<<<<<<<<<
@@ -25608,7 +25267,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":20
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":20
  *         j = 0
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -25618,7 +25277,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":21
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":21
  *         for i from 0 <= i < n:
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i             # <<<<<<<<<<<<<<
@@ -25627,7 +25286,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":22
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":22
  *             if sym_isvar(self.syms[i]):
  *                 self.varpos[j] = i
  *                 j = j + 1             # <<<<<<<<<<<<<<
@@ -25660,7 +25319,7 @@ static void __pyx_pw_3_sa_6Phrase_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":24
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":24
  *                 j = j + 1
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -25672,7 +25331,7 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":25
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":25
  * 
  *     def __dealloc__(self):
  *         free(self.syms)             # <<<<<<<<<<<<<<
@@ -25681,7 +25340,7 @@ static void __pyx_pf_3_sa_6Phrase_2__dealloc__(struct __pyx_obj_3_sa_Phrase *__p
  */
   free(__pyx_v_self->syms);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":26
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":26
  *     def __dealloc__(self):
  *         free(self.syms)
  *         free(self.varpos)             # <<<<<<<<<<<<<<
@@ -25704,7 +25363,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5__str__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":28
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":28
  *         free(self.varpos)
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -25728,7 +25387,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_4__str__(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__str__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":29
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":29
  * 
  *     def __str__(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -25740,7 +25399,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":31
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":31
  *         strs = []
  *         cdef int i, s
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -25750,7 +25409,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":32
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":32
  *         cdef int i, s
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]             # <<<<<<<<<<<<<<
@@ -25759,7 +25418,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":33
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":33
  *         for i from 0 <= i < self.n:
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))             # <<<<<<<<<<<<<<
@@ -25772,7 +25431,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":34
  *             s = self.syms[i]
  *             strs.append(sym_tostring(s))
  *         return ' '.join(strs)             # <<<<<<<<<<<<<<
@@ -25822,7 +25481,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_7handle(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":36
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":36
  *         return ' '.join(strs)
  * 
  *     def handle(self):             # <<<<<<<<<<<<<<
@@ -25846,7 +25505,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("handle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":39
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":39
  *         """return a hashable representation that normalizes the ordering
  *         of the nonterminal indices"""
  *         norm = []             # <<<<<<<<<<<<<<
@@ -25858,7 +25517,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":41
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":41
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -25867,7 +25526,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_i = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":42
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":42
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -25876,7 +25535,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
  */
   __pyx_v_j = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":43
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":43
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
@@ -25886,7 +25545,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":44
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":44
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
@@ -25895,7 +25554,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":45
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":45
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -25905,7 +25564,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":46
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":46
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -25914,7 +25573,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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":47
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":47
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -25926,7 +25585,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_6handle(struct __pyx_obj_3_sa_Phrase *__p
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":48
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":48
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(s)             # <<<<<<<<<<<<<<
@@ -25939,7 +25598,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":49
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":49
  *                 i = i + 1
  *             norm.append(s)
  *         return tuple(norm)             # <<<<<<<<<<<<<<
@@ -25977,7 +25636,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_9strhandle(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":51
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":51
  *         return tuple(norm)
  * 
  *     def strhandle(self):             # <<<<<<<<<<<<<<
@@ -26004,7 +25663,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("strhandle", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":52
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":52
  * 
  *     def strhandle(self):
  *         strs = []             # <<<<<<<<<<<<<<
@@ -26016,7 +25675,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":53
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":53
  *     def strhandle(self):
  *         strs = []
  *         norm = []             # <<<<<<<<<<<<<<
@@ -26028,7 +25687,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":55
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":55
  *         norm = []
  *         cdef int i, j, s
  *         i = 1             # <<<<<<<<<<<<<<
@@ -26037,7 +25696,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_i = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":56
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":56
  *         cdef int i, j, s
  *         i = 1
  *         j = 0             # <<<<<<<<<<<<<<
@@ -26046,7 +25705,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_j = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":57
  *         i = 1
  *         j = 0
  *         for j from 0 <= j < self.n:             # <<<<<<<<<<<<<<
@@ -26056,7 +25715,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":58
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":58
  *         j = 0
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]             # <<<<<<<<<<<<<<
@@ -26065,7 +25724,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":59
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":59
  *         for j from 0 <= j < self.n:
  *             s = self.syms[j]
  *             if sym_isvar(s):             # <<<<<<<<<<<<<<
@@ -26075,7 +25734,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":60
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":60
  *             s = self.syms[j]
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)             # <<<<<<<<<<<<<<
@@ -26084,7 +25743,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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":61
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":61
  *             if sym_isvar(s):
  *                 s = sym_setindex(s,i)
  *                 i = i + 1             # <<<<<<<<<<<<<<
@@ -26096,7 +25755,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_8strhandle(struct __pyx_obj_3_sa_Phrase *
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":62
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":62
  *                 s = sym_setindex(s,i)
  *                 i = i + 1
  *             norm.append(sym_tostring(s))             # <<<<<<<<<<<<<<
@@ -26109,7 +25768,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":63
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":63
  *                 i = i + 1
  *             norm.append(sym_tostring(s))
  *         return ' '.join(norm)             # <<<<<<<<<<<<<<
@@ -26159,7 +25818,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_11arity(PyObject *__pyx_v_self, CYTHON_UN
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":65
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":65
  *         return ' '.join(norm)
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -26176,7 +25835,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_10arity(struct __pyx_obj_3_sa_Phrase *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("arity", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":66
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":66
  * 
  *     def arity(self):
  *         return self.n_vars             # <<<<<<<<<<<<<<
@@ -26213,7 +25872,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_13getvarpos(PyObject *__pyx_v_self, PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":68
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":68
  *         return self.n_vars
  * 
  *     def getvarpos(self, i):             # <<<<<<<<<<<<<<
@@ -26233,26 +25892,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getvarpos", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":69
+  /* "/home/paulb/workspace/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_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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":70
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":70
  *     def getvarpos(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.varpos[i]             # <<<<<<<<<<<<<<
@@ -26270,7 +25931,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_12getvarpos(struct __pyx_obj_3_sa_Phrase
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":72
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":72
  *             return self.varpos[i]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -26306,7 +25967,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_15getvar(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":74
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":74
  *             raise IndexError
  * 
  *     def getvar(self, i):             # <<<<<<<<<<<<<<
@@ -26326,26 +25987,28 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getvar", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":75
+  /* "/home/paulb/workspace/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_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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":76
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":76
  *     def getvar(self, i):
  *         if 0 <= i < self.n_vars:
  *             return self.syms[self.varpos[i]]             # <<<<<<<<<<<<<<
@@ -26363,7 +26026,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":78
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":78
  *             return self.syms[self.varpos[i]]
  *         else:
  *             raise IndexError             # <<<<<<<<<<<<<<
@@ -26388,7 +26051,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_14getvar(struct __pyx_obj_3_sa_Phrase *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":80
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":80
  *             raise IndexError
  * 
  *     cdef int chunkpos(self, int k):             # <<<<<<<<<<<<<<
@@ -26402,7 +26065,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":81
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":81
  * 
  *     cdef int chunkpos(self, int k):
  *         if k == 0:             # <<<<<<<<<<<<<<
@@ -26412,7 +26075,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/pauldb/workspace/cdec/python/src/sa/rule.pxi":82
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":82
  *     cdef int chunkpos(self, int k):
  *         if k == 0:
  *             return 0             # <<<<<<<<<<<<<<
@@ -26425,7 +26088,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":84
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":84
  *             return 0
  *         else:
  *             return self.varpos[k-1]+1             # <<<<<<<<<<<<<<
@@ -26443,7 +26106,7 @@ int __pyx_f_3_sa_6Phrase_chunkpos(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":86
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":86
  *             return self.varpos[k-1]+1
  * 
  *     cdef int chunklen(self, int k):             # <<<<<<<<<<<<<<
@@ -26457,7 +26120,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":87
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":87
  * 
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:             # <<<<<<<<<<<<<<
@@ -26467,7 +26130,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/pauldb/workspace/cdec/python/src/sa/rule.pxi":88
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":88
  *     cdef int chunklen(self, int k):
  *         if self.n_vars == 0:
  *             return self.n             # <<<<<<<<<<<<<<
@@ -26479,7 +26142,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":89
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":89
  *         if self.n_vars == 0:
  *             return self.n
  *         elif k == 0:             # <<<<<<<<<<<<<<
@@ -26489,7 +26152,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/pauldb/workspace/cdec/python/src/sa/rule.pxi":90
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":90
  *             return self.n
  *         elif k == 0:
  *             return self.varpos[0]             # <<<<<<<<<<<<<<
@@ -26501,7 +26164,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":91
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":91
  *         elif k == 0:
  *             return self.varpos[0]
  *         elif k == self.n_vars:             # <<<<<<<<<<<<<<
@@ -26511,7 +26174,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/pauldb/workspace/cdec/python/src/sa/rule.pxi":92
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":92
  *             return self.varpos[0]
  *         elif k == self.n_vars:
  *             return self.n-self.varpos[k-1]-1             # <<<<<<<<<<<<<<
@@ -26524,7 +26187,7 @@ int __pyx_f_3_sa_6Phrase_chunklen(struct __pyx_obj_3_sa_Phrase *__pyx_v_self, in
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":94
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -26553,7 +26216,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_17clen(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":96
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":96
  *             return self.varpos[k]-self.varpos[k-1]-1
  * 
  *     def clen(self, k):             # <<<<<<<<<<<<<<
@@ -26571,7 +26234,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_16clen(struct __pyx_obj_3_sa_Phrase *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("clen", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":97
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":97
  * 
  *     def clen(self, k):
  *          return self.chunklen(k)             # <<<<<<<<<<<<<<
@@ -26609,7 +26272,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_19getchunk(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":99
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":99
  *          return self.chunklen(k)
  * 
  *     def getchunk(self, ci):             # <<<<<<<<<<<<<<
@@ -26632,7 +26295,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("getchunk", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":101
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":101
  *     def getchunk(self, ci):
  *         cdef int start, stop
  *         start = self.chunkpos(ci)             # <<<<<<<<<<<<<<
@@ -26642,7 +26305,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":102
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":102
  *         cdef int start, stop
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)             # <<<<<<<<<<<<<<
@@ -26652,7 +26315,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));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":103
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":103
  *         start = self.chunkpos(ci)
  *         stop = start+self.chunklen(ci)
  *         chunk = []             # <<<<<<<<<<<<<<
@@ -26664,7 +26327,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":104
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":104
  *         stop = start+self.chunklen(ci)
  *         chunk = []
  *         for i from start <= i < stop:             # <<<<<<<<<<<<<<
@@ -26674,7 +26337,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":105
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":105
  *         chunk = []
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])             # <<<<<<<<<<<<<<
@@ -26687,7 +26350,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_18getchunk(struct __pyx_obj_3_sa_Phrase *
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":106
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":106
  *         for i from start <= i < stop:
  *             chunk.append(self.syms[i])
  *         return chunk             # <<<<<<<<<<<<<<
@@ -26725,7 +26388,7 @@ static int __pyx_pw_3_sa_6Phrase_21__cmp__(PyObject *__pyx_v_self, PyObject *__p
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":108
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":108
  *         return chunk
  * 
  *     def __cmp__(self, other):             # <<<<<<<<<<<<<<
@@ -26748,7 +26411,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":111
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":111
  *         cdef Phrase otherp
  *         cdef int i
  *         otherp = other             # <<<<<<<<<<<<<<
@@ -26759,7 +26422,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":112
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":112
  *         cdef int i
  *         otherp = other
  *         for i from 0 <= i < min(self.n, otherp.n):             # <<<<<<<<<<<<<<
@@ -26776,7 +26439,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":113
+    /* "/home/paulb/workspace/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]:             # <<<<<<<<<<<<<<
@@ -26786,7 +26449,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":114
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -26798,7 +26461,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
       goto __pyx_L5;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":115
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":115
  *             if self.syms[i] < otherp.syms[i]:
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:             # <<<<<<<<<<<<<<
@@ -26808,7 +26471,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":116
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":116
  *                 return -1
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -26822,7 +26485,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":117
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":117
  *             elif self.syms[i] > otherp.syms[i]:
  *                 return 1
  *         if self.n < otherp.n:             # <<<<<<<<<<<<<<
@@ -26832,7 +26495,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":118
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":118
  *                 return 1
  *         if self.n < otherp.n:
  *             return -1             # <<<<<<<<<<<<<<
@@ -26844,7 +26507,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
     goto __pyx_L6;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":119
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":119
  *         if self.n < otherp.n:
  *             return -1
  *         elif self.n > otherp.n:             # <<<<<<<<<<<<<<
@@ -26854,7 +26517,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":120
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":120
  *             return -1
  *         elif self.n > otherp.n:
  *             return 1             # <<<<<<<<<<<<<<
@@ -26867,7 +26530,7 @@ static int __pyx_pf_3_sa_6Phrase_20__cmp__(struct __pyx_obj_3_sa_Phrase *__pyx_v
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":122
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":122
  *             return 1
  *         else:
  *             return 0             # <<<<<<<<<<<<<<
@@ -26902,7 +26565,7 @@ static Py_hash_t __pyx_pw_3_sa_6Phrase_23__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":124
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":124
  *             return 0
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -26919,7 +26582,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":127
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":127
  *         cdef int i
  *         cdef unsigned h
  *         h = 0             # <<<<<<<<<<<<<<
@@ -26928,7 +26591,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
  */
   __pyx_v_h = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":128
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":128
  *         cdef unsigned h
  *         h = 0
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -26938,7 +26601,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":129
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":129
  *         h = 0
  *         for i from 0 <= i < self.n:
  *             if self.syms[i] > 0:             # <<<<<<<<<<<<<<
@@ -26948,7 +26611,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":130
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -26960,7 +26623,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":132
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":132
  *                 h = (h << 1) + self.syms[i]
  *             else:
  *                 h = (h << 1) + -self.syms[i]             # <<<<<<<<<<<<<<
@@ -26972,7 +26635,7 @@ static Py_hash_t __pyx_pf_3_sa_6Phrase_22__hash__(struct __pyx_obj_3_sa_Phrase *
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":133
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":133
  *             else:
  *                 h = (h << 1) + -self.syms[i]
  *         return h             # <<<<<<<<<<<<<<
@@ -27000,7 +26663,7 @@ static Py_ssize_t __pyx_pw_3_sa_6Phrase_25__len__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":135
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":135
  *         return h
  * 
  *     def __len__(self):             # <<<<<<<<<<<<<<
@@ -27013,7 +26676,7 @@ static Py_ssize_t __pyx_pf_3_sa_6Phrase_24__len__(struct __pyx_obj_3_sa_Phrase *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__len__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":136
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":136
  * 
  *     def __len__(self):
  *         return self.n             # <<<<<<<<<<<<<<
@@ -27040,7 +26703,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_27__getitem__(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":138
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":138
  *         return self.n
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -27058,7 +26721,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_26__getitem__(struct __pyx_obj_3_sa_Phras
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":139
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":139
  * 
  *     def __getitem__(self, i):
  *         return self.syms[i]             # <<<<<<<<<<<<<<
@@ -27097,7 +26760,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_29__iter__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":141
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":141
  *         return self.syms[i]
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -27159,7 +26822,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;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":143
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":143
  *     def __iter__(self):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -27169,7 +26832,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":144
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":144
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             yield self.syms[i]             # <<<<<<<<<<<<<<
@@ -27198,7 +26861,6 @@ static PyObject *__pyx_gb_3_sa_6Phrase_30generator2(__pyx_GeneratorObject *__pyx
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -27208,11 +26870,11 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__start,&__pyx_n_s__children,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -27226,10 +26888,12 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -27259,7 +26923,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_32subst(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":146
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":146
  *             yield self.syms[i]
  * 
  *     def subst(self, start, children):             # <<<<<<<<<<<<<<
@@ -27282,7 +26946,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":148
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":148
  *     def subst(self, start, children):
  *         cdef int i
  *         for i from 0 <= i < self.n:             # <<<<<<<<<<<<<<
@@ -27292,7 +26956,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":149
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":149
  *         cdef int i
  *         for i from 0 <= i < self.n:
  *             if sym_isvar(self.syms[i]):             # <<<<<<<<<<<<<<
@@ -27302,7 +26966,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":150
+      /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -27322,7 +26986,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":152
+      /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":152
  *                 start = start + children[sym_getindex(self.syms[i])-1]
  *             else:
  *                 start = start + (self.syms[i],)             # <<<<<<<<<<<<<<
@@ -27346,7 +27010,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_31subst(struct __pyx_obj_3_sa_Phrase *__p
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":153
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":153
  *             else:
  *                 start = start + (self.syms[i],)
  *         return start             # <<<<<<<<<<<<<<
@@ -27383,7 +27047,7 @@ static PyObject *__pyx_pw_3_sa_6Phrase_5words_1__get__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":156
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":156
  * 
  *     property words:
  *         def __get__(self):             # <<<<<<<<<<<<<<
@@ -27407,7 +27071,7 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__get__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":157
+  /* "/home/paulb/workspace/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)]             # <<<<<<<<<<<<<<
@@ -27428,18 +27092,10 @@ static PyObject *__pyx_pf_3_sa_6Phrase_5words___get__(struct __pyx_obj_3_sa_Phra
   for (;;) {
     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[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 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_5); __pyx_t_3++;
     } 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[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)) {
@@ -27460,7 +27116,7 @@ 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;
     }
@@ -27495,14 +27151,14 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
   struct __pyx_obj_3_sa_Phrase *__pyx_v_e = 0;
   PyObject *__pyx_v_scores = 0;
   PyObject *__pyx_v_word_alignments = 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};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/rule.pxi":161
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":161
  * cdef class Rule:
  * 
  *     def __cinit__(self, int lhs, Phrase f, Phrase e, scores=None, word_alignments=None):             # <<<<<<<<<<<<<<
@@ -27526,15 +27182,18 @@ static int __pyx_pw_3_sa_4Rule_1__cinit__(PyObject *__pyx_v_self, PyObject *__py
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -27599,7 +27258,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":162
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -27628,7 +27287,7 @@ static int __pyx_pf_3_sa_4Rule___cinit__(struct __pyx_obj_3_sa_Rule *__pyx_v_sel
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":163
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -27637,7 +27296,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":164
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -27650,7 +27309,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":165
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":165
  *         self.lhs = lhs
  *         self.f = f
  *         self.e = e             # <<<<<<<<<<<<<<
@@ -27663,7 +27322,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":166
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":166
  *         self.f = f
  *         self.e = e
  *         self.word_alignments = word_alignments             # <<<<<<<<<<<<<<
@@ -27676,7 +27335,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":167
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":167
  *         self.e = e
  *         self.word_alignments = word_alignments
  *         self.scores = scores             # <<<<<<<<<<<<<<
@@ -27713,7 +27372,7 @@ static Py_hash_t __pyx_pw_3_sa_4Rule_3__hash__(PyObject *__pyx_v_self) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":169
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":169
  *         self.scores = scores
  * 
  *     def __hash__(self):             # <<<<<<<<<<<<<<
@@ -27732,7 +27391,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":170
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":170
  * 
  *     def __hash__(self):
  *         return hash((self.lhs, self.f, self.e))             # <<<<<<<<<<<<<<
@@ -27788,7 +27447,7 @@ static int __pyx_pw_3_sa_4Rule_5__cmp__(PyObject *__pyx_v_self, PyObject *__pyx_
 }
 #endif /*!(#if PY_MAJOR_VERSION < 3)*/
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":172
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":172
  *         return hash((self.lhs, self.f, self.e))
  * 
  *     def __cmp__(self, Rule other):             # <<<<<<<<<<<<<<
@@ -27809,7 +27468,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":173
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":173
  * 
  *     def __cmp__(self, Rule other):
  *         return cmp((self.lhs, self.f, self.e, self.word_alignments),             # <<<<<<<<<<<<<<
@@ -27833,7 +27492,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":174
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -27902,7 +27561,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_7fmerge(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":176
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":176
  *                 (other.lhs, other.f, other.e, self.word_alignments))
  * 
  *     def fmerge(self, Phrase f):             # <<<<<<<<<<<<<<
@@ -27920,19 +27579,20 @@ static PyObject *__pyx_pf_3_sa_4Rule_6fmerge(struct __pyx_obj_3_sa_Rule *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("fmerge", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":177
+  /* "/home/paulb/workspace/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 *)__pyx_v_self->f), ((PyObject *)__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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":178
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":178
  *     def fmerge(self, Phrase f):
  *         if self.f == f:
  *             self.f = f             # <<<<<<<<<<<<<<
@@ -27971,7 +27631,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_9arity(PyObject *__pyx_v_self, CYTHON_UNUSE
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":180
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":180
  *             self.f = f
  * 
  *     def arity(self):             # <<<<<<<<<<<<<<
@@ -27989,7 +27649,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":181
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":181
  * 
  *     def arity(self):
  *         return self.f.arity()             # <<<<<<<<<<<<<<
@@ -28031,7 +27691,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_11__str__(PyObject *__pyx_v_self) {
 }
 static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator13(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":187
+/* "/home/paulb/workspace/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()))             # <<<<<<<<<<<<<<
@@ -28112,18 +27772,10 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator13(__pyx_GeneratorObject
   for (;;) {
     if (!__pyx_t_4 && 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
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
     } else if (!__pyx_t_4 && 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)) {
@@ -28171,12 +27823,11 @@ static PyObject *__pyx_gb_3_sa_4Rule_7__str___2generator13(__pyx_GeneratorObject
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":183
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":183
  *         return self.f.arity()
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -28210,7 +27861,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":185
+  /* "/home/paulb/workspace/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)]             # <<<<<<<<<<<<<<
@@ -28260,7 +27911,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":186
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -28270,7 +27921,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":187
+    /* "/home/paulb/workspace/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()))             # <<<<<<<<<<<<<<
@@ -28296,7 +27947,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_10__str__(struct __pyx_obj_3_sa_Rule *__pyx
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":188
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -28349,7 +28000,7 @@ static PyObject *__pyx_pw_3_sa_4Rule_13alignments(PyObject *__pyx_v_self, CYTHON
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":190
+/* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":190
  *         return ' ||| '.join(fields)
  * 
  *     def alignments(self):             # <<<<<<<<<<<<<<
@@ -28415,7 +28066,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;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":191
+  /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":191
  * 
  *     def alignments(self):
  *         for point in self.word_alignments:             # <<<<<<<<<<<<<<
@@ -28432,18 +28083,10 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   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[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 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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[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)) {
@@ -28461,7 +28104,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rule.pxi":192
+    /* "/home/paulb/workspace/cdec/python/src/sa/rule.pxi":192
  *     def alignments(self):
  *         for point in self.word_alignments:
  *             yield point/65536, point%65536             # <<<<<<<<<<<<<<
@@ -28509,7 +28152,6 @@ static PyObject *__pyx_gb_3_sa_4Rule_14generator3(__pyx_GeneratorObject *__pyx_g
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -28576,7 +28218,7 @@ static PyObject *__pyx_pf_3_sa_4Rule_1e___get__(struct __pyx_obj_3_sa_Rule *__py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":21
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":21
  *     int arr_len
  * 
  * cdef _Trie_Node* new_trie_node():             # <<<<<<<<<<<<<<
@@ -28590,7 +28232,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":23
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":23
  * cdef _Trie_Node* new_trie_node():
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))             # <<<<<<<<<<<<<<
@@ -28599,7 +28241,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":24
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":24
  *     cdef _Trie_Node* node
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL             # <<<<<<<<<<<<<<
@@ -28608,7 +28250,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->root = NULL;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":25
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":25
  *     node = <_Trie_Node*> malloc(sizeof(_Trie_Node))
  *     node.root = NULL
  *     node.arr_len = 0             # <<<<<<<<<<<<<<
@@ -28617,7 +28259,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
  */
   __pyx_v_node->arr_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":26
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":26
  *     node.root = NULL
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))             # <<<<<<<<<<<<<<
@@ -28626,7 +28268,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":27
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":27
  *     node.arr_len = 0
  *     node.arr = <int*> malloc(sizeof(0*sizeof(int)))
  *     return node             # <<<<<<<<<<<<<<
@@ -28642,7 +28284,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_new_trie_node(void) {
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":29
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":29
  *     return node
  * 
  * cdef _Trie_Edge* new_trie_edge(int val):             # <<<<<<<<<<<<<<
@@ -28656,7 +28298,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":31
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -28665,7 +28307,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":32
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":32
  *     cdef _Trie_Edge* edge
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()             # <<<<<<<<<<<<<<
@@ -28674,7 +28316,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":33
  *     edge = <_Trie_Edge*> malloc(sizeof(_Trie_Edge))
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL             # <<<<<<<<<<<<<<
@@ -28683,7 +28325,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":34
  *     edge.node = new_trie_node()
  *     edge.bigger = NULL
  *     edge.smaller = NULL             # <<<<<<<<<<<<<<
@@ -28692,7 +28334,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":35
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":35
  *     edge.bigger = NULL
  *     edge.smaller = NULL
  *     edge.val = val             # <<<<<<<<<<<<<<
@@ -28701,7 +28343,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":36
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":36
  *     edge.smaller = NULL
  *     edge.val = val
  *     return edge             # <<<<<<<<<<<<<<
@@ -28717,7 +28359,7 @@ static struct __pyx_t_3_sa__Trie_Edge *__pyx_f_3_sa_new_trie_edge(int __pyx_v_va
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":38
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":38
  *     return edge
  * 
  * cdef free_trie_node(_Trie_Node* node):             # <<<<<<<<<<<<<<
@@ -28735,7 +28377,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":39
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":39
  * 
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:             # <<<<<<<<<<<<<<
@@ -28745,7 +28387,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":40
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":40
  * cdef free_trie_node(_Trie_Node* node):
  *     if node != NULL:
  *         free_trie_edge(node.root)             # <<<<<<<<<<<<<<
@@ -28756,7 +28398,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":41
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":41
  *     if node != NULL:
  *         free_trie_edge(node.root)
  *         free(node.arr)             # <<<<<<<<<<<<<<
@@ -28780,7 +28422,7 @@ static PyObject *__pyx_f_3_sa_free_trie_node(struct __pyx_t_3_sa__Trie_Node *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":43
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":43
  *         free(node.arr)
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):             # <<<<<<<<<<<<<<
@@ -28798,7 +28440,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":44
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":44
  * 
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -28808,7 +28450,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":45
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":45
  * cdef free_trie_edge(_Trie_Edge* edge):
  *     if edge != NULL:
  *         free_trie_node(edge.node)             # <<<<<<<<<<<<<<
@@ -28819,7 +28461,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":46
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":46
  *     if edge != NULL:
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)             # <<<<<<<<<<<<<<
@@ -28830,7 +28472,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":47
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":47
  *         free_trie_node(edge.node)
  *         free_trie_edge(edge.bigger)
  *         free_trie_edge(edge.smaller)             # <<<<<<<<<<<<<<
@@ -28856,7 +28498,7 @@ static PyObject *__pyx_f_3_sa_free_trie_edge(struct __pyx_t_3_sa__Trie_Edge *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":49
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":49
  *         free_trie_edge(edge.smaller)
  * 
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -28873,7 +28515,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":51
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":51
  * cdef _Trie_Node* trie_find(_Trie_Node* node, int val):
  *     cdef _Trie_Edge* cur
  *     cur = node.root             # <<<<<<<<<<<<<<
@@ -28882,7 +28524,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":52
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":52
  *     cdef _Trie_Edge* cur
  *     cur = node.root
  *     while cur != NULL and cur.val != val:             # <<<<<<<<<<<<<<
@@ -28899,7 +28541,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":53
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":53
  *     cur = node.root
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:             # <<<<<<<<<<<<<<
@@ -28909,7 +28551,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":54
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":54
  *     while cur != NULL and cur.val != val:
  *         if val > cur.val:
  *             cur = cur.bigger             # <<<<<<<<<<<<<<
@@ -28920,7 +28562,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
       goto __pyx_L5;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":55
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":55
  *         if val > cur.val:
  *             cur = cur.bigger
  *         elif val < cur.val:             # <<<<<<<<<<<<<<
@@ -28930,7 +28572,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":56
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":56
  *             cur = cur.bigger
  *         elif val < cur.val:
  *             cur = cur.smaller             # <<<<<<<<<<<<<<
@@ -28943,7 +28585,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":57
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":57
  *         elif val < cur.val:
  *             cur = cur.smaller
  *     if cur == NULL:             # <<<<<<<<<<<<<<
@@ -28953,7 +28595,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":58
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":58
  *             cur = cur.smaller
  *     if cur == NULL:
  *         return NULL             # <<<<<<<<<<<<<<
@@ -28966,7 +28608,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":60
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":60
  *         return NULL
  *     else:
  *         return cur.node             # <<<<<<<<<<<<<<
@@ -28984,7 +28626,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_find(struct __pyx_t_3_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":62
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":62
  *         return cur.node
  * 
  * cdef trie_node_data_append(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -28998,7 +28640,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":64
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29007,7 +28649,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":65
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -29016,7 +28658,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":66
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29025,7 +28667,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":67
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29040,7 +28682,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_append(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":69
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -29054,7 +28696,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":71
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29063,7 +28705,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":72
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -29072,7 +28714,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":73
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -29081,7 +28723,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":74
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29096,7 +28738,7 @@ static PyObject *__pyx_f_3_sa_trie_node_data_extend(struct __pyx_t_3_sa__Trie_No
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":77
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":77
  * 
  * 
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):             # <<<<<<<<<<<<<<
@@ -29113,7 +28755,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":79
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":79
  * cdef _Trie_Node* trie_insert(_Trie_Node* node, int val):
  *     cdef _Trie_Edge** cur
  *     cur = &node.root             # <<<<<<<<<<<<<<
@@ -29122,7 +28764,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":80
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":80
  *     cdef _Trie_Edge** cur
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:             # <<<<<<<<<<<<<<
@@ -29139,7 +28781,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":81
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":81
  *     cur = &node.root
  *     while cur[0] != NULL and cur[0].val != val:
  *         if val > cur[0].val:             # <<<<<<<<<<<<<<
@@ -29149,7 +28791,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":82
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29160,7 +28802,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
       goto __pyx_L5;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":83
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":83
  *         if val > cur[0].val:
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:             # <<<<<<<<<<<<<<
@@ -29170,7 +28812,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":84
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":84
  *             cur = &cur[0].bigger
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller             # <<<<<<<<<<<<<<
@@ -29183,7 +28825,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":85
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":85
  *         elif val < cur[0].val:
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:             # <<<<<<<<<<<<<<
@@ -29193,7 +28835,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":86
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":86
  *             cur = &cur[0].smaller
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)             # <<<<<<<<<<<<<<
@@ -29205,7 +28847,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":87
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":87
  *     if cur[0] == NULL:
  *         cur[0] = new_trie_edge(val)
  *     return cur[0].node             # <<<<<<<<<<<<<<
@@ -29221,7 +28863,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_trie_insert(struct __pyx_t_3
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":89
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":89
  *     return cur[0].node
  * 
  * cdef trie_node_to_map(_Trie_Node* node, result, prefix, int include_zeros):             # <<<<<<<<<<<<<<
@@ -29241,7 +28883,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":92
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":92
  *     cdef IntList arr
  * 
  *     if include_zeros or node.arr_len > 0:             # <<<<<<<<<<<<<<
@@ -29256,7 +28898,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":93
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":93
  * 
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()             # <<<<<<<<<<<<<<
@@ -29268,7 +28910,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":94
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":94
  *     if include_zeros or node.arr_len > 0:
  *         arr = IntList()
  *         free(arr.arr)             # <<<<<<<<<<<<<<
@@ -29277,7 +28919,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
  */
     free(__pyx_v_arr->arr);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":95
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":95
  *         arr = IntList()
  *         free(arr.arr)
  *         arr.arr = <int*> malloc(node.arr_len * sizeof(int))             # <<<<<<<<<<<<<<
@@ -29286,7 +28928,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":96
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -29295,7 +28937,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":97
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29304,7 +28946,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":98
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -29313,7 +28955,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":99
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":99
  *         arr.len = node.arr_len
  *         arr.size = node.arr_len
  *         result[prefix] = arr             # <<<<<<<<<<<<<<
@@ -29325,7 +28967,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":100
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -29349,7 +28991,7 @@ static PyObject *__pyx_f_3_sa_trie_node_to_map(struct __pyx_t_3_sa__Trie_Node *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":102
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -29369,7 +29011,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":103
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":103
  * 
  * cdef trie_edge_to_map(_Trie_Edge* edge, result, prefix, int include_zeros):
  *     if edge != NULL:             # <<<<<<<<<<<<<<
@@ -29379,7 +29021,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":104
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -29390,7 +29032,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":105
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -29401,7 +29043,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":106
+    /* "/home/paulb/workspace/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,)             # <<<<<<<<<<<<<<
@@ -29422,7 +29064,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":107
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -29454,11 +29096,11 @@ static PyObject *__pyx_f_3_sa_trie_edge_to_map(struct __pyx_t_3_sa__Trie_Edge *_
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__alphabet_size,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -29471,7 +29113,8 @@ static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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)) {
@@ -29497,7 +29140,7 @@ static int __pyx_pw_3_sa_7TrieMap_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":114
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":114
  *     cdef int V
  * 
  *     def __cinit__(self, int alphabet_size):             # <<<<<<<<<<<<<<
@@ -29510,7 +29153,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":115
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":115
  * 
  *     def __cinit__(self, int alphabet_size):
  *         self.V = alphabet_size             # <<<<<<<<<<<<<<
@@ -29519,7 +29162,7 @@ static int __pyx_pf_3_sa_7TrieMap___cinit__(struct __pyx_obj_3_sa_TrieMap *__pyx
  */
   __pyx_v_self->V = __pyx_v_alphabet_size;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":116
+  /* "/home/paulb/workspace/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*))             # <<<<<<<<<<<<<<
@@ -29528,7 +29171,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 *)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":117
+  /* "/home/paulb/workspace/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*))             # <<<<<<<<<<<<<<
@@ -29551,7 +29194,7 @@ static void __pyx_pw_3_sa_7TrieMap_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":120
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":120
  * 
  * 
  *     def __dealloc__(self):             # <<<<<<<<<<<<<<
@@ -29570,7 +29213,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__dealloc__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":122
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":122
  *     def __dealloc__(self):
  *         cdef int i
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
@@ -29580,7 +29223,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":123
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":123
  *         cdef int i
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
@@ -29590,7 +29233,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":124
+      /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -29605,7 +29248,7 @@ static void __pyx_pf_3_sa_7TrieMap_2__dealloc__(struct __pyx_obj_3_sa_TrieMap *_
     __pyx_L5:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":125
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":125
  *             if self.root[i] != NULL:
  *                 free_trie_node(self.root[i])
  *         free(self.root)             # <<<<<<<<<<<<<<
@@ -29633,7 +29276,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_5insert(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":128
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":128
  * 
  * 
  *     def insert(self, pattern):             # <<<<<<<<<<<<<<
@@ -29656,7 +29299,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("insert", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":131
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":131
  *         cdef int* p
  *         cdef int i, l
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -29666,7 +29309,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":132
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":132
  *         cdef int i, l
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -29675,7 +29318,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":133
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":133
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -29685,7 +29328,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":134
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":134
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -29699,7 +29342,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":135
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":135
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         self._insert(p,l)             # <<<<<<<<<<<<<<
@@ -29708,7 +29351,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":136
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":136
  *             p[i] = pattern[i]
  *         self._insert(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -29729,7 +29372,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_4insert(struct __pyx_obj_3_sa_TrieMap *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":139
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":139
  * 
  * 
  *     cdef _Trie_Node* _insert(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -29746,7 +29389,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":142
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":142
  *         cdef int i
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:             # <<<<<<<<<<<<<<
@@ -29756,7 +29399,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":143
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":143
  *         cdef _Trie_Node* node
  *         if self.root[pattern[0]] == NULL:
  *             self.root[pattern[0]] = new_trie_node()             # <<<<<<<<<<<<<<
@@ -29768,7 +29411,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__insert(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":144
+  /* "/home/paulb/workspace/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]]             # <<<<<<<<<<<<<<
@@ -29777,7 +29420,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":145
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -29787,7 +29430,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":146
+    /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -29797,7 +29440,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":147
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":147
  *         for i from 1 <= i < pattern_len:
  *             node = trie_insert(node, pattern[i])
  *         return node             # <<<<<<<<<<<<<<
@@ -29824,7 +29467,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_7contains(PyObject *__pyx_v_self, PyObje
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":149
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":149
  *         return node
  * 
  *     def contains(self, pattern):             # <<<<<<<<<<<<<<
@@ -29849,7 +29492,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":153
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":153
  *         cdef int i, l
  *         cdef _Trie_Node* node
  *         l = len(pattern)             # <<<<<<<<<<<<<<
@@ -29859,7 +29502,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":154
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":154
  *         cdef _Trie_Node* node
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))             # <<<<<<<<<<<<<<
@@ -29868,7 +29511,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":155
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":155
  *         l = len(pattern)
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:             # <<<<<<<<<<<<<<
@@ -29878,7 +29521,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":156
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":156
  *         p = <int*> malloc(l*sizeof(int))
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]             # <<<<<<<<<<<<<<
@@ -29892,7 +29535,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
     (__pyx_v_p[__pyx_v_i]) = __pyx_t_4;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":157
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":157
  *         for i from 0 <= i < l:
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)             # <<<<<<<<<<<<<<
@@ -29901,7 +29544,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":158
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":158
  *             p[i] = pattern[i]
  *         node = self._contains(p,l)
  *         free(p)             # <<<<<<<<<<<<<<
@@ -29910,7 +29553,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
  */
   free(__pyx_v_p);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":159
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":159
  *         node = self._contains(p,l)
  *         free(p)
  *         if node == NULL:             # <<<<<<<<<<<<<<
@@ -29920,7 +29563,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":160
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":160
  *         free(p)
  *         if node == NULL:
  *             return False             # <<<<<<<<<<<<<<
@@ -29937,7 +29580,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":162
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":162
  *             return False
  *         else:
  *             return True             # <<<<<<<<<<<<<<
@@ -29965,7 +29608,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_6contains(struct __pyx_obj_3_sa_TrieMap
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":164
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":164
  *             return True
  * 
  *     cdef _Trie_Node* _contains(self, int* pattern, int pattern_len):             # <<<<<<<<<<<<<<
@@ -29983,7 +29626,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("_contains", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":167
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":167
  *         cdef int i
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]             # <<<<<<<<<<<<<<
@@ -29992,7 +29635,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":168
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":168
  *         cdef _Trie_Node* node
  *         node = self.root[pattern[0]]
  *         i = 1             # <<<<<<<<<<<<<<
@@ -30001,7 +29644,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
  */
   __pyx_v_i = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":169
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":169
  *         node = self.root[pattern[0]]
  *         i = 1
  *         while node != NULL and i < pattern_len:             # <<<<<<<<<<<<<<
@@ -30018,7 +29661,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":170
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":170
  *         i = 1
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])             # <<<<<<<<<<<<<<
@@ -30027,7 +29670,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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":171
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":171
  *         while node != NULL and i < pattern_len:
  *             node = trie_find(node, pattern[i])
  *             i = i+1             # <<<<<<<<<<<<<<
@@ -30037,7 +29680,7 @@ static struct __pyx_t_3_sa__Trie_Node *__pyx_f_3_sa_7TrieMap__contains(struct __
     __pyx_v_i = (__pyx_v_i + 1);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":172
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":172
  *             node = trie_find(node, pattern[i])
  *             i = i+1
  *         return node             # <<<<<<<<<<<<<<
@@ -30064,7 +29707,7 @@ static PyObject *__pyx_pw_3_sa_7TrieMap_9toMap(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":174
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":174
  *         return node
  * 
  *     def toMap(self, flag):             # <<<<<<<<<<<<<<
@@ -30087,7 +29730,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("toMap", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":177
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":177
  *         cdef int i, include_zeros
  * 
  *         if flag:             # <<<<<<<<<<<<<<
@@ -30097,7 +29740,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":178
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":178
  * 
  *         if flag:
  *             include_zeros=1             # <<<<<<<<<<<<<<
@@ -30109,7 +29752,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":180
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":180
  *             include_zeros=1
  *         else:
  *             include_zeros=0             # <<<<<<<<<<<<<<
@@ -30120,7 +29763,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":181
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":181
  *         else:
  *             include_zeros=0
  *         result = {}             # <<<<<<<<<<<<<<
@@ -30132,7 +29775,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":182
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":182
  *             include_zeros=0
  *         result = {}
  *         for i from 0 <= i < self.V:             # <<<<<<<<<<<<<<
@@ -30142,7 +29785,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":183
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":183
  *         result = {}
  *         for i from 0 <= i < self.V:
  *             if self.root[i] != NULL:             # <<<<<<<<<<<<<<
@@ -30152,7 +29795,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":184
+      /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30175,7 +29818,7 @@ static PyObject *__pyx_pf_3_sa_7TrieMap_8toMap(struct __pyx_obj_3_sa_TrieMap *__
     __pyx_L6:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":185
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -30213,14 +29856,14 @@ static int __pyx_pw_3_sa_14Precomputation_1__cinit__(PyObject *__pyx_v_self, PyO
   PyObject *__pyx_v_max_nonterminals = 0;
   PyObject *__pyx_v_train_max_initial_size = 0;
   PyObject *__pyx_v_train_min_gap_size = 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};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":200
+    /* "/home/paulb/workspace/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,             # <<<<<<<<<<<<<<
@@ -30354,7 +29997,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":204
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -30364,7 +30007,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":205
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -30374,7 +30017,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":206
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":206
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -30384,7 +30027,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":207
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":207
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -30394,7 +30037,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":208
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -30404,7 +30047,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":209
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -30414,7 +30057,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":210
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -30424,7 +30067,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":211
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":211
  *         self.train_min_gap_size = train_min_gap_size
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -30446,7 +30089,7 @@ static int __pyx_pf_3_sa_14Precomputation___cinit__(struct __pyx_obj_3_sa_Precom
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":212
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":212
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_stats:             # <<<<<<<<<<<<<<
@@ -30456,7 +30099,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":213
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":213
  *             self.read_binary(from_binary)
  *         elif from_stats:
  *             self.precompute(from_stats, fsarray)             # <<<<<<<<<<<<<<
@@ -30516,7 +30159,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_3read_binary(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":216
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":216
  * 
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -30534,7 +30177,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":218
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":218
  *     def read_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -30543,7 +30186,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_2read_binary(struct __pyx_obj_3_
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__r);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":219
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":219
  *         cdef FILE* f
  *         f = fopen(filename, "r")
  *         fread(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30552,7 +30195,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":220
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30561,7 +30204,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":221
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30570,7 +30213,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":222
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30579,7 +30222,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":223
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30588,7 +30231,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":224
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30597,7 +30240,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":225
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30612,7 +30255,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":226
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30627,7 +30270,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":227
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":227
  *         self.precomputed_index = self.read_map(f)
  *         self.precomputed_collocations = self.read_map(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -30669,7 +30312,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_5write_binary(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":230
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":230
  * 
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -30688,7 +30331,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":232
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":232
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -30697,7 +30340,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
  */
   __pyx_v_f = fopen(__pyx_v_filename, __pyx_k__w);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":233
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":233
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         fwrite(&(self.precompute_rank), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30706,7 +30349,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":234
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30715,7 +30358,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":235
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30724,7 +30367,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":236
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30733,7 +30376,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":237
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30742,7 +30385,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":238
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30751,7 +30394,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":239
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30765,7 +30408,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":240
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -30779,7 +30422,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":241
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":241
  *         self.write_map(self.precomputed_index, f)
  *         self.write_map(self.precomputed_collocations, f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -30801,7 +30444,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_4write_binary(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":244
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":244
  * 
  * 
  *     cdef write_map(self, m, FILE* f):             # <<<<<<<<<<<<<<
@@ -30820,19 +30463,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":248
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":248
  *         cdef IntList arr
  * 
  *         N = len(m)             # <<<<<<<<<<<<<<
@@ -30842,7 +30487,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":249
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":249
  * 
  *         N = len(m)
  *         fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30851,29 +30496,87 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
   fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":250
+  /* "/home/paulb/workspace/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 (!__pyx_t_4 && 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 (!__pyx_t_4 && 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;
@@ -30881,17 +30584,17 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
     __pyx_v_val = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":251
+    /* "/home/paulb/workspace/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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":252
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":252
  *         for pattern, val in m.iteritems():
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30900,7 +30603,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
  */
     fwrite((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":253
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":253
  *             N = len(pattern)
  *             fwrite(&(N), sizeof(int), 1, f)
  *             for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -30908,54 +30611,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 (!__pyx_t_10 && 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 (!__pyx_t_10 && 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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":254
+      /* "/home/paulb/workspace/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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":255
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":255
  *             for word_id in pattern:
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -30964,9 +30659,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":256
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":256
  *                 i = word_id
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val             # <<<<<<<<<<<<<<
@@ -30978,7 +30673,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":257
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":257
  *                 fwrite(&(i), sizeof(int), 1, f)
  *             arr = val
  *             arr.write_handle(f)             # <<<<<<<<<<<<<<
@@ -30993,8 +30688,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:;
@@ -31007,7 +30704,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_write_map(CYTHON_UNUSED struct __
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":260
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":260
  * 
  * 
  *     cdef read_map(self, FILE* f):             # <<<<<<<<<<<<<<
@@ -31035,7 +30732,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("read_map", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":264
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":264
  *         cdef IntList arr
  * 
  *         m = {}             # <<<<<<<<<<<<<<
@@ -31047,7 +30744,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
   __pyx_v_m = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":265
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":265
  * 
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -31056,7 +30753,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
   fread((&__pyx_v_N), (sizeof(int)), 1, __pyx_v_f);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":266
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":266
  *         m = {}
  *         fread(&(N), sizeof(int), 1, f)
  *         for j from 0 <= j < N:             # <<<<<<<<<<<<<<
@@ -31066,7 +30763,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":267
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -31075,7 +30772,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
  */
     fread((&__pyx_v_i), (sizeof(int)), 1, __pyx_v_f);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":268
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":268
  *         for j from 0 <= j < N:
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()             # <<<<<<<<<<<<<<
@@ -31086,7 +30783,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":269
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":269
  *             fread(&(i), sizeof(int), 1, f)
  *             key = ()
  *             for k from 0 <= k < i:             # <<<<<<<<<<<<<<
@@ -31096,7 +30793,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++) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":270
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":270
  *             key = ()
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)             # <<<<<<<<<<<<<<
@@ -31105,7 +30802,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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":271
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":271
  *             for k from 0 <= k < i:
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)             # <<<<<<<<<<<<<<
@@ -31127,7 +30824,7 @@ static PyObject *__pyx_f_3_sa_14Precomputation_read_map(CYTHON_UNUSED struct __p
       __pyx_t_1 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":272
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":272
  *                 fread(&(word_id), sizeof(int), 1, f)
  *                 key = key + (word_id,)
  *             arr = IntList()             # <<<<<<<<<<<<<<
@@ -31140,7 +30837,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":273
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":273
  *                 key = key + (word_id,)
  *             arr = IntList()
  *             arr.read_handle(f)             # <<<<<<<<<<<<<<
@@ -31149,7 +30846,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":274
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":274
  *             arr = IntList()
  *             arr.read_handle(f)
  *             m[key] = arr             # <<<<<<<<<<<<<<
@@ -31159,7 +30856,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;}
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":275
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":275
  *             arr.read_handle(f)
  *             m[key] = arr
  *         return m             # <<<<<<<<<<<<<<
@@ -31192,11 +30889,11 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__stats,&__pyx_n_s__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;
@@ -31210,10 +30907,12 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
       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--;
+        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;}
         }
@@ -31248,7 +30947,7 @@ static PyObject *__pyx_pw_3_sa_14Precomputation_7precompute(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":278
+/* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":278
  * 
  * 
  *     def precompute(self, stats, SuffixArray sarray):             # <<<<<<<<<<<<<<
@@ -31334,7 +31033,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":280
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -31344,7 +31043,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":285
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":285
  *         cdef _Trie_Node* node
  * 
  *         data = darray.data             # <<<<<<<<<<<<<<
@@ -31354,7 +31053,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":287
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":287
  *         data = darray.data
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -31378,7 +31077,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":288
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":288
  * 
  *         frequent_patterns = TrieMap(len(darray.id2word))
  *         super_frequent_patterns = TrieMap(len(darray.id2word))             # <<<<<<<<<<<<<<
@@ -31402,7 +31101,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":289
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -31426,7 +31125,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":291
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":291
  *         collocations = TrieMap(len(darray.id2word))
  * 
  *         I_set = set()             # <<<<<<<<<<<<<<
@@ -31438,7 +31137,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":292
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":292
  * 
  *         I_set = set()
  *         J_set = set()             # <<<<<<<<<<<<<<
@@ -31450,7 +31149,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":293
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":293
  *         I_set = set()
  *         J_set = set()
  *         J2_set = set()             # <<<<<<<<<<<<<<
@@ -31462,7 +31161,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":294
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":294
  *         J_set = set()
  *         J2_set = set()
  *         IJ_set = set()             # <<<<<<<<<<<<<<
@@ -31474,7 +31173,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":295
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":295
  *         J2_set = set()
  *         IJ_set = set()
  *         pattern_rank = {}             # <<<<<<<<<<<<<<
@@ -31486,7 +31185,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -31503,7 +31202,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":298
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":298
  * 
  *         logger.info("Precomputing frequent intersections")
  *         cdef float start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -31519,7 +31218,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_start_time = __pyx_t_4;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":300
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":300
  *         cdef float start_time = monitor_cpu()
  * 
  *         max_pattern_len = 0             # <<<<<<<<<<<<<<
@@ -31528,7 +31227,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_max_pattern_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":301
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":301
  * 
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):             # <<<<<<<<<<<<<<
@@ -31548,18 +31247,10 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   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_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __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_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } 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_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __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_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } else {
       __pyx_t_6 = __pyx_t_5(__pyx_t_1);
       if (unlikely(!__pyx_t_6)) {
@@ -31573,22 +31264,21 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     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[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_7 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
         __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[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_7 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_9 = PyList_GET_ITEM(sequence, 2); 
@@ -31596,14 +31286,8 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_t_9);
-      #else
-      __pyx_t_7 = PySequence_ITEM(sequence, 0); 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, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_9 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __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_10 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
@@ -31616,13 +31300,12 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       index = 2; __pyx_t_9 = __pyx_t_11(__pyx_t_10); if (unlikely(!__pyx_t_9)) goto __pyx_L5_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_9);
       if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_10), 3) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 301; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_11 = NULL;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       goto __pyx_L6_unpacking_done;
       __pyx_L5_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-      __pyx_t_11 = 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:;
     }
@@ -31644,7 +31327,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_3 = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":302
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":302
  *         max_pattern_len = 0
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:             # <<<<<<<<<<<<<<
@@ -31653,13 +31336,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_t_6 = PyInt_FromLong(__pyx_v_self->precompute_rank); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_9 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_6, Py_GE); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_6, Py_GE); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_9);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":303
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":303
  *         for rank, (_, _, phrase) in enumerate(stats):
  *             if rank >= self.precompute_rank:
  *                 break             # <<<<<<<<<<<<<<
@@ -31671,7 +31355,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":304
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":304
  *             if rank >= self.precompute_rank:
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))             # <<<<<<<<<<<<<<
@@ -31687,7 +31371,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     __pyx_v_max_pattern_len = __pyx_t_15;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":305
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":305
  *                 break
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -31707,7 +31391,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":306
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":306
  *             max_pattern_len = max(max_pattern_len, len(phrase))
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)             # <<<<<<<<<<<<<<
@@ -31716,7 +31400,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_t_16 = PySet_Add(__pyx_v_I_set, __pyx_v_phrase); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":307
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":307
  *             frequent_patterns.insert(phrase)
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank             # <<<<<<<<<<<<<<
@@ -31725,7 +31409,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;}
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":308
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":308
  *             I_set.add(phrase)
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:             # <<<<<<<<<<<<<<
@@ -31734,13 +31418,14 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_t_8 = PyInt_FromLong(__pyx_v_self->precompute_secondary_rank); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_6 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_8, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_RichCompare(__pyx_v_rank, __pyx_t_8, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_12 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":309
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":309
  *             pattern_rank[phrase] = rank
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)             # <<<<<<<<<<<<<<
@@ -31760,7 +31445,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":310
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":310
  *             if rank < self.precompute_secondary_rank:
  *                 super_frequent_patterns.insert(phrase)
  *                 J_set.add(phrase)             # <<<<<<<<<<<<<<
@@ -31776,7 +31461,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":312
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":312
  *                 J_set.add(phrase)
  * 
  *         queue = IntList(increment=1000)             # <<<<<<<<<<<<<<
@@ -31792,7 +31477,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_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -31809,7 +31494,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":315
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":315
  * 
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)             # <<<<<<<<<<<<<<
@@ -31819,7 +31504,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":316
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":316
  *         logger.info("    Computing inverted indexes...")
  *         N = len(data)
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -31829,7 +31514,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_14 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":317
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":317
  *         N = len(data)
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]             # <<<<<<<<<<<<<<
@@ -31838,7 +31523,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":318
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":318
  *         for i from 0 <= i < N:
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:             # <<<<<<<<<<<<<<
@@ -31848,7 +31533,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_12 = (__pyx_v_sa_word_id == 1);
     if (__pyx_t_12) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":319
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":319
  *             sa_word_id = data.arr[i]
  *             if sa_word_id == 1:
  *                 queue._append(-1)             # <<<<<<<<<<<<<<
@@ -31860,7 +31545,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":321
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":321
  *                 queue._append(-1)
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:             # <<<<<<<<<<<<<<
@@ -31870,7 +31555,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_17 = __pyx_v_max_pattern_len;
       for (__pyx_v_l = 1; __pyx_v_l <= __pyx_t_17; __pyx_v_l++) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":322
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":322
  *             else:
  *                 for l from 1 <= l <= max_pattern_len:
  *                     node = frequent_patterns._contains(data.arr+i, l)             # <<<<<<<<<<<<<<
@@ -31879,7 +31564,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":323
+        /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -31889,7 +31574,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_12 = (__pyx_v_node == NULL);
         if (__pyx_t_12) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":324
+          /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":324
  *                     node = frequent_patterns._contains(data.arr+i, l)
  *                     if node == NULL:
  *                         break             # <<<<<<<<<<<<<<
@@ -31901,7 +31586,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L14:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":325
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":325
  *                     if node == NULL:
  *                         break
  *                     queue._append(i)             # <<<<<<<<<<<<<<
@@ -31910,7 +31595,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":326
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":326
  *                         break
  *                     queue._append(i)
  *                     queue._append(l)             # <<<<<<<<<<<<<<
@@ -31919,7 +31604,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":327
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":327
  *                     queue._append(i)
  *                     queue._append(l)
  *                     trie_node_data_append(node, i)             # <<<<<<<<<<<<<<
@@ -31935,7 +31620,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_L11:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -31952,7 +31637,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":330
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":330
  * 
  *         logger.info("    Computing collocations...")
  *         N = len(queue)             # <<<<<<<<<<<<<<
@@ -31962,7 +31647,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":331
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":331
  *         logger.info("    Computing collocations...")
  *         N = len(queue)
  *         ptr1 = 0             # <<<<<<<<<<<<<<
@@ -31971,7 +31656,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_ptr1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":332
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":332
  *         N = len(queue)
  *         ptr1 = 0
  *         sent_count = 0             # <<<<<<<<<<<<<<
@@ -31980,7 +31665,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
   __pyx_v_sent_count = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":333
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":333
  *         ptr1 = 0
  *         sent_count = 0
  *         while ptr1 < N:    # main loop             # <<<<<<<<<<<<<<
@@ -31991,7 +31676,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_12 = (__pyx_v_ptr1 < __pyx_v_N);
     if (!__pyx_t_12) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":334
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":334
  *         sent_count = 0
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]             # <<<<<<<<<<<<<<
@@ -32000,7 +31685,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
     __pyx_v_i1 = (__pyx_v_queue->arr[__pyx_v_ptr1]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":335
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":335
  *         while ptr1 < N:    # main loop
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:             # <<<<<<<<<<<<<<
@@ -32010,7 +31695,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_t_12 = (__pyx_v_i1 > -1);
     if (__pyx_t_12) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":336
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":336
  *             i1 = queue.arr[ptr1]
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]             # <<<<<<<<<<<<<<
@@ -32019,7 +31704,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)]);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":337
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":337
  *             if i1 > -1:
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -32028,7 +31713,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_ptr2 = (__pyx_v_ptr1 + 2);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":338
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":338
  *                 l1 = queue.arr[ptr1+1]
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:             # <<<<<<<<<<<<<<
@@ -32039,7 +31724,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_12 = (__pyx_v_ptr2 < __pyx_v_N);
         if (!__pyx_t_12) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":339
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":339
  *                 ptr2 = ptr1 + 2
  *                 while ptr2 < N:
  *                     i2 = queue.arr[ptr2]             # <<<<<<<<<<<<<<
@@ -32048,7 +31733,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_v_i2 = (__pyx_v_queue->arr[__pyx_v_ptr2]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":340
+        /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32064,7 +31749,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         if (__pyx_t_19) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":341
+          /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":341
  *                     i2 = queue.arr[ptr2]
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break             # <<<<<<<<<<<<<<
@@ -32076,7 +31761,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L20:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":342
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":342
  *                     if i2 == -1 or i2 - i1 >= self.train_max_initial_size:
  *                         break
  *                     l2 = queue.arr[ptr2+1]             # <<<<<<<<<<<<<<
@@ -32085,7 +31770,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)]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":343
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":343
  *                         break
  *                     l2 = queue.arr[ptr2+1]
  *                     if (i2 - i1 - l1 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -32095,7 +31780,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_t_19 = (((__pyx_v_i2 - __pyx_v_i1) - __pyx_v_l1) >= __pyx_v_self->train_min_gap_size);
         if (__pyx_t_19) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":344
+          /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -32105,7 +31790,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_12 = (((__pyx_v_i2 + __pyx_v_l2) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
           if (__pyx_t_12) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":345
+            /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -32123,7 +31808,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         if (__pyx_t_12) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":346
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32132,7 +31817,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);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":347
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32141,7 +31826,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);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":348
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32151,7 +31836,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_14 = (__pyx_v_i2 + __pyx_v_l2);
           for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":349
+            /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -32161,7 +31846,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]));
           }
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":350
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32172,7 +31857,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":351
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32183,7 +31868,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":352
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32193,7 +31878,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
           __pyx_t_12 = (((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_12) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":353
+            /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32203,7 +31888,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             __pyx_t_12 = (((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_12) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":354
+              /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -32215,7 +31900,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             }
             /*else*/ {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":356
+              /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":356
  *                                 is_super = 1
  *                             else:
  *                                 is_super = 0             # <<<<<<<<<<<<<<
@@ -32226,7 +31911,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
             }
             __pyx_L25:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":357
+            /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":357
  *                             else:
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -32235,7 +31920,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
             __pyx_v_ptr3 = (__pyx_v_ptr2 + 2);
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":358
+            /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":358
  *                                 is_super = 0
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:             # <<<<<<<<<<<<<<
@@ -32246,7 +31931,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               __pyx_t_12 = (__pyx_v_ptr3 < __pyx_v_N);
               if (!__pyx_t_12) break;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":359
+              /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":359
  *                             ptr3 = ptr2 + 2
  *                             while ptr3 < N:
  *                                 i3 = queue.arr[ptr3]             # <<<<<<<<<<<<<<
@@ -32255,7 +31940,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
               __pyx_v_i3 = (__pyx_v_queue->arr[__pyx_v_ptr3]);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":360
+              /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32271,7 +31956,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               if (__pyx_t_20) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":361
+                /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":361
  *                                 i3 = queue.arr[ptr3]
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break             # <<<<<<<<<<<<<<
@@ -32283,7 +31968,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               __pyx_L28:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":362
+              /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":362
  *                                 if i3 == -1 or i3 - i1 >= self.train_max_initial_size:
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]             # <<<<<<<<<<<<<<
@@ -32292,7 +31977,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)]);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":363
+              /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":363
  *                                     break
  *                                 l3 = queue.arr[ptr3+1]
  *                                 if (i3 - i2 - l2 >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -32302,7 +31987,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               __pyx_t_20 = (((__pyx_v_i3 - __pyx_v_i2) - __pyx_v_l2) >= __pyx_v_self->train_min_gap_size);
               if (__pyx_t_20) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":364
+                /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -32312,7 +31997,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                 __pyx_t_12 = (((__pyx_v_i3 + __pyx_v_l3) - __pyx_v_i1) <= __pyx_v_self->train_max_initial_size);
                 if (__pyx_t_12) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":365
+                  /* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -32330,7 +32015,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               if (__pyx_t_12) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":366
+                /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32345,7 +32030,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                 }
                 if (__pyx_t_20) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":367
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32354,7 +32039,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);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":368
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32363,7 +32048,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);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":369
+                  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32373,7 +32058,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_14 = (__pyx_v_i2 + __pyx_v_l2);
                   for (__pyx_v_i = __pyx_v_i2; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-                    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":370
+                    /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -32383,7 +32068,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]));
                   }
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":371
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32392,7 +32077,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);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":372
+                  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32402,7 +32087,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __pyx_t_14 = (__pyx_v_i3 + __pyx_v_l3);
                   for (__pyx_v_i = __pyx_v_i3; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-                    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":373
+                    /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -32412,7 +32097,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]));
                   }
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":374
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32423,7 +32108,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_1);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":375
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32434,7 +32119,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
                   __Pyx_GOTREF(__pyx_t_1);
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":376
+                  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32451,7 +32136,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
               }
               __pyx_L29:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":377
+              /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":377
  *                                         trie_node_data_append(node, i2)
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2             # <<<<<<<<<<<<<<
@@ -32468,7 +32153,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         }
         __pyx_L21:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":378
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":378
  *                                         trie_node_data_append(node, i3)
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2             # <<<<<<<<<<<<<<
@@ -32479,7 +32164,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __pyx_L19_break:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":379
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":379
  *                                 ptr3 = ptr3 + 2
  *                     ptr2 = ptr2 + 2
  *                 ptr1 = ptr1 + 2             # <<<<<<<<<<<<<<
@@ -32491,7 +32176,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":381
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":381
  *                 ptr1 = ptr1 + 2
  *             else:
  *                 sent_count = sent_count + 1             # <<<<<<<<<<<<<<
@@ -32500,7 +32185,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_sent_count = (__pyx_v_sent_count + 1);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":382
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":382
  *             else:
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:             # <<<<<<<<<<<<<<
@@ -32510,7 +32195,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_20 = (__Pyx_mod_long(__pyx_v_sent_count, 10000) == 0);
       if (__pyx_t_20) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":383
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":383
  *                 sent_count = sent_count + 1
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)             # <<<<<<<<<<<<<<
@@ -32541,7 +32226,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       }
       __pyx_L35:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":384
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":384
  *                 if sent_count % 10000 == 0:
  *                     logger.debug("        %d sentences", sent_count)
  *                 ptr1 = ptr1 + 1             # <<<<<<<<<<<<<<
@@ -32553,7 +32238,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_L17:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":386
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":386
  *                 ptr1 = ptr1 + 1
  * 
  *         self.precomputed_collocations = collocations.toMap(False)             # <<<<<<<<<<<<<<
@@ -32579,7 +32264,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_self->precomputed_collocations = __pyx_t_9;
   __pyx_t_9 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":387
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":387
  * 
  *         self.precomputed_collocations = collocations.toMap(False)
  *         self.precomputed_index = frequent_patterns.toMap(True)             # <<<<<<<<<<<<<<
@@ -32605,7 +32290,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_v_self->precomputed_index = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":389
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":389
  *         self.precomputed_index = frequent_patterns.toMap(True)
  * 
  *         x = 0             # <<<<<<<<<<<<<<
@@ -32615,7 +32300,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":390
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":390
  * 
  *         x = 0
  *         for pattern1 in J_set:             # <<<<<<<<<<<<<<
@@ -32641,7 +32326,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":391
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":391
  *         x = 0
  *         for pattern1 in J_set:
  *             for pattern2 in J_set:             # <<<<<<<<<<<<<<
@@ -32667,7 +32352,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_9;
       __pyx_t_9 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":392
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -32679,7 +32364,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_20 = (((__pyx_t_2 + __pyx_t_15) + 1) < __pyx_v_self->max_length);
       if (__pyx_t_20) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":393
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -32695,7 +32380,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":394
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32711,7 +32396,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":396
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":396
  *                     J2_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -32737,7 +32422,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":397
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":397
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:             # <<<<<<<<<<<<<<
@@ -32763,7 +32448,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":398
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":398
  *         for pattern1 in I_set:
  *             for pattern2 in I_set:
  *                 x = x+1             # <<<<<<<<<<<<<<
@@ -32776,7 +32461,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":399
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":399
  *             for pattern2 in I_set:
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:             # <<<<<<<<<<<<<<
@@ -32788,7 +32473,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_20 = (((__pyx_t_15 + __pyx_t_2) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_20) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":400
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -32804,7 +32489,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_9;
         __pyx_t_9 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":401
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32820,7 +32505,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":403
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":403
  *                     IJ_set.add(combined_pattern)
  * 
  *         for pattern1 in I_set:             # <<<<<<<<<<<<<<
@@ -32846,7 +32531,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_pattern1 = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":404
+    /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":404
  * 
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:             # <<<<<<<<<<<<<<
@@ -32872,7 +32557,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_pattern2 = __pyx_t_9;
       __pyx_t_9 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":405
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":405
  *         for pattern1 in I_set:
  *             for pattern2 in J2_set:
  *                 x = x+2             # <<<<<<<<<<<<<<
@@ -32885,7 +32570,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_v_x = __pyx_t_9;
       __pyx_t_9 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":406
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":406
  *             for pattern2 in J2_set:
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:             # <<<<<<<<<<<<<<
@@ -32897,7 +32582,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
       __pyx_t_20 = (((__pyx_t_2 + __pyx_t_15) + 1) <= __pyx_v_self->max_length);
       if (__pyx_t_20) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":407
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -32913,7 +32598,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":408
+        /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -32922,7 +32607,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
         __pyx_t_16 = PySet_Add(__pyx_v_IJ_set, __pyx_v_combined_pattern); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":409
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -32938,7 +32623,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
         __pyx_v_combined_pattern = __pyx_t_9;
         __pyx_t_9 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":410
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":410
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1
  *                     IJ_set.add(combined_pattern)             # <<<<<<<<<<<<<<
@@ -32954,17 +32639,17 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":412
+  /* "/home/paulb/workspace/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_15 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = PyDict_Size(((PyObject *)__pyx_v_pattern_rank)); 
   __pyx_v_N = __pyx_t_15;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":413
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":413
  * 
  *         N = len(pattern_rank)
  *         cost_by_rank = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -32983,7 +32668,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_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":414
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -33002,47 +32687,105 @@ 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_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":415
+  /* "/home/paulb/workspace/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_15 = 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_1 = __Pyx_dict_iterator(__pyx_v_self->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_2), (&__pyx_t_14)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_GetAttr(__pyx_v_self->precomputed_collocations, __pyx_n_s__iteritems); 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_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); 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_XDECREF(__pyx_t_3);
-  __pyx_t_3 = __pyx_t_1;
-  __pyx_t_1 = 0;
-  while (1) {
-    __pyx_t_17 = __Pyx_dict_iter_next(__pyx_t_3, __pyx_t_2, &__pyx_t_15, &__pyx_t_1, &__pyx_t_9, NULL, __pyx_t_14);
-    if (unlikely(__pyx_t_17 == 0)) break;
-    if (unlikely(__pyx_t_17 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  if (PyList_CheckExact(__pyx_t_1) || PyTuple_CheckExact(__pyx_t_1)) {
+    __pyx_t_3 = __pyx_t_1; __Pyx_INCREF(__pyx_t_3); __pyx_t_15 = 0;
+    __pyx_t_5 = NULL;
+  } else {
+    __pyx_t_15 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_1); 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_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
+  }
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  for (;;) {
+    if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
+      if (__pyx_t_15 >= PyList_GET_SIZE(__pyx_t_3)) break;
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_15); __Pyx_INCREF(__pyx_t_1); __pyx_t_15++;
+    } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
+      if (__pyx_t_15 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_15); __Pyx_INCREF(__pyx_t_1); __pyx_t_15++;
+    } else {
+      __pyx_t_1 = __pyx_t_5(__pyx_t_3);
+      if (unlikely(!__pyx_t_1)) {
+        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_1);
+    }
+    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) != 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_9 = PyTuple_GET_ITEM(sequence, 0); 
+        __pyx_t_8 = 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_9 = PyList_GET_ITEM(sequence, 0); 
+        __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
+      }
+      __Pyx_INCREF(__pyx_t_9);
+      __Pyx_INCREF(__pyx_t_8);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+    } else {
+      Py_ssize_t index = -1;
+      __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
+      index = 0; __pyx_t_9 = __pyx_t_11(__pyx_t_6); if (unlikely(!__pyx_t_9)) goto __pyx_L53_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_9);
+      index = 1; __pyx_t_8 = __pyx_t_11(__pyx_t_6); if (unlikely(!__pyx_t_8)) goto __pyx_L53_unpacking_failed;
+      __Pyx_GOTREF(__pyx_t_8);
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_11(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      goto __pyx_L54_unpacking_done;
+      __pyx_L53_unpacking_failed:;
+      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 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_L54_unpacking_done:;
+    }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_1;
-    __pyx_t_1 = 0;
-    __Pyx_XDECREF(__pyx_v_arr);
-    __pyx_v_arr = __pyx_t_9;
+    __pyx_v_pattern = __pyx_t_9;
     __pyx_t_9 = 0;
+    __Pyx_XDECREF(__pyx_v_arr);
+    __pyx_v_arr = __pyx_t_8;
+    __pyx_t_8 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":416
+    /* "/home/paulb/workspace/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_20 = (__Pyx_PySequence_Contains(__pyx_v_pattern, ((PyObject *)__pyx_v_IJ_set), Py_NE)); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_20 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_v_IJ_set), __pyx_v_pattern))); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_20) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":417
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":417
  *         for pattern, arr in self.precomputed_collocations.iteritems():
  *             if pattern not in IJ_set:
  *                 s = ""             # <<<<<<<<<<<<<<
@@ -33053,7 +32796,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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":418
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":418
  *             if pattern not in IJ_set:
  *                 s = ""
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -33061,124 +32804,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_9 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_9); __pyx_t_13 = 0;
-        __pyx_t_5 = NULL;
+        __pyx_t_1 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
+        __pyx_t_21 = NULL;
       } else {
-        __pyx_t_13 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_9);
-        __pyx_t_5 = Py_TYPE(__pyx_t_9)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_21 = Py_TYPE(__pyx_t_1)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_9)) {
-          if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_9)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_9)) {
-          if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_1 = PySequence_ITEM(__pyx_t_9, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (!__pyx_t_21 && PyList_CheckExact(__pyx_t_1)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break;
+          __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_8); __pyx_t_2++;
+        } else if (!__pyx_t_21 && PyTuple_CheckExact(__pyx_t_1)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
+          __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_8); __pyx_t_2++;
         } else {
-          __pyx_t_1 = __pyx_t_5(__pyx_t_9);
-          if (unlikely(!__pyx_t_1)) {
+          __pyx_t_8 = __pyx_t_21(__pyx_t_1);
+          if (unlikely(!__pyx_t_8)) {
             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_1);
+          __Pyx_GOTREF(__pyx_t_8);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_1;
-        __pyx_t_1 = 0;
+        __pyx_v_word_id = __pyx_t_8;
+        __pyx_t_8 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":419
+        /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":419
  *                 s = ""
  *                 for word_id in pattern:
  *                     if word_id == -1:             # <<<<<<<<<<<<<<
  *                         s = s + "X "
  *                     else:
  */
-        __pyx_t_1 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+        __pyx_t_8 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
+        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         if (__pyx_t_20) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":420
+          /* "/home/paulb/workspace/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_1 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyNumber_Add(__pyx_v_s, ((PyObject *)__pyx_kp_s_83)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_1;
-          __pyx_t_1 = 0;
-          goto __pyx_L56;
+          __pyx_v_s = __pyx_t_8;
+          __pyx_t_8 = 0;
+          goto __pyx_L58;
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":422
+          /* "/home/paulb/workspace/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_1 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_8 = PyNumber_Add(__pyx_v_s, __pyx_t_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = PyObject_GetItem(__pyx_v_darray->id2word, __pyx_v_word_id); if (!__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_1); __pyx_t_1 = 0;
-          __pyx_t_1 = PyNumber_Add(__pyx_t_8, ((PyObject *)__pyx_kp_s_67)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_9 = PyNumber_Add(__pyx_v_s, __pyx_t_8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 422; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_9);
           __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __pyx_t_8 = PyNumber_Add(__pyx_t_9, ((PyObject *)__pyx_kp_s_67)); 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_9); __pyx_t_9 = 0;
           __Pyx_DECREF(__pyx_v_s);
-          __pyx_v_s = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_v_s = __pyx_t_8;
+          __pyx_t_8 = 0;
         }
-        __pyx_L56:;
+        __pyx_L58:;
       }
-      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":423
+      /* "/home/paulb/workspace/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_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_1 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__warn); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__warn); 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_1); __pyx_t_1 = 0;
+      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_84));
-      PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_84));
+      PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_84));
       __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_84));
       __Pyx_INCREF(__pyx_v_s);
-      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_v_s);
+      PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_s);
       __Pyx_GIVEREF(__pyx_v_s);
-      __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_9), 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_1); __pyx_t_1 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+      __pyx_t_9 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      goto __pyx_L53;
+      __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L55;
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":425
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":425
  *                 logger.warn("ERROR: unexpected pattern %s in set of precomputed collocations", s)
  *             else:
  *                 chunk = ()             # <<<<<<<<<<<<<<
@@ -33189,7 +32925,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":426
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":426
  *             else:
  *                 chunk = ()
  *                 max_rank = 0             # <<<<<<<<<<<<<<
@@ -33198,7 +32934,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
  */
       __pyx_v_max_rank = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":427
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":427
  *                 chunk = ()
  *                 max_rank = 0
  *                 arity = 0             # <<<<<<<<<<<<<<
@@ -33209,7 +32945,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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":428
+      /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":428
  *                 max_rank = 0
  *                 arity = 0
  *                 for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -33217,99 +32953,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_8 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_8); __pyx_t_13 = 0;
-        __pyx_t_5 = NULL;
+        __pyx_t_9 = __pyx_v_pattern; __Pyx_INCREF(__pyx_t_9); __pyx_t_2 = 0;
+        __pyx_t_21 = NULL;
       } else {
-        __pyx_t_13 = -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_5 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_2 = -1; __pyx_t_9 = PyObject_GetIter(__pyx_v_pattern); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_9);
+        __pyx_t_21 = Py_TYPE(__pyx_t_9)->tp_iternext;
       }
       for (;;) {
-        if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_13 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_9 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_13); __Pyx_INCREF(__pyx_t_9); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_13 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_9 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_13); __Pyx_INCREF(__pyx_t_9); __pyx_t_13++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_9 = PySequence_ITEM(__pyx_t_8, __pyx_t_13); __pyx_t_13++; if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (!__pyx_t_21 && PyList_CheckExact(__pyx_t_9)) {
+          if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_9)) break;
+          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
+        } else if (!__pyx_t_21 && PyTuple_CheckExact(__pyx_t_9)) {
+          if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_9)) break;
+          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_2); __Pyx_INCREF(__pyx_t_1); __pyx_t_2++;
         } else {
-          __pyx_t_9 = __pyx_t_5(__pyx_t_8);
-          if (unlikely(!__pyx_t_9)) {
+          __pyx_t_1 = __pyx_t_21(__pyx_t_9);
+          if (unlikely(!__pyx_t_1)) {
             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_9);
+          __Pyx_GOTREF(__pyx_t_1);
         }
         __Pyx_XDECREF(__pyx_v_word_id);
-        __pyx_v_word_id = __pyx_t_9;
-        __pyx_t_9 = 0;
+        __pyx_v_word_id = __pyx_t_1;
+        __pyx_t_1 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":429
+        /* "/home/paulb/workspace/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_9 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_9); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_9); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+        __pyx_t_1 = PyObject_RichCompare(__pyx_v_word_id, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_1);
+        __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 429; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         if (__pyx_t_20) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":430
+          /* "/home/paulb/workspace/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_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_9);
-          __pyx_t_17 = __pyx_v_max_rank;
-          __pyx_t_6 = PyInt_FromLong(__pyx_t_17); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_1) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_14 = __pyx_v_max_rank;
+          __pyx_t_6 = PyInt_FromLong(__pyx_t_14); 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 = PyObject_RichCompare(__pyx_t_9, __pyx_t_6, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_7 = PyObject_RichCompare(__pyx_t_1, __pyx_t_6, Py_GT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_7);
           __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
           __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
           if (__pyx_t_20) {
-            __Pyx_INCREF(__pyx_t_9);
-            __pyx_t_1 = __pyx_t_9;
+            __Pyx_INCREF(__pyx_t_1);
+            __pyx_t_8 = __pyx_t_1;
           } else {
-            __pyx_t_7 = PyInt_FromLong(__pyx_t_17); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_7 = PyInt_FromLong(__pyx_t_14); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_7);
-            __pyx_t_1 = __pyx_t_7;
+            __pyx_t_8 = __pyx_t_7;
             __pyx_t_7 = 0;
           }
-          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-          __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-          __pyx_v_max_rank = __pyx_t_17;
+          __pyx_t_14 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_14 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 430; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          __pyx_v_max_rank = __pyx_t_14;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":431
+          /* "/home/paulb/workspace/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_1 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 431; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_DECREF(__pyx_v_arity);
-          __pyx_v_arity = __pyx_t_1;
-          __pyx_t_1 = 0;
+          __pyx_v_arity = __pyx_t_8;
+          __pyx_t_8 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":432
+          /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":432
  *                         max_rank = max(max_rank, pattern_rank[chunk])
  *                         arity = arity + 1
  *                         chunk = ()             # <<<<<<<<<<<<<<
@@ -33319,104 +33049,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_L61;
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":434
+          /* "/home/paulb/workspace/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_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_1);
+          __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_v_word_id);
-          PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_word_id);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_word_id);
           __Pyx_GIVEREF(__pyx_v_word_id);
-          __pyx_t_9 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __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 = PyNumber_Add(((PyObject *)__pyx_v_chunk), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 434; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+          __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_v_chunk));
-          __pyx_v_chunk = __pyx_t_9;
-          __pyx_t_9 = 0;
+          __pyx_v_chunk = __pyx_t_1;
+          __pyx_t_1 = 0;
         }
-        __pyx_L59:;
+        __pyx_L61:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":435
+      /* "/home/paulb/workspace/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_t_9 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_v_pattern_rank), ((PyObject *)__pyx_v_chunk)); if (!__pyx_t_9) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      __pyx_t_14 = __pyx_v_max_rank;
+      __pyx_t_8 = PyInt_FromLong(__pyx_t_14); if (unlikely(!__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_17 = __pyx_v_max_rank;
-      __pyx_t_1 = PyInt_FromLong(__pyx_t_17); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_7 = PyObject_RichCompare(__pyx_t_8, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_t_7 = PyObject_RichCompare(__pyx_t_9, __pyx_t_8, Py_GT); 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_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_t_20 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_20) {
-        __Pyx_INCREF(__pyx_t_8);
-        __pyx_t_9 = __pyx_t_8;
+        __Pyx_INCREF(__pyx_t_9);
+        __pyx_t_1 = __pyx_t_9;
       } else {
-        __pyx_t_7 = PyInt_FromLong(__pyx_t_17); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = PyInt_FromLong(__pyx_t_14); 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_9 = __pyx_t_7;
+        __pyx_t_1 = __pyx_t_7;
         __pyx_t_7 = 0;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_t_9); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_v_max_rank = __pyx_t_17;
+      __pyx_t_14 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_14 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 435; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+      __pyx_v_max_rank = __pyx_t_14;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":436
+      /* "/home/paulb/workspace/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_13 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_13 == -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_13));
+      __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/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":437
+      /* "/home/paulb/workspace/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_9 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_max_rank])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __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_9 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_13 = PyObject_Length(__pyx_v_arr); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_13); 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_7 = PyNumber_Add(__pyx_v_arity, __pyx_int_1); 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_1 = __Pyx_PyNumber_Divide(__pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_1);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_8 = __Pyx_PyNumber_Divide(__pyx_t_9, __pyx_t_7); 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_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_7 = PyNumber_Add(__pyx_t_9, __pyx_t_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyNumber_Add(__pyx_t_1, __pyx_t_8); 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_9); __pyx_t_9 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_17 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_17 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __pyx_t_14 = __Pyx_PyInt_AsInt(__pyx_t_7); if (unlikely((__pyx_t_14 == (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_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_17;
+      (__pyx_v_count_by_rank->arr[__pyx_v_max_rank]) = __pyx_t_14;
     }
-    __pyx_L53:;
+    __pyx_L55:;
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":439
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -33426,7 +33157,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":440
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":440
  * 
  *         cumul_cost = 0
  *         cumul_count = 0             # <<<<<<<<<<<<<<
@@ -33436,7 +33167,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":441
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":441
  *         cumul_cost = 0
  *         cumul_count = 0
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -33446,7 +33177,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __pyx_t_14 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_14; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":442
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -33462,7 +33193,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_cost = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":443
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -33478,7 +33209,7 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __pyx_v_cumul_count = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":444
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -33492,140 +33223,140 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __pyx_t_3 = PyInt_FromLong(__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_1 = PyInt_FromLong((__pyx_v_count_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyInt_FromLong((__pyx_v_count_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_1 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__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_9 = PyInt_FromLong((__pyx_v_cost_by_rank->arr[__pyx_v_i])); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = PyTuple_New(6); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_9);
-    __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(__pyx_t_8);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_85));
+    PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_85));
     __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_85));
-    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_8);
+    __Pyx_GIVEREF(__pyx_t_8);
+    PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
-    PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_9);
-    __Pyx_GIVEREF(__pyx_t_9);
     __Pyx_INCREF(__pyx_v_cumul_count);
-    PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_v_cumul_count);
+    PyTuple_SET_ITEM(__pyx_t_9, 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_9, 5, __pyx_v_cumul_cost);
     __Pyx_GIVEREF(__pyx_v_cumul_cost);
     __pyx_t_3 = 0;
+    __pyx_t_8 = 0;
     __pyx_t_1 = 0;
-    __pyx_t_9 = 0;
-    __pyx_t_9 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_9);
+    __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_9), NULL); 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_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-    __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+    __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
+    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":446
+  /* "/home/paulb/workspace/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_9 = __pyx_v_self->precomputed_collocations;
-  __Pyx_INCREF(__pyx_t_9);
-  __pyx_t_2 = PyObject_Length(__pyx_t_9); 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_9); __pyx_t_9 = 0;
-  __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
-  __pyx_v_num_found_patterns = __pyx_t_9;
-  __pyx_t_9 = 0;
+  __pyx_t_1 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_1);
+  __pyx_t_15 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_v_num_found_patterns = __pyx_t_1;
+  __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":447
+  /* "/home/paulb/workspace/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_9 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_5 = Py_TYPE(__pyx_t_9)->tp_iternext;
+  __pyx_t_1 = PyObject_GetIter(((PyObject *)__pyx_v_IJ_set)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 447; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
   for (;;) {
     {
-      __pyx_t_8 = __pyx_t_5(__pyx_t_9);
-      if (unlikely(!__pyx_t_8)) {
+      __pyx_t_9 = __pyx_t_5(__pyx_t_1);
+      if (unlikely(!__pyx_t_9)) {
         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_9);
     }
     __Pyx_XDECREF(__pyx_v_pattern);
-    __pyx_v_pattern = __pyx_t_8;
-    __pyx_t_8 = 0;
+    __pyx_v_pattern = __pyx_t_9;
+    __pyx_t_9 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":448
+    /* "/home/paulb/workspace/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_20 = (__Pyx_PySequence_Contains(__pyx_v_pattern, __pyx_v_self->precomputed_collocations, Py_NE)); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_20 = (__Pyx_NegateNonNeg(PySequence_Contains(__pyx_v_self->precomputed_collocations, __pyx_v_pattern))); if (unlikely(__pyx_t_20 < 0)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 448; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_20) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":449
+      /* "/home/paulb/workspace/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(__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_L64;
+      __pyx_t_9 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_9);
+      if (PyObject_SetItem(__pyx_v_self->precomputed_collocations, __pyx_v_pattern, __pyx_t_9) < 0) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+      goto __pyx_L66;
     }
-    __pyx_L64:;
+    __pyx_L66:;
   }
-  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":451
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":451
  *                 self.precomputed_collocations[pattern] = IntList()
  * 
  *         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))
  */
-  __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __pyx_t_8 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_9); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-  __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_8); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __pyx_v_stop_time = __pyx_t_4;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":452
+  /* "/home/paulb/workspace/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_9 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__info); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __pyx_v_self->precomputed_collocations;
+  __Pyx_INCREF(__pyx_t_9);
+  __pyx_t_15 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __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_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(__pyx_t_7);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_86));
@@ -33634,74 +33365,74 @@ static PyObject *__pyx_pf_3_sa_14Precomputation_6precompute(struct __pyx_obj_3_s
   __Pyx_INCREF(__pyx_v_num_found_patterns);
   PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_num_found_patterns);
   __Pyx_GIVEREF(__pyx_v_num_found_patterns);
-  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
+  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_9);
   __Pyx_INCREF(__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_9, ((PyObject *)__pyx_t_7), 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_9); __pyx_t_9 = 0;
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":453
+  /* "/home/paulb/workspace/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_7 = PyObject_GetAttr(__pyx_t_8, __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_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_9, __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_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_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = __pyx_v_self->precomputed_index;
+  __Pyx_INCREF(__pyx_t_9);
+  __pyx_t_15 = PyObject_Length(__pyx_t_9); if (unlikely(__pyx_t_15 == -1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyInt_FromSsize_t(__pyx_t_15); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_kp_s_87));
+  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_kp_s_87));
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_87));
-  PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_9), 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_1, 1, __pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
   __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":454
+  /* "/home/paulb/workspace/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_9 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  __pyx_t_1 = PyObject_GetAttr(__pyx_t_9, __pyx_n_s__info); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+  __pyx_t_9 = PyFloat_FromDouble((__pyx_v_stop_time - __pyx_v_start_time)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_9);
-  __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_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(__pyx_t_7);
   __Pyx_INCREF(((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_7, 1, __pyx_t_8);
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_t_8 = 0;
-  __pyx_t_8 = PyObject_Call(__pyx_t_9, ((PyObject *)__pyx_t_7), 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_9); __pyx_t_9 = 0;
+  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_9);
+  __Pyx_GIVEREF(__pyx_t_9);
+  __pyx_t_9 = 0;
+  __pyx_t_9 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[11]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_9);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
 
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
@@ -33756,14 +33487,14 @@ static int __pyx_pw_3_sa_11SuffixArray_1__cinit__(PyObject *__pyx_v_self, PyObje
   PyObject *__pyx_v_from_binary = 0;
   PyObject *__pyx_v_from_text = 0;
   PyObject *__pyx_v_side = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__from_binary,&__pyx_n_s__from_text,&__pyx_n_s__side,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,&__pyx_n_s__side,0};
     PyObject* values[3] = {0,0,0};
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":11
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":11
  *     cdef IntList ha
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):             # <<<<<<<<<<<<<<
@@ -33842,7 +33573,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":12
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":12
  * 
  *     def __cinit__(self, from_binary=None, from_text=None, side=None):
  *         self.darray = DataArray()             # <<<<<<<<<<<<<<
@@ -33857,7 +33588,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":13
+  /* "/home/paulb/workspace/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()             # <<<<<<<<<<<<<<
@@ -33872,7 +33603,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":14
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":14
  *         self.darray = DataArray()
  *         self.sa = IntList()
  *         self.ha = IntList()             # <<<<<<<<<<<<<<
@@ -33887,7 +33618,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":15
  *         self.sa = IntList()
  *         self.ha = IntList()
  *         if from_binary:             # <<<<<<<<<<<<<<
@@ -33897,7 +33628,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":16
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":16
  *         self.ha = IntList()
  *         if from_binary:
  *             self.read_binary(from_binary)             # <<<<<<<<<<<<<<
@@ -33919,7 +33650,7 @@ static int __pyx_pf_3_sa_11SuffixArray___cinit__(struct __pyx_obj_3_sa_SuffixArr
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":17
  *         if from_binary:
  *             self.read_binary(from_binary)
  *         elif from_text:             # <<<<<<<<<<<<<<
@@ -33929,7 +33660,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":18
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":18
  *             self.read_binary(from_binary)
  *         elif from_text:
  *             self.read_text(from_text, side)             # <<<<<<<<<<<<<<
@@ -33979,7 +33710,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_3__getitem__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":20
  *             self.read_text(from_text, side)
  * 
  *     def __getitem__(self, i):             # <<<<<<<<<<<<<<
@@ -33997,7 +33728,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_2__getitem__(struct __pyx_obj_3_sa_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__getitem__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":21
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":21
  * 
  *     def __getitem__(self, i):
  *         return self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -34030,11 +33761,11 @@ static char __pyx_doc_3_sa_11SuffixArray_4read_text[] = "Constructs suffix array
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__filename,&__pyx_n_s__side,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -34048,10 +33779,12 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
       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--;
+        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 = 23; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -34081,7 +33814,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_5read_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":23
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":23
  *         return self.sa.arr[i]
  * 
  *     def read_text(self, filename, side):             # <<<<<<<<<<<<<<
@@ -34122,7 +33855,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":29
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -34146,7 +33879,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":30
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":30
  * 
  *         self.darray = DataArray(from_text=filename, side=side, use_sent_id=True)
  *         N = len(self.darray)             # <<<<<<<<<<<<<<
@@ -34159,7 +33892,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":31
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -34172,7 +33905,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":33
  *         V = len(self.darray.id2word)
  * 
  *         self.sa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -34194,7 +33927,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":34
  * 
  *         self.sa = IntList(initial_len=N)
  *         self.ha = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -34216,7 +33949,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":36
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":36
  *         self.ha = IntList(initial_len=V+1)
  * 
  *         isa = IntList(initial_len=N)             # <<<<<<<<<<<<<<
@@ -34235,7 +33968,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":37
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":37
  * 
  *         isa = IntList(initial_len=N)
  *         word_count = IntList(initial_len=V+1)             # <<<<<<<<<<<<<<
@@ -34254,7 +33987,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":40
  * 
  *         '''Step 1: bucket sort data'''
  *         cdef float sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -34270,7 +34003,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_sort_start_time = __pyx_t_4;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":41
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34279,7 +34012,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":42
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -34289,7 +34022,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_5 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":43
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -34298,7 +34031,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":44
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34308,7 +34041,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);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":46
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":46
  *             word_count.arr[a_i] = word_count.arr[a_i] + 1
  * 
  *         n = 0             # <<<<<<<<<<<<<<
@@ -34317,7 +34050,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_n = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":47
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":47
  * 
  *         n = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -34327,7 +34060,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_6 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":48
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":48
  *         n = 0
  *         for i from 0 <= i < V+1:
  *             self.ha.arr[i] = n             # <<<<<<<<<<<<<<
@@ -34336,7 +34069,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":49
+    /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -34345,7 +34078,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]));
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":50
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":50
  *             self.ha.arr[i] = n
  *             n = n + word_count.arr[i]
  *             word_count.arr[i] = 0             # <<<<<<<<<<<<<<
@@ -34355,7 +34088,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":52
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":52
  *             word_count.arr[i] = 0
  * 
  *         for i from 0 <= i < N:             # <<<<<<<<<<<<<<
@@ -34365,7 +34098,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_5 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":53
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":53
  * 
  *         for i from 0 <= i < N:
  *             a_i = self.darray.data.arr[i]             # <<<<<<<<<<<<<<
@@ -34374,7 +34107,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":54
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34383,7 +34116,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":55
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34392,7 +34125,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":56
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34402,7 +34135,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);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":59
  * 
  *         '''Determine size of initial runs'''
  *         current_run = 0             # <<<<<<<<<<<<<<
@@ -34411,7 +34144,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_current_run = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":60
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":60
  *         '''Determine size of initial runs'''
  *         current_run = 0
  *         for i from 0 <= i < V+1:             # <<<<<<<<<<<<<<
@@ -34421,7 +34154,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_6 = (__pyx_v_V + 1);
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":61
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -34437,7 +34170,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     if (__pyx_t_9) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":62
+      /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34449,7 +34182,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":64
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":64
  *                 current_run = current_run + 1
  *             else:
  *                 if current_run > 0:             # <<<<<<<<<<<<<<
@@ -34459,7 +34192,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_9 = (__pyx_v_current_run > 0);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":65
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":65
  *             else:
  *                 if current_run > 0:
  *                     self.sa.arr[self.ha.arr[i] - current_run] = -current_run             # <<<<<<<<<<<<<<
@@ -34468,7 +34201,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":66
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -34483,7 +34216,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_L11:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":68
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":68
  *                     current_run = 0
  * 
  *         logger.info("    Bucket sort took %f seconds", (monitor_cpu() - sort_start_time))             # <<<<<<<<<<<<<<
@@ -34520,7 +34253,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_11); __pyx_t_11 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":71
  * 
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1             # <<<<<<<<<<<<<<
@@ -34529,7 +34262,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
   __pyx_v_h = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":72
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":72
  *         '''Step 2: prefix-doubling sort'''
  *         h = 1
  *         while self.sa.arr[0] != -N:             # <<<<<<<<<<<<<<
@@ -34540,7 +34273,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_t_9 = ((__pyx_v_self->sa->arr[0]) != (-__pyx_v_N));
     if (!__pyx_t_9) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":73
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":73
  *         h = 1
  *         while self.sa.arr[0] != -N:
  *             sort_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
@@ -34556,7 +34289,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_v_sort_start_time = __pyx_t_4;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":74
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -34584,7 +34317,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":75
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":75
  *             sort_start_time = monitor_cpu()
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0             # <<<<<<<<<<<<<<
@@ -34593,7 +34326,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_i = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":76
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":76
  *             logger.debug("    Refining, sort depth = %d", h)
  *             i = 0
  *             skip = 0             # <<<<<<<<<<<<<<
@@ -34602,7 +34335,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_skip = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":77
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":77
  *             i = 0
  *             skip = 0
  *             while i < N:             # <<<<<<<<<<<<<<
@@ -34613,7 +34346,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_9 = (__pyx_v_i < __pyx_v_N);
       if (!__pyx_t_9) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":78
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":78
  *             skip = 0
  *             while i < N:
  *                 if self.sa.arr[i] < 0:             # <<<<<<<<<<<<<<
@@ -34623,7 +34356,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_t_9 = ((__pyx_v_self->sa->arr[__pyx_v_i]) < 0);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":79
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":79
  *             while i < N:
  *                 if self.sa.arr[i] < 0:
  *                     skip = skip + self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -34632,7 +34365,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]));
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":80
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -34644,7 +34377,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":82
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":82
  *                     i = i - self.sa.arr[i]
  *                 else:
  *                     if skip < 0:             # <<<<<<<<<<<<<<
@@ -34654,7 +34387,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         __pyx_t_9 = (__pyx_v_skip < 0);
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":83
+          /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":83
  *                 else:
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -34663,7 +34396,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":84
+          /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":84
  *                     if skip < 0:
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0             # <<<<<<<<<<<<<<
@@ -34675,7 +34408,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         }
         __pyx_L18:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":85
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":85
  *                         self.sa.arr[i+skip] = skip
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]             # <<<<<<<<<<<<<<
@@ -34684,7 +34417,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])]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":86
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":86
  *                         skip = 0
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)             # <<<<<<<<<<<<<<
@@ -34719,7 +34452,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
         __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":87
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":87
  *                     j = isa.arr[self.sa.arr[i]]
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1             # <<<<<<<<<<<<<<
@@ -34731,7 +34464,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
       __pyx_L17:;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":88
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":88
  *                     self.q3sort(i, j, h, isa)
  *                     i = j+1
  *             if skip < 0:             # <<<<<<<<<<<<<<
@@ -34741,7 +34474,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __pyx_t_9 = (__pyx_v_skip < 0);
     if (__pyx_t_9) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":89
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":89
  *                     i = j+1
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip             # <<<<<<<<<<<<<<
@@ -34753,7 +34486,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     }
     __pyx_L19:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":90
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":90
  *             if skip < 0:
  *                 self.sa.arr[i+skip] = skip
  *             h = h * 2             # <<<<<<<<<<<<<<
@@ -34762,7 +34495,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
  */
     __pyx_v_h = (__pyx_v_h * 2);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":91
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -34800,7 +34533,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":94
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -34817,7 +34550,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;
   __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":95
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -34827,7 +34560,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_4read_text(struct __pyx_obj_3_sa_Su
   __pyx_t_5 = __pyx_v_N;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":96
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":96
  *         logger.info("    Finalizing sort...")
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]             # <<<<<<<<<<<<<<
@@ -34836,7 +34569,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":97
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":97
  *         for i from 0 <= i < N:
  *             j = isa.arr[i]
  *             self.sa.arr[j] = i             # <<<<<<<<<<<<<<
@@ -34846,7 +34579,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":98
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -34910,11 +34643,11 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyO
   int __pyx_v_h;
   struct __pyx_obj_3_sa_IntList *__pyx_v_isa = 0;
   PyObject *__pyx_v_pad = 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 *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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)) {
@@ -34932,20 +34665,24 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyO
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 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--;
+        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 = 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--;
+        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 = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -34993,7 +34730,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_7q3sort(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":100
+/* "/home/paulb/workspace/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=""):             # <<<<<<<<<<<<<<
@@ -35023,7 +34760,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("q3sort", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":107
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":107
  *         cdef int k, midpoint, pval, phead, ptail, tmp
  * 
  *         if j-i < -1:             # <<<<<<<<<<<<<<
@@ -35033,7 +34770,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":108
+    /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -35070,7 +34807,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":109
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35080,7 +34817,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":110
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35094,7 +34831,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":111
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35104,7 +34841,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":112
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35113,7 +34850,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":113
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35122,7 +34859,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
     (__pyx_v_self->sa->arr[__pyx_v_i]) = -1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":114
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":114
  *             isa.arr[self.sa.arr[i]] = i
  *             self.sa.arr[i] = -1
  *             return             # <<<<<<<<<<<<<<
@@ -35136,7 +34873,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":123
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35145,7 +34882,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":124
+  /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35154,7 +34891,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)]);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":125
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":125
  *         midpoint = (i+j)/2
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:             # <<<<<<<<<<<<<<
@@ -35164,7 +34901,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":126
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":126
  *         pval = isa.arr[self.sa.arr[midpoint] + h]
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]             # <<<<<<<<<<<<<<
@@ -35173,7 +34910,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":127
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":127
  *         if i != midpoint:
  *             tmp = self.sa.arr[midpoint]
  *             self.sa.arr[midpoint] = self.sa.arr[i]             # <<<<<<<<<<<<<<
@@ -35182,7 +34919,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]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":128
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35194,7 +34931,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":129
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":129
  *             self.sa.arr[midpoint] = self.sa.arr[i]
  *             self.sa.arr[i] = tmp
  *         phead = i             # <<<<<<<<<<<<<<
@@ -35203,7 +34940,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_phead = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":130
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":130
  *             self.sa.arr[i] = tmp
  *         phead = i
  *         ptail = i             # <<<<<<<<<<<<<<
@@ -35212,7 +34949,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
   __pyx_v_ptail = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":134
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35222,7 +34959,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":135
+    /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35232,7 +34969,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":136
+      /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35242,7 +34979,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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":137
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35251,7 +34988,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":138
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35260,7 +34997,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":139
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35269,7 +35006,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)]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":140
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35281,7 +35018,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":142
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":142
  *                     self.sa.arr[ptail+1] = tmp
  *                 else: # k == ptail+1
  *                     tmp = self.sa.arr[phead]             # <<<<<<<<<<<<<<
@@ -35290,7 +35027,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":143
+        /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35299,7 +35036,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]);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":144
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35310,7 +35047,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
       }
       __pyx_L10:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":145
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":145
  *                     self.sa.arr[phead] = self.sa.arr[k]
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1             # <<<<<<<<<<<<<<
@@ -35319,7 +35056,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
  */
       __pyx_v_phead = (__pyx_v_phead + 1);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":146
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":146
  *                     self.sa.arr[k] = tmp
  *                 phead = phead + 1
  *                 ptail = ptail + 1             # <<<<<<<<<<<<<<
@@ -35331,7 +35068,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":148
+      /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":148
  *                 ptail = ptail + 1
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:             # <<<<<<<<<<<<<<
@@ -35341,7 +35078,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) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":149
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":149
  *             else:
  *                 if isa.arr[self.sa.arr[k] + h] == pval:
  *                     if k > ptail+1:             # <<<<<<<<<<<<<<
@@ -35351,7 +35088,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) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":150
+          /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35360,7 +35097,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)]);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":151
+          /* "/home/paulb/workspace/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]             # <<<<<<<<<<<<<<
@@ -35369,7 +35106,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]);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":152
+          /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35381,7 +35118,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
         }
         __pyx_L12:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":153
+        /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35396,7 +35133,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
     __pyx_L9:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":156
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":156
  * 
  *         # recursively sort smaller suffixes
  *         self.q3sort(i, phead-1, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
@@ -35436,7 +35173,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":160
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35446,7 +35183,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":161
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -35456,7 +35193,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":162
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35466,7 +35203,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":163
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":163
  *             isa.arr[self.sa.arr[k]] = ptail
  *         if phead == ptail:
  *             self.sa.arr[phead] = -1             # <<<<<<<<<<<<<<
@@ -35478,7 +35215,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_6q3sort(struct __pyx_obj_3_sa_Suffi
   }
   __pyx_L15:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":166
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":166
  * 
  *         # recursively sort larger suffixes
  *         self.q3sort(ptail+1, j, h, isa, pad+"    ")             # <<<<<<<<<<<<<<
@@ -35556,7 +35293,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_9write_text(PyObject *__pyx_v_self,
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":169
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":169
  * 
  * 
  *     def write_text(self, char* filename):             # <<<<<<<<<<<<<<
@@ -35575,7 +35312,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":170
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":170
  * 
  *     def write_text(self, char* filename):
  *         self.darray.write_text(filename)             # <<<<<<<<<<<<<<
@@ -35632,7 +35369,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_11read_binary(PyObject *__pyx_v_sel
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":172
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":172
  *         self.darray.write_text(filename)
  * 
  *     def read_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -35646,7 +35383,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_10read_binary(struct __pyx_obj_3_sa
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("read_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":174
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":174
  *     def read_binary(self, char* filename):
  *         cdef FILE *f
  *         f = fopen(filename, "r")             # <<<<<<<<<<<<<<
@@ -35655,7 +35392,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":175
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":175
  *         cdef FILE *f
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)             # <<<<<<<<<<<<<<
@@ -35664,7 +35401,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":176
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":176
  *         f = fopen(filename, "r")
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)             # <<<<<<<<<<<<<<
@@ -35673,7 +35410,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":177
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":177
  *         self.darray.read_handle(f)
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)             # <<<<<<<<<<<<<<
@@ -35682,7 +35419,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":178
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":178
  *         self.sa.read_handle(f)
  *         self.ha.read_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -35718,7 +35455,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_13write_binary(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":180
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":180
  *         fclose(f)
  * 
  *     def write_binary(self, char* filename):             # <<<<<<<<<<<<<<
@@ -35732,7 +35469,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_12write_binary(struct __pyx_obj_3_s
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("write_binary", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":182
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":182
  *     def write_binary(self, char* filename):
  *         cdef FILE* f
  *         f = fopen(filename, "w")             # <<<<<<<<<<<<<<
@@ -35741,7 +35478,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":183
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":183
  *         cdef FILE* f
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)             # <<<<<<<<<<<<<<
@@ -35750,7 +35487,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":184
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":184
  *         f = fopen(filename, "w")
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)             # <<<<<<<<<<<<<<
@@ -35759,7 +35496,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":185
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":185
  *         self.darray.write_handle(f)
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)             # <<<<<<<<<<<<<<
@@ -35768,7 +35505,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":186
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":186
  *         self.sa.write_handle(f)
  *         self.ha.write_handle(f)
  *         fclose(f)             # <<<<<<<<<<<<<<
@@ -35804,7 +35541,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_15write_enhanced(PyObject *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":188
+/* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":188
  *         fclose(f)
  * 
  *     def write_enhanced(self, char* filename):             # <<<<<<<<<<<<<<
@@ -35836,7 +35573,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("write_enhanced", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":189
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -35876,7 +35613,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":190
+          /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -35896,7 +35633,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":191
+          /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -35914,18 +35651,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           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 = 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 = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } 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 = 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 = 191; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_8); __Pyx_INCREF(__pyx_t_1); __pyx_t_8++;
             } else {
               __pyx_t_1 = __pyx_t_9(__pyx_t_2);
               if (unlikely(!__pyx_t_1)) {
@@ -35941,7 +35670,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":192
+            /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -35965,7 +35694,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":193
+          /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -35979,7 +35708,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":194
+          /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":194
  *                 f.write("%d " % a_i)
  *             f.write("\n")
  *             for w_i in self.ha:             # <<<<<<<<<<<<<<
@@ -35997,18 +35726,10 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           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 = 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 = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } 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 = 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 = 194; __pyx_clineno = __LINE__; goto __pyx_L7_error;}
-              #endif
+              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_8); __Pyx_INCREF(__pyx_t_2); __pyx_t_8++;
             } else {
               __pyx_t_2 = __pyx_t_9(__pyx_t_4);
               if (unlikely(!__pyx_t_2)) {
@@ -36024,7 +35745,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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":195
+            /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":195
  *             f.write("\n")
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)             # <<<<<<<<<<<<<<
@@ -36048,7 +35769,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
           }
           __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":196
+          /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -36072,7 +35793,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":189
+        /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -36170,7 +35891,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_14write_enhanced(struct __pyx_obj_3
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":198
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -36185,7 +35906,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":201
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":201
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -36195,7 +35916,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":202
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":202
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -36208,7 +35929,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":203
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":203
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -36217,7 +35938,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":204
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -36227,7 +35948,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":205
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36240,7 +35961,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":207
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36258,7 +35979,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_high(struct __pyx_obj_3_sa_Suffix
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":209
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -36273,7 +35994,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":212
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":212
  *         cdef int midpoint
  * 
  *         if low >= high:             # <<<<<<<<<<<<<<
@@ -36283,7 +36004,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":213
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":213
  * 
  *         if low >= high:
  *             return high             # <<<<<<<<<<<<<<
@@ -36296,7 +36017,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":214
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":214
  *         if low >= high:
  *             return high
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -36305,7 +36026,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":215
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -36315,7 +36036,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":216
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36328,7 +36049,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":218
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36346,7 +36067,7 @@ static int __pyx_f_3_sa_11SuffixArray___search_low(struct __pyx_obj_3_sa_SuffixA
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":220
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -36365,7 +36086,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":221
+  /* "/home/paulb/workspace/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),             # <<<<<<<<<<<<<<
@@ -36376,7 +36097,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":222
+  /* "/home/paulb/workspace/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))             # <<<<<<<<<<<<<<
@@ -36411,7 +36132,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___get_range(struct __pyx_obj_3_sa_Su
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":224
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -36432,7 +36153,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__lookup_helper", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":227
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":227
  *         cdef int midpoint
  * 
  *         if offset == 0:             # <<<<<<<<<<<<<<
@@ -36442,7 +36163,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":228
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":228
  * 
  *         if offset == 0:
  *             return (self.ha.arr[word_id], self.ha.arr[word_id+1])             # <<<<<<<<<<<<<<
@@ -36469,7 +36190,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":229
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -36479,7 +36200,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":230
+    /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -36494,7 +36215,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":232
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":232
  *             return None
  * 
  *         midpoint = (high + low) / 2             # <<<<<<<<<<<<<<
@@ -36503,7 +36224,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":233
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":233
  * 
  *         midpoint = (high + low) / 2
  *         if self.darray.data.arr[self.sa.arr[midpoint] + offset] == word_id:             # <<<<<<<<<<<<<<
@@ -36513,7 +36234,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":234
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36530,7 +36251,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":235
+  /* "/home/paulb/workspace/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:             # <<<<<<<<<<<<<<
@@ -36540,7 +36261,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/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":236
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36557,7 +36278,7 @@ static PyObject *__pyx_f_3_sa_11SuffixArray___lookup_helper(struct __pyx_obj_3_s
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":238
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36594,11 +36315,11 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, Py
   int __pyx_v_offset;
   int __pyx_v_low;
   int __pyx_v_high;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__word,&__pyx_n_s__offset,&__pyx_n_s__low,&__pyx_n_s__high,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -36614,20 +36335,24 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, Py
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 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--;
+        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 = 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--;
+        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 = 240; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
@@ -36661,7 +36386,7 @@ static PyObject *__pyx_pw_3_sa_11SuffixArray_17lookup(PyObject *__pyx_v_self, Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":240
+/* "/home/paulb/workspace/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):             # <<<<<<<<<<<<<<
@@ -36682,7 +36407,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lookup", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":242
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":242
  *     def lookup(self, word, int offset, int low, int high):
  *         cdef int wordid
  *         if low == -1:             # <<<<<<<<<<<<<<
@@ -36692,7 +36417,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":243
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":243
  *         cdef int wordid
  *         if low == -1:
  *             low = 0             # <<<<<<<<<<<<<<
@@ -36704,7 +36429,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":244
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":244
  *         if low == -1:
  *             low = 0
  *         if high == -1:             # <<<<<<<<<<<<<<
@@ -36714,7 +36439,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":245
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":245
  *             low = 0
  *         if high == -1:
  *             high = len(self.sa)             # <<<<<<<<<<<<<<
@@ -36730,17 +36455,17 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":246
+  /* "/home/paulb/workspace/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 = 246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->darray->word2id, __pyx_v_word))); 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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":247
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":247
  *             high = len(self.sa)
  *         if word in self.darray.word2id:
  *             word_id = self.darray.word2id[word]             # <<<<<<<<<<<<<<
@@ -36752,7 +36477,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":248
+    /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -36770,7 +36495,7 @@ static PyObject *__pyx_pf_3_sa_11SuffixArray_16lookup(struct __pyx_obj_3_sa_Suff
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":250
+    /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":250
  *             return self.__lookup_helper(word_id, offset, low, high)
  *         else:
  *             return None             # <<<<<<<<<<<<<<
@@ -36809,7 +36534,7 @@ static int __pyx_pw_3_sa_8TrieNode_1__cinit__(PyObject *__pyx_v_self, PyObject *
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":50
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":49
  *     cdef public children
  * 
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -36826,14 +36551,14 @@ static int __pyx_pf_3_sa_8TrieNode___cinit__(struct __pyx_obj_3_sa_TrieNode *__p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":51
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":50
  * 
  *     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 = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 50; __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);
@@ -36863,7 +36588,7 @@ static PyObject *__pyx_pw_3_sa_8TrieNode_8children_1__get__(PyObject *__pyx_v_se
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":48
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":47
  * 
  * cdef class TrieNode:
  *     cdef public children             # <<<<<<<<<<<<<<
@@ -36945,14 +36670,14 @@ static int __pyx_pw_3_sa_16ExtendedTrieNode_1__cinit__(PyObject *__pyx_v_self, P
   PyObject *__pyx_v_phrase = 0;
   PyObject *__pyx_v_phrase_location = 0;
   PyObject *__pyx_v_suffix_link = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__phrase,&__pyx_n_s__phrase_location,&__pyx_n_s__suffix_link,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":58
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":57
  *     cdef public suffix_link
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):             # <<<<<<<<<<<<<<
@@ -36991,7 +36716,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 = 58; __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)) {
@@ -37008,7 +36733,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 = 58; __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 = 57; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.ExtendedTrieNode.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -37024,7 +36749,7 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode___cinit__(struct __pyx_obj_3_sa_Exte
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":58
  * 
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase             # <<<<<<<<<<<<<<
@@ -37037,7 +36762,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":60
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":59
  *     def __cinit__(self, phrase=None, phrase_location=None, suffix_link=None):
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location             # <<<<<<<<<<<<<<
@@ -37050,7 +36775,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":61
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":60
  *         self.phrase = phrase
  *         self.phrase_location = phrase_location
  *         self.suffix_link = suffix_link             # <<<<<<<<<<<<<<
@@ -37079,7 +36804,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_6phrase_1__get__(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":54
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":53
  * 
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase             # <<<<<<<<<<<<<<
@@ -37166,7 +36891,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_15phrase_location_1__get__(PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":55
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":54
  * cdef class ExtendedTrieNode(TrieNode):
  *     cdef public phrase
  *     cdef public phrase_location             # <<<<<<<<<<<<<<
@@ -37253,7 +36978,7 @@ static PyObject *__pyx_pw_3_sa_16ExtendedTrieNode_11suffix_link_1__get__(PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":56
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":55
  *     cdef public phrase
  *     cdef public phrase_location
  *     cdef public suffix_link             # <<<<<<<<<<<<<<
@@ -37333,11 +37058,11 @@ static int __pyx_pf_3_sa_16ExtendedTrieNode_11suffix_link_4__del__(struct __pyx_
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__extended,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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)) {
@@ -37357,7 +37082,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 = 68; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -37370,7 +37095,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 = 68; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.TrieTable.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -37381,7 +37106,7 @@ static int __pyx_pw_3_sa_9TrieTable_1__cinit__(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":68
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":67
  *     cdef public int count
  *     cdef public root
  *     def __cinit__(self, extended=False):             # <<<<<<<<<<<<<<
@@ -37400,7 +37125,7 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":69
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":68
  *     cdef public root
  *     def __cinit__(self, extended=False):
  *         self.count = 0             # <<<<<<<<<<<<<<
@@ -37409,34 +37134,34 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
  */
   __pyx_v_self->count = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":70
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":69
  *     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 = 70; __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 = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":70
  *         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 = 71; __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 = 70; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":72
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":71
  *         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 = 72; __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 = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -37447,14 +37172,14 @@ static int __pyx_pf_3_sa_9TrieTable___cinit__(struct __pyx_obj_3_sa_TrieTable *_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":74
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":73
  *             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 = 74; __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 = 73; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_GIVEREF(__pyx_t_3);
     __Pyx_GOTREF(__pyx_v_self->root);
@@ -37486,7 +37211,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_8extended_1__get__(PyObject *__pyx_v_s
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":65
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":64
  * 
  * cdef class TrieTable:
  *     cdef public int extended             # <<<<<<<<<<<<<<
@@ -37503,7 +37228,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 = 65; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -37540,7 +37265,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 = 65; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->extended = __pyx_t_1;
 
   __pyx_r = 0;
@@ -37564,7 +37289,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_5count_1__get__(PyObject *__pyx_v_self
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":66
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":65
  * cdef class TrieTable:
  *     cdef public int extended
  *     cdef public int count             # <<<<<<<<<<<<<<
@@ -37581,7 +37306,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 = 66; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -37618,7 +37343,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 = 66; __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 = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_self->count = __pyx_t_1;
 
   __pyx_r = 0;
@@ -37642,7 +37367,7 @@ static PyObject *__pyx_pw_3_sa_9TrieTable_4root_1__get__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":67
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":66
  *     cdef public int extended
  *     cdef public int count
  *     cdef public root             # <<<<<<<<<<<<<<
@@ -37718,7 +37443,7 @@ static int __pyx_pf_3_sa_9TrieTable_4root_4__del__(struct __pyx_obj_3_sa_TrieTab
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":94
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":93
  * 
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):             # <<<<<<<<<<<<<<
@@ -37731,7 +37456,7 @@ static int __pyx_f_3_sa_14PhraseLocation_contains(CYTHON_UNUSED struct __pyx_obj
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("contains", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":95
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":94
  *     # returns true if sent_id is contained
  *     cdef int contains(self, int sent_id):
  *         return 1             # <<<<<<<<<<<<<<
@@ -37756,14 +37481,14 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   int __pyx_v_arr_high;
   PyObject *__pyx_v_arr = 0;
   int __pyx_v_num_subpatterns;
+  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};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":98
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":97
  * 
  *     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):             # <<<<<<<<<<<<<<
@@ -37818,7 +37543,27 @@ 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 = 97; __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 = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      if (values[0]) {
+      } else {
+        __pyx_v_sa_low = ((int)-1);
+      }
+      if (values[1]) {
+      } else {
+        __pyx_v_sa_high = ((int)-1);
+      }
+      if (values[2]) {
+      } else {
+        __pyx_v_arr_low = ((int)-1);
+      }
+      if (values[3]) {
+      } else {
+        __pyx_v_arr_high = ((int)-1);
+      }
+      if (values[5]) {
+      } else {
+        __pyx_v_num_subpatterns = ((int)1);
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -37833,35 +37578,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 = 97; __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 = 96; __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 = 97; __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 = 96; __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 = 97; __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 = 96; __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 = 97; __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 = 96; __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 = 98; __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 = 97; __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 = 97; __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 = 96; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.PhraseLocation.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -37872,7 +37617,7 @@ static int __pyx_pw_3_sa_14PhraseLocation_1__cinit__(PyObject *__pyx_v_self, PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":97
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":96
  *         return 1
  * 
  *     def __cinit__(self, int sa_low=-1, int sa_high=-1, int arr_low=-1, int arr_high=-1,             # <<<<<<<<<<<<<<
@@ -37888,7 +37633,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":99
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":98
  *     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             # <<<<<<<<<<<<<<
@@ -37897,7 +37642,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_low = __pyx_v_sa_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":100
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":99
  *             arr=None, int num_subpatterns=1):
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high             # <<<<<<<<<<<<<<
@@ -37906,7 +37651,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->sa_high = __pyx_v_sa_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":101
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":100
  *         self.sa_low = sa_low
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low             # <<<<<<<<<<<<<<
@@ -37915,7 +37660,7 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_low = __pyx_v_arr_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":102
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":101
  *         self.sa_high = sa_high
  *         self.arr_low = arr_low
  *         self.arr_high = arr_high             # <<<<<<<<<<<<<<
@@ -37924,21 +37669,21 @@ static int __pyx_pf_3_sa_14PhraseLocation___cinit__(struct __pyx_obj_3_sa_Phrase
  */
   __pyx_v_self->arr_high = __pyx_v_arr_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":103
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":102
  *         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 = 103; __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 = 102; __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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":104
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":103
  *         self.arr_high = arr_high
  *         self.arr = arr
  *         self.num_subpatterns = num_subpatterns             # <<<<<<<<<<<<<<
@@ -37962,11 +37707,11 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__sample_size,&__pyx_n_s__fsarray,0};
   int __pyx_r;
   __Pyx_RefNannyDeclarations
   __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;
@@ -37980,16 +37725,18 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 114; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 113; __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 = 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[8]; __pyx_lineno = 113; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -37997,18 +37744,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 = 114; __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 = 113; __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 = 114; __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 = 113; __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 = 114; __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 = 113; __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:;
@@ -38018,7 +37765,7 @@ static int __pyx_pw_3_sa_7Sampler_1__cinit__(PyObject *__pyx_v_self, PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":114
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":113
  *     cdef IntList sa
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):             # <<<<<<<<<<<<<<
@@ -38038,7 +37785,7 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":115
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":114
  * 
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size             # <<<<<<<<<<<<<<
@@ -38047,7 +37794,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":116
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":115
  *     def __cinit__(self, int sample_size, SuffixArray fsarray):
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa             # <<<<<<<<<<<<<<
@@ -38060,7 +37807,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":117
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":116
  *         self.sample_size = sample_size
  *         self.sa = fsarray.sa
  *         if sample_size > 0:             # <<<<<<<<<<<<<<
@@ -38070,21 +37817,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":118
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":117
  *         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 = 118; __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 = 117; __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 = 118; __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 = 117; __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 = 118; __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 = 117; __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 = 118; __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 = 117; __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));
@@ -38092,7 +37839,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 = 118; __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 = 117; __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;
@@ -38101,19 +37848,19 @@ static int __pyx_pf_3_sa_7Sampler___cinit__(struct __pyx_obj_3_sa_Sampler *__pyx
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":120
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":119
  *             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 = 120; __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 = 119; __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 = 120; __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 = 119; __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 = 120; __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 = 119; __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;
@@ -38140,7 +37887,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 = 122; __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 = 121; __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:;
@@ -38150,7 +37897,7 @@ static PyObject *__pyx_pw_3_sa_7Sampler_3sample(PyObject *__pyx_v_self, PyObject
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":122
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":121
  *             logger.info("Sampling strategy: no sampling")
  * 
  *     def sample(self, PhraseLocation phrase_location):             # <<<<<<<<<<<<<<
@@ -38177,19 +37924,19 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sample", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":135
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":134
  *         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 = 135; __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 = 134; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":136
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":135
  * 
  *         sample = IntList()
  *         if phrase_location.arr is None:             # <<<<<<<<<<<<<<
@@ -38199,7 +37946,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":137
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":136
  *         sample = IntList()
  *         if phrase_location.arr is None:
  *             num_locations = phrase_location.sa_high - phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -38208,7 +37955,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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":138
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":137
  *         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:             # <<<<<<<<<<<<<<
@@ -38224,7 +37971,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":139
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":138
  *             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)             # <<<<<<<<<<<<<<
@@ -38236,7 +37983,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":141
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":140
  *                 sample._extend_arr(self.sa.arr + phrase_location.sa_low, num_locations)
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -38245,11 +37992,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 = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":142
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":141
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.sa_low             # <<<<<<<<<<<<<<
@@ -38258,7 +38005,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->sa_low;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":143
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":142
  *                 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:             # <<<<<<<<<<<<<<
@@ -38275,26 +38022,50 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_3) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":146
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":145
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
- *                     val = int(i + 0.5 + 1e-8)             # <<<<<<<<<<<<<<
+ *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
+ *                         val = int(ceil(i))
+ *                     else:
+ */
+        __pyx_t_3 = (fmod(__pyx_v_i, 1.0) > 0.5);
+        if (__pyx_t_3) {
+
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":146
+ *                     effect, according to the python documentation'''
+ *                     if fmod(i,1.0) > 0.5:
+ *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
+ *                     else:
+ *                         val = int(floor(i))
+ */
+          __pyx_v_val = ((int)ceil(__pyx_v_i));
+          goto __pyx_L7;
+        }
+        /*else*/ {
+
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":148
+ *                         val = int(ceil(i))
+ *                     else:
+ *                         val = int(floor(i))             # <<<<<<<<<<<<<<
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize
  */
-        __pyx_v_val = ((int)((__pyx_v_i + 0.5) + 1e-8));
+          __pyx_v_val = ((int)floor(__pyx_v_i));
+        }
+        __pyx_L7:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":147
- *                     effect, according to the python documentation'''
- *                     val = int(i + 0.5 + 1e-8)
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":149
+ *                     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]));
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":148
- *                     val = int(i + 0.5 + 1e-8)
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":150
+ *                         val = int(floor(i))
  *                     sample._append(self.sa.arr[val])
  *                     i = i + stepsize             # <<<<<<<<<<<<<<
  *         else:
@@ -38308,7 +38079,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":150
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":152
  *                     i = i + stepsize
  *         else:
  *             num_locations = (phrase_location.arr_high - phrase_location.arr_low) / phrase_location.num_subpatterns             # <<<<<<<<<<<<<<
@@ -38318,15 +38089,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 = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 152; __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 = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
     __pyx_v_num_locations = __Pyx_div_int(__pyx_t_5, __pyx_v_phrase_location->num_subpatterns);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":151
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":153
  *         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:             # <<<<<<<<<<<<<<
@@ -38342,7 +38113,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
     }
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":152
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":154
  *             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             # <<<<<<<<<<<<<<
@@ -38352,11 +38123,11 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
       __Pyx_INCREF(((PyObject *)__pyx_v_phrase_location->arr));
       __Pyx_DECREF(((PyObject *)__pyx_v_sample));
       __pyx_v_sample = __pyx_v_phrase_location->arr;
-      goto __pyx_L7;
+      goto __pyx_L8;
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":154
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":156
  *                 sample = phrase_location.arr
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)             # <<<<<<<<<<<<<<
@@ -38365,11 +38136,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 = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __pyx_v_stepsize = (((double)__pyx_v_num_locations) / ((double)__pyx_v_self->sample_size));
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":155
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":157
  *             else:
  *                 stepsize = float(num_locations)/float(self.sample_size)
  *                 i = phrase_location.arr_low             # <<<<<<<<<<<<<<
@@ -38378,7 +38149,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
  */
       __pyx_v_i = __pyx_v_phrase_location->arr_low;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":156
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":158
  *                 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:             # <<<<<<<<<<<<<<
@@ -38395,26 +38166,50 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
         }
         if (!__pyx_t_4) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":159
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":161
  *                     '''Note: int(i) not guaranteed to have the desired
  *                     effect, according to the python documentation'''
- *                     val = int(i + 0.5 + 1e-8)             # <<<<<<<<<<<<<<
+ *                     if fmod(i,1.0) > 0.5:             # <<<<<<<<<<<<<<
+ *                         val = int(ceil(i))
+ *                     else:
+ */
+        __pyx_t_4 = (fmod(__pyx_v_i, 1.0) > 0.5);
+        if (__pyx_t_4) {
+
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":162
+ *                     effect, according to the python documentation'''
+ *                     if fmod(i,1.0) > 0.5:
+ *                         val = int(ceil(i))             # <<<<<<<<<<<<<<
+ *                     else:
+ *                         val = int(floor(i))
+ */
+          __pyx_v_val = ((int)ceil(__pyx_v_i));
+          goto __pyx_L11;
+        }
+        /*else*/ {
+
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":164
+ *                         val = int(ceil(i))
+ *                     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)
  */
-        __pyx_v_val = ((int)((__pyx_v_i + 0.5) + 1e-8));
+          __pyx_v_val = ((int)floor(__pyx_v_i));
+        }
+        __pyx_L11:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":160
- *                     effect, according to the python documentation'''
- *                     val = int(i + 0.5 + 1e-8)
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":165
+ *                     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));
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":161
- *                     val = int(i + 0.5 + 1e-8)
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":166
+ *                         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
@@ -38422,7 +38217,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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":162
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":167
  *                     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             # <<<<<<<<<<<<<<
@@ -38432,11 +38227,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_L7:;
+    __pyx_L8:;
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":163
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":168
  *                     sample._extend_arr(phrase_location.arr.arr + j, phrase_location.num_subpatterns)
  *                     i = i + stepsize
  *         return sample             # <<<<<<<<<<<<<<
@@ -38461,7 +38256,7 @@ static PyObject *__pyx_pf_3_sa_7Sampler_2sample(struct __pyx_obj_3_sa_Sampler *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":175
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":180
  * 
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):             # <<<<<<<<<<<<<<
@@ -38473,7 +38268,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":176
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":181
  * 
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr             # <<<<<<<<<<<<<<
@@ -38482,7 +38277,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":177
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":182
  * cdef void assign_matching(Matching* m, int* arr, int start, int step, int* sent_id_arr):
  *     m.arr = arr
  *     m.start = start             # <<<<<<<<<<<<<<
@@ -38491,7 +38286,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":178
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":183
  *     m.arr = arr
  *     m.start = start
  *     m.end = start + step             # <<<<<<<<<<<<<<
@@ -38500,7 +38295,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":179
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":184
  *     m.start = start
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]             # <<<<<<<<<<<<<<
@@ -38509,7 +38304,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":180
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":185
  *     m.end = start + step
  *     m.sent_id = sent_id_arr[arr[start]]
  *     m.size = step             # <<<<<<<<<<<<<<
@@ -38521,7 +38316,7 @@ static void __pyx_f_3_sa_assign_matching(struct __pyx_t_3_sa_Matching *__pyx_v_m
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":183
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":188
  * 
  * 
  * cdef int* append_combined_matching(int* arr, Matching* loc1, Matching* loc2,             # <<<<<<<<<<<<<<
@@ -38538,7 +38333,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":187
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":192
  *     cdef int i, new_len
  * 
  *     new_len = result_len[0] + num_subpatterns             # <<<<<<<<<<<<<<
@@ -38547,7 +38342,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":188
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":193
  * 
  *     new_len = result_len[0] + num_subpatterns
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -38556,7 +38351,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":190
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":195
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  * 
  *     for i from 0 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -38566,7 +38361,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":191
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":196
  * 
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]             # <<<<<<<<<<<<<<
@@ -38576,7 +38371,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":192
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":197
  *     for i from 0 <= i < loc1.size:
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:             # <<<<<<<<<<<<<<
@@ -38586,7 +38381,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":193
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":198
  *         arr[result_len[0]+i] = loc1.arr[loc1.start+i]
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]             # <<<<<<<<<<<<<<
@@ -38598,7 +38393,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":194
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":199
  *     if num_subpatterns > loc1.size:
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -38607,7 +38402,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":195
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":200
  *         arr[new_len-1] = loc2.arr[loc2.end-1]
  *     result_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -38623,7 +38418,7 @@ static int *__pyx_f_3_sa_append_combined_matching(int *__pyx_v_arr, struct __pyx
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":198
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":203
  * 
  * 
  * cdef int* extend_arr(int* arr, int* arr_len, int* appendix, int appendix_len):             # <<<<<<<<<<<<<<
@@ -38637,7 +38432,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":201
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":206
  *     cdef int new_len
  * 
  *     new_len = arr_len[0] + appendix_len             # <<<<<<<<<<<<<<
@@ -38646,7 +38441,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":202
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":207
  * 
  *     new_len = arr_len[0] + appendix_len
  *     arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -38655,7 +38450,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":203
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":208
  *     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))             # <<<<<<<<<<<<<<
@@ -38664,7 +38459,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":204
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":209
  *     arr = <int*> realloc(arr, new_len*sizeof(int))
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -38673,7 +38468,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":205
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":210
  *     memcpy(arr+arr_len[0], appendix, appendix_len*sizeof(int))
  *     arr_len[0] = new_len
  *     return arr             # <<<<<<<<<<<<<<
@@ -38689,7 +38484,7 @@ static int *__pyx_f_3_sa_extend_arr(int *__pyx_v_arr, int *__pyx_v_arr_len, int
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":207
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":212
  *     return arr
  * 
  * cdef int median(int low, int high, int step):             # <<<<<<<<<<<<<<
@@ -38706,7 +38501,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":208
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":213
  * 
  * cdef int median(int low, int high, int step):
  *     return low + (((high - low)/step)/2)*step             # <<<<<<<<<<<<<<
@@ -38716,11 +38511,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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 213; __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 = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 213; __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;
@@ -38735,7 +38530,7 @@ static int __pyx_f_3_sa_median(int __pyx_v_low, int __pyx_v_high, int __pyx_v_st
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":211
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":216
  * 
  * 
  * cdef void find_comparable_matchings(int low, int high, int* arr, int step, int loc, int* loc_minus, int* loc_plus):             # <<<<<<<<<<<<<<
@@ -38750,7 +38545,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":215
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":220
  *     # in which all matchings have the same first index as the one
  *     # starting at loc
  *     loc_plus[0] = loc + step             # <<<<<<<<<<<<<<
@@ -38759,7 +38554,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":216
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":221
  *     # starting at loc
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:             # <<<<<<<<<<<<<<
@@ -38776,7 +38571,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":217
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":222
  *     loc_plus[0] = loc + step
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step             # <<<<<<<<<<<<<<
@@ -38786,7 +38581,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":218
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":223
  *     while loc_plus[0] < high and arr[loc_plus[0]] == arr[loc]:
  *         loc_plus[0] = loc_plus[0] + step
  *     loc_minus[0] = loc             # <<<<<<<<<<<<<<
@@ -38795,7 +38590,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":219
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":224
  *         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]:             # <<<<<<<<<<<<<<
@@ -38812,7 +38607,7 @@ static void __pyx_f_3_sa_find_comparable_matchings(int __pyx_v_low, int __pyx_v_
     }
     if (!__pyx_t_2) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":220
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":225
  *     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             # <<<<<<<<<<<<<<
@@ -38849,14 +38644,14 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
   int __pyx_v_use_baeza_yates;
   int __pyx_v_use_collocations;
   int __pyx_v_use_index;
+  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};
   int __pyx_r;
   __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_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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":291
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":296
  *             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,             # <<<<<<<<<<<<<<
@@ -38865,7 +38660,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[3] = ((PyObject *)Py_None);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":299
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":304
  *             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,             # <<<<<<<<<<<<<<
@@ -38874,7 +38669,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[7] = ((PyObject *)Py_None);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":301
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":306
  *             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,             # <<<<<<<<<<<<<<
@@ -38883,7 +38678,7 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
  */
     values[8] = ((PyObject *)Py_None);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":305
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":310
  *             unsigned min_gap_size=2,
  *             # filename of file containing precomputed collocations
  *             precompute_file=None,             # <<<<<<<<<<<<<<
@@ -38922,7 +38717,8 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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) {
@@ -39026,7 +38822,127 @@ 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 = 283; __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 = 288; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      }
+      if (values[1]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":292
+ *             Alignment alignment,
+ *             # parameter for double-binary search; doesn't seem to matter much
+ *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
+ *             # name of generic nonterminal used by Hiero
+ *             char* category="[X]",
+ */
+        __pyx_v_by_slack_factor = ((float)1.0);
+      }
+      if (values[2]) {
+      } else {
+        __pyx_v_category = ((char *)__pyx_k_105);
+      }
+      if (values[4]) {
+      } else {
+        __pyx_v_max_initial_size = ((unsigned int)10);
+      }
+      if (values[5]) {
+      } else {
+        __pyx_v_max_length = ((unsigned int)5);
+      }
+      if (values[6]) {
+      } else {
+        __pyx_v_max_nonterminals = ((unsigned int)2);
+      }
+      if (values[9]) {
+      } else {
+        __pyx_v_min_gap_size = ((unsigned int)2);
+      }
+      if (values[11]) {
+      } else {
+        __pyx_v_precompute_secondary_rank = ((unsigned int)20);
+      }
+      if (values[12]) {
+      } else {
+        __pyx_v_precompute_rank = ((unsigned int)100);
+      }
+      if (values[13]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":316
+ *             unsigned precompute_rank=100,
+ *             # require extracted rules to have at least one aligned word
+ *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
+ *             # require each contiguous chunk of extracted rules to have at least one aligned word
+ *             bint require_aligned_chunks=False,
+ */
+        __pyx_v_require_aligned_terminal = ((int)1);
+      }
+      if (values[14]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":318
+ *             bint require_aligned_terminal=True,
+ *             # require each contiguous chunk of extracted rules to have at least one aligned word
+ *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
+ *             # maximum span of a grammar rule extracted from TRAINING DATA
+ *             unsigned train_max_initial_size=10,
+ */
+        __pyx_v_require_aligned_chunks = ((int)0);
+      }
+      if (values[15]) {
+      } else {
+        __pyx_v_train_max_initial_size = ((unsigned int)10);
+      }
+      if (values[16]) {
+      } else {
+        __pyx_v_train_min_gap_size = ((unsigned int)2);
+      }
+      if (values[17]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":324
+ *             unsigned train_min_gap_size=2,
+ *             # False if phrases should be loose (better but slower), True otherwise
+ *             bint tight_phrases=True,             # <<<<<<<<<<<<<<
+ *             # True to require use of double-binary alg, false otherwise
+ *             bint use_baeza_yates=True,
+ */
+        __pyx_v_tight_phrases = ((int)1);
+      }
+      if (values[18]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":326
+ *             bint tight_phrases=True,
+ *             # True to require use of double-binary alg, false otherwise
+ *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
+ *             # True to enable used of precomputed collocations
+ *             bint use_collocations=True,
+ */
+        __pyx_v_use_baeza_yates = ((int)1);
+      }
+      if (values[19]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":328
+ *             bint use_baeza_yates=True,
+ *             # True to enable used of precomputed collocations
+ *             bint use_collocations=True,             # <<<<<<<<<<<<<<
+ *             # True to enable use of precomputed inverted indices
+ *             bint use_index=True):
+ */
+        __pyx_v_use_collocations = ((int)1);
+      }
+      if (values[20]) {
+      } else {
+
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":330
+ *             bint use_collocations=True,
+ *             # True to enable use of precomputed inverted indices
+ *             bint use_index=True):             # <<<<<<<<<<<<<<
+ *         '''Note: we make a distinction between the min_gap_size
+ *         and max_initial_size used in test and train.    The latter
+ */
+        __pyx_v_use_index = ((int)1);
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -39057,10 +38973,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 = 287; __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 = 292; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":287
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":292
  *             Alignment alignment,
  *             # parameter for double-binary search; doesn't seem to matter much
  *             float by_slack_factor=1.0,             # <<<<<<<<<<<<<<
@@ -39070,49 +38986,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 = 289; __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 = 294; __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 = 293; __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 = 298; __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 = 295; __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 = 300; __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 = 297; __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 = 302; __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 = 303; __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 = 308; __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 = 307; __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 = 312; __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 = 309; __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 = 314; __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 = 311; __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 = 316; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":311
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":316
  *             unsigned precompute_rank=100,
  *             # require extracted rules to have at least one aligned word
  *             bint require_aligned_terminal=True,             # <<<<<<<<<<<<<<
@@ -39122,10 +39038,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 = 313; __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 = 318; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":313
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":318
  *             bint require_aligned_terminal=True,
  *             # require each contiguous chunk of extracted rules to have at least one aligned word
  *             bint require_aligned_chunks=False,             # <<<<<<<<<<<<<<
@@ -39135,20 +39051,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 = 315; __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 = 320; __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 = 317; __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 = 322; __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 = 319; __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 = 324; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":319
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":324
  *             unsigned train_min_gap_size=2,
  *             # False if phrases should be loose (better but slower), True otherwise
  *             bint tight_phrases=True,             # <<<<<<<<<<<<<<
@@ -39158,10 +39074,10 @@ static int __pyx_pw_3_sa_23HieroCachingRuleFactory_1__cinit__(PyObject *__pyx_v_
       __pyx_v_tight_phrases = ((int)1);
     }
     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 = 321; __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 = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":321
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":326
  *             bint tight_phrases=True,
  *             # True to require use of double-binary alg, false otherwise
  *             bint use_baeza_yates=True,             # <<<<<<<<<<<<<<
@@ -39171,10 +39087,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 = 323; __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 = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":323
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":328
  *             bint use_baeza_yates=True,
  *             # True to enable used of precomputed collocations
  *             bint use_collocations=True,             # <<<<<<<<<<<<<<
@@ -39184,10 +39100,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 = 325; __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 = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     } else {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":325
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":330
  *             bint use_collocations=True,
  *             # True to enable use of precomputed inverted indices
  *             bint use_index=True):             # <<<<<<<<<<<<<<
@@ -39199,13 +39115,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 = 283; __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 = 288; __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 = 285; __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 = 290; __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:;
@@ -39222,12 +39138,13 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9__cinit___lambda1(PyOb
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":401
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":406
  *         self.phrases_f = defaultdict(int)
  *         self.phrases_e = defaultdict(int)
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))             # <<<<<<<<<<<<<<
@@ -39246,14 +39163,14 @@ 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 = 401; __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 = 406; __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 = 401; __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 = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_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 = 401; __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 = 406; __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;
@@ -39282,12 +39199,13 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9__cinit___1lambda2(PyO
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":402
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":407
  *         self.phrases_e = defaultdict(int)
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))
  *         self.phrases_al = defaultdict(lambda: defaultdict(tuple))             # <<<<<<<<<<<<<<
@@ -39306,14 +39224,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 = 402; __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 = 407; __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 = 402; __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 = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyTuple_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyTuple_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyTuple_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 = 402; __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 = 407; __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;
@@ -39342,12 +39260,13 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9__cinit___2lambda3(PyO
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":407
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":412
  *         self.bilex_f = defaultdict(int)
  *         self.bilex_e = defaultdict(int)
  *         self.bilex_fe = defaultdict(lambda: defaultdict(int))             # <<<<<<<<<<<<<<
@@ -39366,14 +39285,14 @@ 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_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __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 = 412; __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 = 407; __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 = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_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 = 407; __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 = 412; __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;
@@ -39395,7 +39314,7 @@ static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":283
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":288
  *     cdef bilex_fe
  * 
  *     def __cinit__(self,             # <<<<<<<<<<<<<<
@@ -39416,21 +39335,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":331
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":336
  *         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 = 331; __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 = 336; __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 = 331; __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 = 336; __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 = 331; __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 = 336; __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);
@@ -39439,20 +39358,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":332
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":337
  *         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 = 332; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 337; __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 = 332; __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 = 337; __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 = 332; __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 = 337; __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 = 332; __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 = 337; __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);
@@ -39461,7 +39380,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":333
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":338
  *         self.rules = TrieTable(True) # cache
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  *         if alignment is None:             # <<<<<<<<<<<<<<
@@ -39471,23 +39390,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":334
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":339
  *         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 = 334; __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 = 339; __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 = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     goto __pyx_L3;
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":335
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":340
  *         if alignment is None:
  *             raise Exception("Must specify an alignment object")
  *         self.alignment = alignment             # <<<<<<<<<<<<<<
@@ -39500,7 +39419,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":339
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":344
  *         # grammar parameters and settings
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length             # <<<<<<<<<<<<<<
@@ -39509,7 +39428,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_length = __pyx_v_max_length;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":340
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":345
  *         # NOTE: setting max_nonterminals > 2 is not currently supported in Hiero
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals             # <<<<<<<<<<<<<<
@@ -39518,7 +39437,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_nonterminals = __pyx_v_max_nonterminals;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":341
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":346
  *         self.max_length = max_length
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size             # <<<<<<<<<<<<<<
@@ -39527,7 +39446,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->max_initial_size = __pyx_v_max_initial_size;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":342
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":347
  *         self.max_nonterminals = max_nonterminals
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size             # <<<<<<<<<<<<<<
@@ -39536,7 +39455,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":343
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":348
  *         self.max_initial_size = max_initial_size
  *         self.train_max_initial_size = train_max_initial_size
  *         self.min_gap_size = min_gap_size             # <<<<<<<<<<<<<<
@@ -39545,7 +39464,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->min_gap_size = __pyx_v_min_gap_size;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":344
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":349
  *         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             # <<<<<<<<<<<<<<
@@ -39554,7 +39473,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":345
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":350
  *         self.min_gap_size = min_gap_size
  *         self.train_min_gap_size = train_min_gap_size
  *         self.category = sym_fromstring(category, False)             # <<<<<<<<<<<<<<
@@ -39563,7 +39482,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":347
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":352
  *         self.category = sym_fromstring(category, False)
  * 
  *         if max_chunks is None:             # <<<<<<<<<<<<<<
@@ -39573,7 +39492,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":348
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":353
  * 
  *         if max_chunks is None:
  *             self.max_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -39585,19 +39504,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":350
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":355
  *             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 = 350; __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 = 355; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_chunks = __pyx_t_4;
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":352
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":357
  *             self.max_chunks = max_chunks
  * 
  *         if max_target_chunks is None:             # <<<<<<<<<<<<<<
@@ -39607,7 +39526,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":353
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":358
  * 
  *         if max_target_chunks is None:
  *             self.max_target_chunks = self.max_nonterminals + 1             # <<<<<<<<<<<<<<
@@ -39619,19 +39538,19 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":355
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":360
  *             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 = 355; __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 = 360; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_chunks = __pyx_t_4;
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":357
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":362
  *             self.max_target_chunks = max_target_chunks
  * 
  *         if max_target_length is None:             # <<<<<<<<<<<<<<
@@ -39641,7 +39560,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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":358
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":363
  * 
  *         if max_target_length is None:
  *             self.max_target_length = max_initial_size             # <<<<<<<<<<<<<<
@@ -39653,26 +39572,26 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":360
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":365
  *             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 = 360; __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 = 365; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_v_self->max_target_length = __pyx_t_4;
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":363
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":368
  * 
  *         # 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 = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 368; __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);
@@ -39680,14 +39599,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":364
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":369
  *         # 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 = 364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 369; __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);
@@ -39695,7 +39614,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":365
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":370
  *         self.precomputed_collocations = {}
  *         self.precomputed_index = {}
  *         self.use_index = use_index             # <<<<<<<<<<<<<<
@@ -39704,7 +39623,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_index = __pyx_v_use_index;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":366
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":371
  *         self.precomputed_index = {}
  *         self.use_index = use_index
  *         self.use_collocations = use_collocations             # <<<<<<<<<<<<<<
@@ -39713,14 +39632,14 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_collocations = __pyx_v_use_collocations;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":367
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":372
  *         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 = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 372; __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);
@@ -39728,7 +39647,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":368
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":373
  *         self.use_collocations = use_collocations
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file             # <<<<<<<<<<<<<<
@@ -39741,7 +39660,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":369
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":374
  *         self.max_rank = {}
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank             # <<<<<<<<<<<<<<
@@ -39750,7 +39669,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_rank = __pyx_v_precompute_rank;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":370
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":375
  *         self.precompute_file = precompute_file
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank             # <<<<<<<<<<<<<<
@@ -39759,7 +39678,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->precompute_secondary_rank = __pyx_v_precompute_secondary_rank;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":371
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":376
  *         self.precompute_rank = precompute_rank
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates             # <<<<<<<<<<<<<<
@@ -39768,7 +39687,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->use_baeza_yates = __pyx_v_use_baeza_yates;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":372
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":377
  *         self.precompute_secondary_rank = precompute_secondary_rank
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor             # <<<<<<<<<<<<<<
@@ -39777,7 +39696,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->by_slack_factor = __pyx_v_by_slack_factor;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":373
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":378
  *         self.use_baeza_yates = use_baeza_yates
  *         self.by_slack_factor = by_slack_factor
  *         self.tight_phrases = tight_phrases             # <<<<<<<<<<<<<<
@@ -39786,7 +39705,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->tight_phrases = __pyx_v_tight_phrases;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":375
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":380
  *         self.tight_phrases = tight_phrases
  * 
  *         if require_aligned_chunks:             # <<<<<<<<<<<<<<
@@ -39795,7 +39714,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_chunks) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":377
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":382
  *         if require_aligned_chunks:
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = self.require_aligned_terminal = True             # <<<<<<<<<<<<<<
@@ -39807,7 +39726,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
     goto __pyx_L7;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":378
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":383
  *             # one condition is a stronger version of the other.
  *             self.require_aligned_chunks = self.require_aligned_terminal = True
  *         elif require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -39816,7 +39735,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   if (__pyx_v_require_aligned_terminal) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":379
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":384
  *             self.require_aligned_chunks = self.require_aligned_terminal = True
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = False             # <<<<<<<<<<<<<<
@@ -39825,7 +39744,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
     __pyx_v_self->require_aligned_chunks = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":380
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":385
  *         elif require_aligned_terminal:
  *             self.require_aligned_chunks = False
  *             self.require_aligned_terminal = True             # <<<<<<<<<<<<<<
@@ -39837,7 +39756,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":382
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":387
  *             self.require_aligned_terminal = True
  *         else:
  *             self.require_aligned_chunks = self.require_aligned_terminal = False             # <<<<<<<<<<<<<<
@@ -39849,7 +39768,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   }
   __pyx_L7:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":385
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":390
  * 
  *         # diagnostics
  *         self.prev_norm_prefix = ()             # <<<<<<<<<<<<<<
@@ -39862,17 +39781,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":387
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":392
  *         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 = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 392; __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 = 387; __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 = 387; __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 = 392; __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 = 392; __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);
@@ -39881,17 +39800,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":388
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":393
  * 
  *         self.findexes = IntList(initial_len=10)
  *         self.findexes1 = IntList(initial_len=10)             # <<<<<<<<<<<<<<
  * 
  *         # Online stats
  */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 388; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 393; __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 = 388; __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 = 388; __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 = 393; __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 = 393; __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);
@@ -39900,7 +39819,7 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->findexes1 = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_2);
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":393
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":398
  * 
  *         # True after data is added
  *         self.online = False             # <<<<<<<<<<<<<<
@@ -39909,21 +39828,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
  */
   __pyx_v_self->online = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":396
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":401
  * 
  *         # Keep track of everything that can be sampled:
  *         self.samples_f = defaultdict(int)             # <<<<<<<<<<<<<<
  * 
  *         # Phrase counts
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __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 = 396; __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 = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 396; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -39933,21 +39852,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->samples_f = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":399
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":404
  * 
  *         # Phrase counts
  *         self.phrases_f = defaultdict(int)             # <<<<<<<<<<<<<<
  *         self.phrases_e = defaultdict(int)
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))
  */
-  __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 404; __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[8]; __pyx_lineno = 399; __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 = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-  __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -39957,21 +39876,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->phrases_f = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":400
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":405
  *         # Phrase counts
  *         self.phrases_f = defaultdict(int)
  *         self.phrases_e = defaultdict(int)             # <<<<<<<<<<<<<<
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))
  *         self.phrases_al = defaultdict(lambda: defaultdict(tuple))
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 405; __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 = 400; __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 = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -39981,23 +39900,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->phrases_e = __pyx_t_5;
   __pyx_t_5 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":401
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":406
  *         self.phrases_f = defaultdict(int)
  *         self.phrases_e = defaultdict(int)
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))             # <<<<<<<<<<<<<<
  *         self.phrases_al = defaultdict(lambda: defaultdict(tuple))
  * 
  */
-  __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
-  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___lambda1, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __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 = 401; __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 = 406; __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(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -40007,23 +39926,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->phrases_fe = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":402
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":407
  *         self.phrases_e = defaultdict(int)
  *         self.phrases_fe = defaultdict(lambda: defaultdict(int))
  *         self.phrases_al = defaultdict(lambda: defaultdict(tuple))             # <<<<<<<<<<<<<<
  * 
  *         # Bilexical counts
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 402; __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 = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___1lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___1lambda2, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 402; __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 = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2);
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __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_5)); __pyx_t_5 = 0;
@@ -40033,21 +39952,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->phrases_al = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":405
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":410
  * 
  *         # Bilexical counts
  *         self.bilex_f = defaultdict(int)             # <<<<<<<<<<<<<<
  *         self.bilex_e = defaultdict(int)
  *         self.bilex_fe = defaultdict(lambda: defaultdict(int))
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 405; __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 = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); 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_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -40057,21 +39976,21 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->bilex_f = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":406
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":411
  *         # Bilexical counts
  *         self.bilex_f = defaultdict(int)
  *         self.bilex_e = defaultdict(int)             # <<<<<<<<<<<<<<
  *         self.bilex_fe = defaultdict(lambda: defaultdict(int))
  * 
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __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 = 411; __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[8]; __pyx_lineno = 406; __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 = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_INCREF(((PyObject *)((PyObject*)(&PyInt_Type))));
   PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)((PyObject*)(&PyInt_Type))));
   __Pyx_GIVEREF(((PyObject *)((PyObject*)(&PyInt_Type))));
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 411; __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_5)); __pyx_t_5 = 0;
@@ -40081,23 +40000,23 @@ static int __pyx_pf_3_sa_23HieroCachingRuleFactory___cinit__(struct __pyx_obj_3_
   __pyx_v_self->bilex_e = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":407
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":412
  *         self.bilex_f = defaultdict(int)
  *         self.bilex_e = defaultdict(int)
  *         self.bilex_fe = defaultdict(lambda: defaultdict(int))             # <<<<<<<<<<<<<<
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_5 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___2lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9__cinit___2lambda3, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __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[8]; __pyx_lineno = 407; __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 = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
   __Pyx_GIVEREF(__pyx_t_5);
   __pyx_t_5 = 0;
-  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 412; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -40128,11 +40047,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fsarray,&__pyx_n_s__edarray,&__pyx_n_s__sampler,&__pyx_n_s__scorer,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -40148,26 +40067,30 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __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 = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __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 = 409; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("configure", 1, 4, 4, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 414; __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 = 409; __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 = 414; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
       goto __pyx_L5_argtuple_error;
@@ -40184,16 +40107,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 = 409; __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 = 414; __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 = 409; __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 = 409; __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 = 410; __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 = 410; __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 = 414; __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 = 414; __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 = 415; __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 = 415; __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:;
@@ -40203,7 +40126,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_3configure(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":409
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":414
  *         self.bilex_fe = defaultdict(lambda: defaultdict(int))
  * 
  *     def configure(self, SuffixArray fsarray, DataArray edarray,             # <<<<<<<<<<<<<<
@@ -40221,7 +40144,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("configure", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":414
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":419
  *         Here we also use it to precompute the most expensive intersections
  *         in the corpus quickly.'''
  *         self.fsa = fsarray             # <<<<<<<<<<<<<<
@@ -40234,7 +40157,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":415
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":420
  *         in the corpus quickly.'''
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray             # <<<<<<<<<<<<<<
@@ -40247,7 +40170,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":416
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":421
  *         self.fsa = fsarray
  *         self.fda = fsarray.darray
  *         self.eda = edarray             # <<<<<<<<<<<<<<
@@ -40260,7 +40183,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":417
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":422
  *         self.fda = fsarray.darray
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)             # <<<<<<<<<<<<<<
@@ -40269,17 +40192,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 = 417; __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 = 422; __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 = 417; __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 = 422; __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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":418
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":423
  *         self.eda = edarray
  *         self.fid2symid = self.set_idmap(self.fda)
  *         self.eid2symid = self.set_idmap(self.eda)             # <<<<<<<<<<<<<<
@@ -40288,31 +40211,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 = 418; __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 = 423; __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 = 418; __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 = 423; __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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":419
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":424
  *         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 = 419; __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 = 424; __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 = 419; __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 = 424; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":420
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":425
  *         self.eid2symid = self.set_idmap(self.eda)
  *         self.precompute()
  *         self.sampler = sampler             # <<<<<<<<<<<<<<
@@ -40325,7 +40248,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":421
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":426
  *         self.precompute()
  *         self.sampler = sampler
  *         self.scorer = scorer             # <<<<<<<<<<<<<<
@@ -40351,7 +40274,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_2configure(struct __pyx
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":423
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":428
  *         self.scorer = scorer
  * 
  *     cdef set_idmap(self, DataArray darray):             # <<<<<<<<<<<<<<
@@ -40376,7 +40299,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_set_idmap(CYTHON_UNUSED
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set_idmap", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":427
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":432
  *         cdef IntList idmap
  * 
  *         N = len(darray.id2word)             # <<<<<<<<<<<<<<
@@ -40385,30 +40308,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 = 427; __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 = 432; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_v_N = __pyx_t_2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":428
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":433
  * 
  *         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 = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 433; __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 = 428; __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 = 433; __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 = 428; __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 = 433; __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 = 428; __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 = 433; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":429
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":434
  *         N = len(darray.id2word)
  *         idmap = IntList(initial_len=N)
  *         for word_id from 0 <= word_id < N:             # <<<<<<<<<<<<<<
@@ -40418,20 +40341,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":430
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":435
  *         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 = 430; __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 = 435; __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 = 430; __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 = 435; __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);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":431
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":436
  *         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             # <<<<<<<<<<<<<<
@@ -40441,7 +40364,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;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":432
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":437
  *             new_word_id = sym_fromstring(darray.id2word[word_id], True)
  *             idmap.arr[word_id] = new_word_id
  *         return idmap             # <<<<<<<<<<<<<<
@@ -40478,7 +40401,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5pattern2phrase(PyObjec
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":435
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":440
  * 
  * 
  *     def pattern2phrase(self, pattern):             # <<<<<<<<<<<<<<
@@ -40506,7 +40429,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":437
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":442
  *     def pattern2phrase(self, pattern):
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()             # <<<<<<<<<<<<<<
@@ -40516,7 +40439,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":438
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":443
  *         # pattern is a tuple, which we must convert to a hiero Phrase
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -40526,7 +40449,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":439
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":444
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -40537,31 +40460,23 @@ 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 = 439; __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 = 444; __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[8]; __pyx_lineno = 439; __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 = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 439; __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 = 439; __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[8]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -40571,74 +40486,75 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":440
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":445
  *         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 = 440; __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 = 440; __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 = 445; __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 = 445; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":441
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":446
  *         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 = 441; __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 = 446; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":442
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":447
  *             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 = 442; __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 = 447; __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*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":444
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":449
  *                 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 = 444; __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 = 449; __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 = 444; __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 = 449; __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:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":445
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":450
  *             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 = 445; __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 = 450; __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 = 445; __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 = 450; __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 = 445; __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 = 450; __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));
@@ -40647,7 +40563,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_4pattern2phrase(struct
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":446
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":451
  *                 new_id = sym_fromstring(self.fda.id2word[word_id], True)
  *             result = result + (new_id,)
  *         return Phrase(result)             # <<<<<<<<<<<<<<
@@ -40655,12 +40571,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 = 446; __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 = 451; __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 = 446; __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 = 451; __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;
@@ -40695,7 +40611,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_7pattern2phrase_plus(Py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":448
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":453
  *         return Phrase(result)
  * 
  *     def pattern2phrase_plus(self, pattern):             # <<<<<<<<<<<<<<
@@ -40725,19 +40641,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("pattern2phrase_plus", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":451
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":456
  *         # 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 = 451; __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 = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_patterns = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":452
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":457
  *         # suffixed/prefixed with the NT category.
  *         patterns = []
  *         result = ()             # <<<<<<<<<<<<<<
@@ -40747,7 +40663,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
   __pyx_v_result = __pyx_empty_tuple;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":453
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":458
  *         patterns = []
  *         result = ()
  *         arity = 0             # <<<<<<<<<<<<<<
@@ -40757,7 +40673,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_arity = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":454
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":459
  *         result = ()
  *         arity = 0
  *         for word_id in pattern:             # <<<<<<<<<<<<<<
@@ -40768,31 +40684,23 @@ 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 = 454; __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 = 459; __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[8]; __pyx_lineno = 454; __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 = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 454; __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 = 454; __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[8]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -40802,74 +40710,75 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
     __pyx_v_word_id = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":455
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":460
  *         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 = 455; __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 = 455; __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 = 460; __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 = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":456
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":461
  *         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 = 456; __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 = 461; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":457
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":462
  *             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 = 457; __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 = 462; __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*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":459
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":464
  *                 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 = 459; __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 = 464; __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 = 459; __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 = 464; __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:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":460
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":465
  *             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 = 460; __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 = 465; __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 = 460; __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 = 465; __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 = 460; __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 = 465; __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));
@@ -40878,81 +40787,81 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_6pattern2phrase_plus(st
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":461
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":466
  *                 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 = 461; __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 = 466; __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 = 461; __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 = 466; __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 = 461; __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 = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":462
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":467
  *             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 = 462; __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 = 467; __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 = 462; __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 = 467; __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 = 462; __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 = 467; __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 = 462; __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 = 467; __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 = 462; __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 = 467; __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 = 462; __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 = 467; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":463
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":468
  *         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 = 463; __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 = 468; __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 = 463; __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 = 468; __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 = 463; __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 = 468; __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 = 463; __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 = 468; __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 = 463; __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 = 468; __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 = 463; __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 = 468; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":464
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":469
  *         patterns.append(Phrase(result + (sym_setindex(self.category, 1),)))
  *         patterns.append(Phrase((sym_setindex(self.category, 1),) + result))
  *         return patterns             # <<<<<<<<<<<<<<
@@ -40993,7 +40902,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9precompute(PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":466
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":471
  *         return patterns
  * 
  *     def precompute(self):             # <<<<<<<<<<<<<<
@@ -41017,9 +40926,9 @@ 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;
@@ -41027,7 +40936,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("precompute", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":469
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":474
  *         cdef Precomputation pre
  * 
  *         if self.precompute_file is not None:             # <<<<<<<<<<<<<<
@@ -41037,34 +40946,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
   __pyx_t_1 = (__pyx_v_self->precompute_file != Py_None);
   if (__pyx_t_1) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":470
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":475
  * 
  *         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 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __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[8]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __pyx_v_start_time = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":471
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":476
  *         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_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __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 = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_108));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_108));
@@ -41072,29 +40981,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     __Pyx_INCREF(__pyx_v_self->precompute_file);
     PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->precompute_file);
     __Pyx_GIVEREF(__pyx_v_self->precompute_file);
-    __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 = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __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 = 476; __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_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":472
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":477
  *             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 = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __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 = 472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 472; __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 = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Precomputation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __pyx_v_pre = ((struct __pyx_obj_3_sa_Precomputation *)__pyx_t_3);
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":474
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":479
  *             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:             # <<<<<<<<<<<<<<
@@ -41104,23 +41013,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":475
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":480
  *             # 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_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __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 = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__warn); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->max_nonterminals); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __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 = 480; __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));
@@ -41131,7 +41040,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_3 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -41140,7 +41049,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L4:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":476
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":481
  *             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:             # <<<<<<<<<<<<<<
@@ -41150,23 +41059,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":477
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":482
  *                 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_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __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 = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__warn); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_v_pre->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyInt_FromLong(__pyx_v_self->max_length); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __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 = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __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 = 482; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_110));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_110));
@@ -41177,7 +41086,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_2 = 0;
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 482; __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_3)); __pyx_t_3 = 0;
@@ -41186,7 +41095,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":478
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":483
  *             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:             # <<<<<<<<<<<<<<
@@ -41196,18 +41105,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":479
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":484
  *                 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 = 479; __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 = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_self->train_max_initial_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 479; __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 = 484; __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);
@@ -41215,25 +41124,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_3);
       __pyx_t_4 = 0;
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_111), ((PyObject *)__pyx_t_5)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_3));
       __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 = 479; __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 = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 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_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
       __Pyx_Raise(__pyx_t_3, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":480
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":485
  *             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:             # <<<<<<<<<<<<<<
@@ -41243,18 +41152,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":481
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":486
  *                 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_3 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_pre->train_min_gap_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_5 = PyInt_FromLong(__pyx_v_self->train_min_gap_size); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 481; __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 = 486; __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 = 481; __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 = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
@@ -41262,25 +41171,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_3 = 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 = 481; __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 = 486; __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 = 481; __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 = 486; __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 = 481; __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 = 486; __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 = 481; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       goto __pyx_L7;
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":482
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":487
  *             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:             # <<<<<<<<<<<<<<
@@ -41289,25 +41198,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_index) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":483
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":488
  *                 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 = 483; __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 = 488; __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 = 483; __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 = 488; __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 = 483; __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 = 488; __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 = 483; __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 = 488; __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 = 483; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 488; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_INCREF(((PyObject *)__pyx_kp_s_113));
       PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_113));
@@ -41315,65 +41224,123 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
       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_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 483; __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 = 488; __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_5); __pyx_t_5 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":484
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":489
  *             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 = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      }
-      __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_index, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_7), (&__pyx_t_8)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 484; __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 = 489; __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 = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_3;
-      __pyx_t_3 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_7, &__pyx_t_6, &__pyx_t_3, &__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 = 484; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_GOTREF(__pyx_t_4);
+      __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 = 489; __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_3); __pyx_t_3 = 0;
+      for (;;) {
+        if (!__pyx_t_7 && 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 (!__pyx_t_7 && 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 = 489; __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 = 489; __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 = 489; __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 = 489; __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_L11_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_L11_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 = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L12_unpacking_done;
+          __pyx_L11_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 = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L12_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_4;
+        __pyx_v_pattern = __pyx_t_4;
         __pyx_t_4 = 0;
+        __Pyx_XDECREF(__pyx_v_arr);
+        __pyx_v_arr = __pyx_t_2;
+        __pyx_t_2 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":485
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":490
  *                 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 = 485; __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[8]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase_plus); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 490; __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 = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_2);
         __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_2 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_2);
-        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __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 = 490; __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_XDECREF(__pyx_v_phrases);
-        __pyx_v_phrases = __pyx_t_2;
-        __pyx_t_2 = 0;
+        __pyx_v_phrases = __pyx_t_4;
+        __pyx_t_4 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":486
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":491
  *                 for pattern, arr in pre.precomputed_index.iteritems():
  *                     phrases = self.pattern2phrase_plus(pattern)
  *                     for phrase in phrases:             # <<<<<<<<<<<<<<
@@ -41381,60 +41348,52 @@ 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_2 = __pyx_v_phrases; __Pyx_INCREF(__pyx_t_2); __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_2 = PyObject_GetIter(__pyx_v_phrases); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_2);
-          __pyx_t_11 = Py_TYPE(__pyx_t_2)->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 = 491; __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_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[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_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[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_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[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_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[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+          if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++;
+          } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_4)) {
+            if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
+            __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++;
           } else {
-            __pyx_t_3 = __pyx_t_11(__pyx_t_2);
-            if (unlikely(!__pyx_t_3)) {
+            __pyx_t_2 = __pyx_t_11(__pyx_t_4);
+            if (unlikely(!__pyx_t_2)) {
               if (PyErr_Occurred()) {
                 if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 491; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":487
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":492
  *                     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 = 487; __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 = 492; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
-        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       goto __pyx_L8;
     }
     __pyx_L8:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":488
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":493
  *                     for phrase in phrases:
  *                         self.precomputed_index[phrase] = arr
  *             if self.use_collocations:             # <<<<<<<<<<<<<<
@@ -41443,83 +41402,141 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
  */
     if (__pyx_v_self->use_collocations) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":489
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":494
  *                         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 = 489; __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 = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 489; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_4 = PyObject_GetAttr(__pyx_t_5, __pyx_n_s__info); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 494; __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 = 489; __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 = 494; __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 = 489; __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 = 494; __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 = 489; __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 = 494; __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_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 489; __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 = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+      __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":490
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":495
  *             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 = 490; __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 = 495; __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 = 495; __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 = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_5);
+        __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
       }
-      __pyx_t_3 = __Pyx_dict_iterator(__pyx_v_pre->precomputed_collocations, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_6), (&__pyx_t_8)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_XDECREF(__pyx_t_5);
-      __pyx_t_5 = __pyx_t_3;
-      __pyx_t_3 = 0;
-      while (1) {
-        __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_5, __pyx_t_6, &__pyx_t_7, &__pyx_t_3, &__pyx_t_2, NULL, __pyx_t_8);
-        if (unlikely(__pyx_t_9 == 0)) break;
-        if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 490; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
-        __Pyx_GOTREF(__pyx_t_2);
+      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+      for (;;) {
+        if (!__pyx_t_7 && 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 (!__pyx_t_7 && 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 = 495; __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 = 495; __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 = 495; __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 = 495; __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_L18_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_L18_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 = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+          goto __pyx_L19_unpacking_done;
+          __pyx_L18_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 = 495; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_L19_unpacking_done:;
+        }
         __Pyx_XDECREF(__pyx_v_pattern);
-        __pyx_v_pattern = __pyx_t_3;
-        __pyx_t_3 = 0;
+        __pyx_v_pattern = __pyx_t_4;
+        __pyx_t_4 = 0;
         __Pyx_XDECREF(__pyx_v_arr);
-        __pyx_v_arr = __pyx_t_2;
-        __pyx_t_2 = 0;
+        __pyx_v_arr = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":491
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":496
  *                 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_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__pattern2phrase); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 496; __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 = 491; __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 = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_v_pattern);
         PyTuple_SET_ITEM(__pyx_t_3, 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 = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __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 = 496; __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;
@@ -41527,50 +41544,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
         __pyx_v_phrase = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":492
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":497
  *                 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 = 492; __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 = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       }
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      goto __pyx_L13;
+      goto __pyx_L15;
     }
-    __pyx_L13:;
+    __pyx_L15:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":493
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":498
  *                     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 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 498; __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 = 493; __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 = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __pyx_v_stop_time = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":494
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":499
  *                     self.precomputed_collocations[phrase] = arr
  *             stop_time = monitor_cpu()
  *             logger.info("Processing precomputations took %f seconds", stop_time - start_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 499; __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_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Subtract(__pyx_v_stop_time, __pyx_v_start_time); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 499; __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[8]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(((PyObject *)__pyx_kp_s_115));
     PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_kp_s_115));
@@ -41578,7 +41595,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8precompute(struct __py
     PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 499; __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_3)); __pyx_t_3 = 0;
@@ -41594,6 +41611,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:;
@@ -41620,7 +41638,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_11get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":497
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":502
  * 
  * 
  *     def get_precomputed_collocation(self, phrase):             # <<<<<<<<<<<<<<
@@ -41642,29 +41660,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_precomputed_collocation", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":498
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":503
  * 
  *     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 = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((PySequence_Contains(__pyx_v_self->precomputed_collocations, __pyx_v_phrase))); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":499
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":504
  *     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 = 499; __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 = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_v_arr = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":500
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":505
  *         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)             # <<<<<<<<<<<<<<
@@ -41672,26 +41690,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 = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 505; __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 = 500; __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 = 500; __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 = 500; __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 = 500; __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 = 505; __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 = 505; __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 = 505; __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 = 505; __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 = 500; __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 = 505; __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 = 500; __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 = 505; __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 = 500; __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 = 505; __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 = 500; __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 = 505; __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 = 500; __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 = 505; __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 = 500; __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 = 505; __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;
@@ -41701,7 +41719,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":501
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":506
  *             arr = self.precomputed_collocations[phrase]
  *             return PhraseLocation(arr=arr, arr_low=0, arr_high=len(arr), num_subpatterns=phrase.arity()+1)
  *         return None             # <<<<<<<<<<<<<<
@@ -41728,7 +41746,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_10get_precomputed_collo
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":504
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":509
  * 
  * 
  *     cdef int* baeza_yates_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -41774,7 +41792,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("baeza_yates_helper", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":517
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":522
  *         cdef Matching loc1, loc2
  * 
  *         result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -41783,7 +41801,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":519
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":524
  *         result = <int*> malloc(0*sizeof(int*))
  * 
  *         d_first = 0             # <<<<<<<<<<<<<<
@@ -41792,7 +41810,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_d_first = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":520
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":525
  * 
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:             # <<<<<<<<<<<<<<
@@ -41802,7 +41820,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":521
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":526
  *         d_first = 0
  *         if high1 - low1 > high2 - low2:
  *             d_first = 1             # <<<<<<<<<<<<<<
@@ -41814,7 +41832,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":525
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":530
  *         # 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:             # <<<<<<<<<<<<<<
@@ -41830,7 +41848,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":526
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":531
  *         # Case 1: one of the sets is empty
  *         if low1 >= high1 or low2 >= high2:
  *             return result             # <<<<<<<<<<<<<<
@@ -41843,7 +41861,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":529
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":534
  * 
  *         # Case 2: sets are non-overlapping
  *         assign_matching(&loc1, arr1, high1-step1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41852,7 +41870,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":530
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":535
  *         # 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)             # <<<<<<<<<<<<<<
@@ -41861,7 +41879,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":531
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":536
  *         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:             # <<<<<<<<<<<<<<
@@ -41871,7 +41889,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":532
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":537
  *         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             # <<<<<<<<<<<<<<
@@ -41884,7 +41902,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":534
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":539
  *             return result
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41893,7 +41911,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":535
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":540
  * 
  *         assign_matching(&loc1, arr1, low1, step1, self.fda.sent_id.arr)
  *         assign_matching(&loc2, arr2, high2-step2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -41902,7 +41920,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":536
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":541
  *         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:             # <<<<<<<<<<<<<<
@@ -41912,7 +41930,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":537
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":542
  *         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             # <<<<<<<<<<<<<<
@@ -41925,7 +41943,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":541
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":546
  *         # Case 3: query set and data set do not meet size mismatch constraints;
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1             # <<<<<<<<<<<<<<
@@ -41935,15 +41953,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 = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 546; __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 = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 546; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_qsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":542
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":547
  *         # We use mergesort instead in this case
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2             # <<<<<<<<<<<<<<
@@ -41953,15 +41971,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 = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 547; __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 = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 547; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_dsetsize = __Pyx_div_int(__pyx_t_4, __pyx_v_step2);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":543
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":548
  *         qsetsize = (high1-low1) / step1
  *         dsetsize = (high2-low2) / step2
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -41970,7 +41988,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":544
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":549
  *         dsetsize = (high2-low2) / step2
  *         if d_first:
  *             tmp = qsetsize             # <<<<<<<<<<<<<<
@@ -41979,7 +41997,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_qsetsize;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":545
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":550
  *         if d_first:
  *             tmp = qsetsize
  *             qsetsize = dsetsize             # <<<<<<<<<<<<<<
@@ -41988,7 +42006,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_qsetsize = __pyx_v_dsetsize;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":546
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":551
  *             tmp = qsetsize
  *             qsetsize = dsetsize
  *             dsetsize = tmp             # <<<<<<<<<<<<<<
@@ -42000,7 +42018,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L7:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":548
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":553
  *             dsetsize = tmp
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:             # <<<<<<<<<<<<<<
@@ -42011,12 +42029,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 = 548; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    {__pyx_filename = __pyx_f[8]; __pyx_lineno = 553; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_t_3 = ((__pyx_t_5 / __pyx_t_6) > __pyx_v_dsetsize);
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":549
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":554
  * 
  *         if self.by_slack_factor * qsetsize * log(dsetsize) / log(2) > dsetsize:
  *             free(result)             # <<<<<<<<<<<<<<
@@ -42025,7 +42043,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     free(__pyx_v_result);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":550
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":555
  *         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)             # <<<<<<<<<<<<<<
@@ -42038,7 +42056,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L8:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":554
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":559
  *         # binary search.    There are two flavors, depending on
  *         # whether the queryset or dataset is first
  *         if d_first:             # <<<<<<<<<<<<<<
@@ -42047,7 +42065,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   if (__pyx_v_d_first) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":555
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":560
  *         # whether the queryset or dataset is first
  *         if d_first:
  *             med2 = median(low2, high2, step2)             # <<<<<<<<<<<<<<
@@ -42056,7 +42074,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":556
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":561
  *         if d_first:
  *             med2 = median(low2, high2, step2)
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42065,7 +42083,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":558
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":563
  *             assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)
  * 
  *             search_low = low1             # <<<<<<<<<<<<<<
@@ -42074,7 +42092,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":559
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":564
  * 
  *             search_low = low1
  *             search_high = high1             # <<<<<<<<<<<<<<
@@ -42083,7 +42101,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":560
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":565
  *             search_low = low1
  *             search_high = high1
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -42094,7 +42112,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":561
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":566
  *             search_high = high1
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)             # <<<<<<<<<<<<<<
@@ -42103,7 +42121,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":562
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":567
  *             while search_low < search_high:
  *                 med1 = median(search_low, search_high, step1)
  *                 find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -42112,7 +42130,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":563
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":568
  *                 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)             # <<<<<<<<<<<<<<
@@ -42121,7 +42139,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":566
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":571
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -42130,7 +42148,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":564
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":569
  *                 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:             # <<<<<<<<<<<<<<
@@ -42139,7 +42157,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":565
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":570
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_low = med1_plus             # <<<<<<<<<<<<<<
@@ -42149,7 +42167,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_low = __pyx_v_med1_plus;
         break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":566
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":571
  *                 if comparison == -1:
  *                     search_low = med1_plus
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -42158,7 +42176,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":567
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":572
  *                     search_low = med1_plus
  *                 elif comparison == 1:
  *                     search_high = med1_minus             # <<<<<<<<<<<<<<
@@ -42169,7 +42187,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":569
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":574
  *                     search_high = med1_minus
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -42185,7 +42203,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":571
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":576
  *                     break
  *         else:
  *             med1 = median(low1, high1, step1)             # <<<<<<<<<<<<<<
@@ -42194,7 +42212,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":572
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":577
  *         else:
  *             med1 = median(low1, high1, step1)
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)             # <<<<<<<<<<<<<<
@@ -42203,7 +42221,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":574
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":579
  *             find_comparable_matchings(low1, high1, arr1, step1, med1, &med1_minus, &med1_plus)
  * 
  *             search_low = low2             # <<<<<<<<<<<<<<
@@ -42212,7 +42230,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_low = __pyx_v_low2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":575
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":580
  * 
  *             search_low = low2
  *             search_high = high2             # <<<<<<<<<<<<<<
@@ -42221,7 +42239,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_search_high = __pyx_v_high2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":576
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":581
  *             search_low = low2
  *             search_high = high2
  *             while search_low < search_high:             # <<<<<<<<<<<<<<
@@ -42232,7 +42250,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":577
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":582
  *             search_high = high2
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)             # <<<<<<<<<<<<<<
@@ -42241,7 +42259,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":578
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":583
  *             while search_low < search_high:
  *                 med2 = median(search_low, search_high, step2)
  *                 assign_matching(&loc2, arr2, med2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42250,7 +42268,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":579
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":584
  *                 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)             # <<<<<<<<<<<<<<
@@ -42259,7 +42277,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":582
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":587
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -42268,7 +42286,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       switch (__pyx_v_comparison) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":580
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":585
  *                 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:             # <<<<<<<<<<<<<<
@@ -42277,7 +42295,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case -1:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":581
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":586
  *                 comparison = self.compare_matchings_set(med1_minus, med1_plus, arr1, step1, &loc2, offset_by_one, len_last)
  *                 if comparison == -1:
  *                     search_high = med2             # <<<<<<<<<<<<<<
@@ -42287,7 +42305,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         __pyx_v_search_high = __pyx_v_med2;
         break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":582
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":587
  *                 if comparison == -1:
  *                     search_high = med2
  *                 elif comparison == 1:             # <<<<<<<<<<<<<<
@@ -42296,7 +42314,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
         case 1:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":583
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":588
  *                     search_high = med2
  *                 elif comparison == 1:
  *                     search_low = med2 + step2             # <<<<<<<<<<<<<<
@@ -42307,7 +42325,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         break;
         default:
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":585
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":590
  *                     search_low = med2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -42322,7 +42340,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L9:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":587
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":592
  *                     break
  * 
  *         med_result_len = 0             # <<<<<<<<<<<<<<
@@ -42331,7 +42349,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":588
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":593
  * 
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))             # <<<<<<<<<<<<<<
@@ -42340,7 +42358,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_med_result = ((int *)malloc((0 * (sizeof(int *)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":589
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":594
  *         med_result_len = 0
  *         med_result = <int*> malloc(0*sizeof(int*))
  *         if search_high > search_low:             # <<<<<<<<<<<<<<
@@ -42350,7 +42368,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":595
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":600
  *             # want to store the bindings for all of those elements.    We can
  *             # subsequently throw all of them away.
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -42359,7 +42377,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":596
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":601
  *             # subsequently throw all of them away.
  *             med2_minus = med2
  *             med2_plus = med2 + step2             # <<<<<<<<<<<<<<
@@ -42368,7 +42386,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = (__pyx_v_med2 + __pyx_v_step2);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":597
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":602
  *             med2_minus = med2
  *             med2_plus = med2 + step2
  *             i1 = med1_minus             # <<<<<<<<<<<<<<
@@ -42377,7 +42395,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_i1 = __pyx_v_med1_minus;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":598
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":603
  *             med2_plus = med2 + step2
  *             i1 = med1_minus
  *             while i1 < med1_plus:             # <<<<<<<<<<<<<<
@@ -42388,7 +42406,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":599
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":604
  *             i1 = med1_minus
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42397,7 +42415,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":600
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":605
  *             while i1 < med1_plus:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 while med2_minus-step2 >= low2:             # <<<<<<<<<<<<<<
@@ -42408,7 +42426,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":601
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":606
  *                 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)             # <<<<<<<<<<<<<<
@@ -42417,7 +42435,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":602
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":607
  *                 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:             # <<<<<<<<<<<<<<
@@ -42427,7 +42445,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":603
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":608
  *                     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             # <<<<<<<<<<<<<<
@@ -42439,7 +42457,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":605
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":610
  *                         med2_minus = med2_minus - step2
  *                     else:
  *                         break             # <<<<<<<<<<<<<<
@@ -42452,7 +42470,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L18_break:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":606
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":611
  *                     else:
  *                         break
  *                 i2 = med2_minus             # <<<<<<<<<<<<<<
@@ -42461,7 +42479,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_i2 = __pyx_v_med2_minus;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":607
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":612
  *                         break
  *                 i2 = med2_minus
  *                 while i2 < high2:             # <<<<<<<<<<<<<<
@@ -42472,7 +42490,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":608
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":613
  *                 i2 = med2_minus
  *                 while i2 < high2:
  *                     assign_matching(&loc2, arr2, i2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42481,7 +42499,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":609
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":614
  *                 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)             # <<<<<<<<<<<<<<
@@ -42490,7 +42508,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":610
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":615
  *                     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:             # <<<<<<<<<<<<<<
@@ -42500,7 +42518,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":612
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":617
  *                     if comparison == 0:
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)             # <<<<<<<<<<<<<<
@@ -42512,7 +42530,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L22:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":613
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":618
  *                         pass
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -42522,7 +42540,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":614
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":619
  *                         med_result = append_combined_matching(med_result, &loc1, &loc2, offset_by_one, num_subpatterns, &med_result_len)
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -42534,7 +42552,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
         }
         __pyx_L23:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":615
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":620
  *                     if comparison == -1:
  *                         break
  *                     i2 = i2 + step2             # <<<<<<<<<<<<<<
@@ -42545,7 +42563,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L21_break:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":616
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":621
  *                         break
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:             # <<<<<<<<<<<<<<
@@ -42555,7 +42573,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":617
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":622
  *                     i2 = i2 + step2
  *                 if i2 > med2_plus:
  *                     med2_plus = i2             # <<<<<<<<<<<<<<
@@ -42567,7 +42585,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L24:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":618
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":623
  *                 if i2 > med2_plus:
  *                     med2_plus = i2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -42577,7 +42595,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       __pyx_v_i1 = (__pyx_v_i1 + __pyx_v_step1);
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":620
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":625
  *                 i1 = i1 + step1
  * 
  *             tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -42586,7 +42604,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_tmp = __pyx_v_med1_minus;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":621
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":626
  * 
  *             tmp = med1_minus
  *             med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -42595,7 +42613,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":622
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":627
  *             tmp = med1_minus
  *             med1_minus = med1_plus
  *             med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -42607,7 +42625,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":625
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":630
  *         else:
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2             # <<<<<<<<<<<<<<
@@ -42616,7 +42634,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_minus = __pyx_v_med2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":626
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":631
  *             # No match; need to figure out the point of division in D and Q
  *             med2_minus = med2
  *             med2_plus = med2             # <<<<<<<<<<<<<<
@@ -42625,7 +42643,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     __pyx_v_med2_plus = __pyx_v_med2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":627
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":632
  *             med2_minus = med2
  *             med2_plus = med2
  *             if d_first:             # <<<<<<<<<<<<<<
@@ -42634,7 +42652,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
     if (__pyx_v_d_first) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":628
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":633
  *             med2_plus = med2
  *             if d_first:
  *                 med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -42643,7 +42661,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":629
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":634
  *             if d_first:
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:             # <<<<<<<<<<<<<<
@@ -42653,7 +42671,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":630
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":635
  *                 med2_minus = med2_minus + step2
  *                 if comparison == -1:
  *                     med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -42665,7 +42683,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
       }
       __pyx_L26:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":631
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":636
  *                 if comparison == -1:
  *                     med1_minus = med1_plus
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -42675,7 +42693,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":632
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":637
  *                     med1_minus = med1_plus
  *                 if comparison == 1:
  *                     med1_plus = med1_minus             # <<<<<<<<<<<<<<
@@ -42690,7 +42708,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":634
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":639
  *                     med1_plus = med1_minus
  *             else:
  *                 tmp = med1_minus             # <<<<<<<<<<<<<<
@@ -42699,7 +42717,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_tmp = __pyx_v_med1_minus;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":635
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":640
  *             else:
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus             # <<<<<<<<<<<<<<
@@ -42708,7 +42726,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_minus = __pyx_v_med1_plus;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":636
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":641
  *                 tmp = med1_minus
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp             # <<<<<<<<<<<<<<
@@ -42717,7 +42735,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
       __pyx_v_med1_plus = __pyx_v_tmp;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":637
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":642
  *                 med1_minus = med1_plus
  *                 med1_plus = tmp
  *                 if comparison == 1:             # <<<<<<<<<<<<<<
@@ -42727,7 +42745,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":638
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":643
  *                 med1_plus = tmp
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2             # <<<<<<<<<<<<<<
@@ -42736,7 +42754,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":639
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":644
  *                 if comparison == 1:
  *                     med2_minus = med2_minus + step2
  *                     med2_plus = med2_plus + step2             # <<<<<<<<<<<<<<
@@ -42752,7 +42770,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   }
   __pyx_L14:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":641
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":646
  *                     med2_plus = med2_plus + step2
  * 
  *         low_result_len = 0             # <<<<<<<<<<<<<<
@@ -42761,7 +42779,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_low_result_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":642
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":647
  * 
  *         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)             # <<<<<<<<<<<<<<
@@ -42770,7 +42788,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":643
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":648
  *         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             # <<<<<<<<<<<<<<
@@ -42779,7 +42797,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   __pyx_v_high_result_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":644
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":649
  *         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)             # <<<<<<<<<<<<<<
@@ -42788,7 +42806,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":646
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":651
  *         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)             # <<<<<<<<<<<<<<
@@ -42797,7 +42815,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":647
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":652
  * 
  *         result = extend_arr(result, result_len, low_result, low_result_len)
  *         result = extend_arr(result, result_len, med_result, med_result_len)             # <<<<<<<<<<<<<<
@@ -42806,7 +42824,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":648
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":653
  *         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)             # <<<<<<<<<<<<<<
@@ -42815,7 +42833,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":649
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":654
  *         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)             # <<<<<<<<<<<<<<
@@ -42824,7 +42842,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_low_result);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":650
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":655
  *         result = extend_arr(result, result_len, high_result, high_result_len)
  *         free(low_result)
  *         free(med_result)             # <<<<<<<<<<<<<<
@@ -42833,7 +42851,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_med_result);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":651
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":656
  *         free(low_result)
  *         free(med_result)
  *         free(high_result)             # <<<<<<<<<<<<<<
@@ -42842,7 +42860,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
  */
   free(__pyx_v_high_result);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":653
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":658
  *         free(high_result)
  * 
  *         return result             # <<<<<<<<<<<<<<
@@ -42862,7 +42880,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_baeza_yates_helper(struct __p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":657
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":662
  * 
  * 
  *     cdef long compare_matchings_set(self, int i1_minus, int i1_plus, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -42881,7 +42899,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   int __pyx_t_1;
   __Pyx_RefNannySetupContext("compare_matchings_set", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":668
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":673
  *         cdef Matching* loc1
  * 
  *         loc1 = &l1_stack             # <<<<<<<<<<<<<<
@@ -42890,7 +42908,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_loc1 = (&__pyx_v_l1_stack);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":670
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":675
  *         loc1 = &l1_stack
  * 
  *         i1 = i1_minus             # <<<<<<<<<<<<<<
@@ -42899,7 +42917,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
   __pyx_v_i1 = __pyx_v_i1_minus;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":671
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":676
  * 
  *         i1 = i1_minus
  *         while i1 < i1_plus:             # <<<<<<<<<<<<<<
@@ -42910,7 +42928,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":672
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":677
  *         i1 = i1_minus
  *         while i1 < i1_plus:
  *             assign_matching(loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -42919,7 +42937,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":673
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":678
  *         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)             # <<<<<<<<<<<<<<
@@ -42928,7 +42946,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":674
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":679
  *             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:             # <<<<<<<<<<<<<<
@@ -42938,7 +42956,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     __pyx_t_1 = (__pyx_v_comparison == 0);
     if (__pyx_t_1) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":675
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":680
  *             comparison = self.compare_matchings(loc1, loc2, offset_by_one, len_last)
  *             if comparison == 0:
  *                 prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -42947,7 +42965,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
       __pyx_v_prev_comparison = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":676
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":681
  *             if comparison == 0:
  *                 prev_comparison = 0
  *                 break             # <<<<<<<<<<<<<<
@@ -42958,7 +42976,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
       goto __pyx_L5;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":677
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":682
  *                 prev_comparison = 0
  *                 break
  *             elif i1 == i1_minus:             # <<<<<<<<<<<<<<
@@ -42968,7 +42986,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":678
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":683
  *                 break
  *             elif i1 == i1_minus:
  *                 prev_comparison = comparison             # <<<<<<<<<<<<<<
@@ -42980,7 +42998,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":680
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":685
  *                 prev_comparison = comparison
  *             else:
  *                 if comparison != prev_comparison:             # <<<<<<<<<<<<<<
@@ -42990,7 +43008,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":681
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":686
  *             else:
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0             # <<<<<<<<<<<<<<
@@ -42999,7 +43017,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
  */
         __pyx_v_prev_comparison = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":682
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":687
  *                 if comparison != prev_comparison:
  *                     prev_comparison = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -43013,7 +43031,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":683
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":688
  *                     prev_comparison = 0
  *                     break
  *             i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -43024,7 +43042,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   }
   __pyx_L4_break:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":684
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":689
  *                     break
  *             i1 = i1 + step1
  *         return prev_comparison             # <<<<<<<<<<<<<<
@@ -43040,7 +43058,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings_set(struct
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":687
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":692
  * 
  * 
  *     cdef long compare_matchings(self, Matching* loc1, Matching* loc2, int offset_by_one, int len_last):             # <<<<<<<<<<<<<<
@@ -43058,7 +43076,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("compare_matchings", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":690
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":695
  *         cdef int i
  * 
  *         if loc1.sent_id > loc2.sent_id:             # <<<<<<<<<<<<<<
@@ -43068,7 +43086,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":691
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":696
  * 
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1             # <<<<<<<<<<<<<<
@@ -43081,7 +43099,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":692
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":697
  *         if loc1.sent_id > loc2.sent_id:
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:             # <<<<<<<<<<<<<<
@@ -43091,7 +43109,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":693
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":698
  *             return 1
  *         if loc2.sent_id > loc1.sent_id:
  *             return -1             # <<<<<<<<<<<<<<
@@ -43104,7 +43122,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":695
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":700
  *             return -1
  * 
  *         if loc1.size == 1 and loc2.size == 1:             # <<<<<<<<<<<<<<
@@ -43120,7 +43138,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":696
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":701
  * 
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:             # <<<<<<<<<<<<<<
@@ -43130,7 +43148,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":697
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":702
  *         if loc1.size == 1 and loc2.size == 1:
  *             if loc2.arr[loc2.start] - loc1.arr[loc1.start] <= self.train_min_gap_size:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -43145,7 +43163,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     goto __pyx_L5;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":699
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":704
  *                 return 1
  * 
  *         elif offset_by_one:             # <<<<<<<<<<<<<<
@@ -43154,7 +43172,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
  */
   if (__pyx_v_offset_by_one) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":700
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":705
  * 
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -43164,7 +43182,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":701
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":706
  *         elif offset_by_one:
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:             # <<<<<<<<<<<<<<
@@ -43174,7 +43192,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":702
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":707
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i-1]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -43187,7 +43205,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L9:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":703
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":708
  *                 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]:             # <<<<<<<<<<<<<<
@@ -43197,7 +43215,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":704
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":709
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i-1]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -43214,7 +43232,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":707
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":712
  * 
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -43224,7 +43242,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":708
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":713
  *         else:
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1             # <<<<<<<<<<<<<<
@@ -43237,7 +43255,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L11:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":709
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":714
  *             if loc1.arr[loc1.start]+1 > loc2.arr[loc2.start]:
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:             # <<<<<<<<<<<<<<
@@ -43247,7 +43265,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":710
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":715
  *                 return 1
  *             if loc1.arr[loc1.start]+1 < loc2.arr[loc2.start]:
  *                 return -1             # <<<<<<<<<<<<<<
@@ -43260,7 +43278,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
     }
     __pyx_L12:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":712
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":717
  *                 return -1
  * 
  *             for i from 1 <= i < loc1.size:             # <<<<<<<<<<<<<<
@@ -43270,7 +43288,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":713
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":718
  * 
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -43280,7 +43298,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":714
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":719
  *             for i from 1 <= i < loc1.size:
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1             # <<<<<<<<<<<<<<
@@ -43293,7 +43311,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
       }
       __pyx_L15:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":715
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":720
  *                 if loc1.arr[loc1.start+i] > loc2.arr[loc2.start+i]:
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:             # <<<<<<<<<<<<<<
@@ -43303,7 +43321,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":716
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":721
  *                     return 1
  *                 if loc1.arr[loc1.start+i] < loc2.arr[loc2.start+i]:
  *                     return -1             # <<<<<<<<<<<<<<
@@ -43319,7 +43337,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":718
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":723
  *                     return -1
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:             # <<<<<<<<<<<<<<
@@ -43329,7 +43347,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":719
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":724
  * 
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1             # <<<<<<<<<<<<<<
@@ -43342,7 +43360,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   }
   __pyx_L17:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":720
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":725
  *         if loc2.arr[loc2.end-1] + len_last - loc1.arr[loc1.start] > self.train_max_initial_size:
  *             return -1
  *         return 0             # <<<<<<<<<<<<<<
@@ -43358,7 +43376,7 @@ static long __pyx_f_3_sa_23HieroCachingRuleFactory_compare_matchings(struct __py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":723
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":728
  * 
  * 
  *     cdef int* merge_helper(self, int low1, int high1, int* arr1, int step1,             # <<<<<<<<<<<<<<
@@ -43382,7 +43400,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   int __pyx_t_3;
   __Pyx_RefNannySetupContext("merge_helper", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":731
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":736
  *         cdef Matching loc1, loc2
  * 
  *         result_len[0] = 0             # <<<<<<<<<<<<<<
@@ -43391,7 +43409,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   (__pyx_v_result_len[0]) = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":732
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":737
  * 
  *         result_len[0] = 0
  *         result = <int*> malloc(0*sizeof(int))             # <<<<<<<<<<<<<<
@@ -43400,7 +43418,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_result = ((int *)malloc((0 * (sizeof(int)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":734
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":739
  *         result = <int*> malloc(0*sizeof(int))
  * 
  *         i1 = low1             # <<<<<<<<<<<<<<
@@ -43409,7 +43427,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i1 = __pyx_v_low1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":735
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":740
  * 
  *         i1 = low1
  *         i2 = low2             # <<<<<<<<<<<<<<
@@ -43418,7 +43436,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
   __pyx_v_i2 = __pyx_v_low2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":736
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":741
  *         i1 = low1
  *         i2 = low2
  *         while i1 < high1 and i2 < high2:             # <<<<<<<<<<<<<<
@@ -43435,7 +43453,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     if (!__pyx_t_3) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":739
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":744
  * 
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -43444,7 +43462,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":740
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":745
  *             # First, pop all unneeded loc2's off the stack
  *             assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *             while i2 < high2:             # <<<<<<<<<<<<<<
@@ -43455,7 +43473,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":741
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":746
  *             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)             # <<<<<<<<<<<<<<
@@ -43464,7 +43482,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":742
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":747
  *             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:             # <<<<<<<<<<<<<<
@@ -43474,7 +43492,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":743
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":748
  *                 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             # <<<<<<<<<<<<<<
@@ -43486,7 +43504,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":745
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":750
  *                     i2 = i2 + step2
  *                 else:
  *                     break             # <<<<<<<<<<<<<<
@@ -43499,7 +43517,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
     __pyx_L6_break:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":748
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":753
  * 
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1             # <<<<<<<<<<<<<<
@@ -43508,7 +43526,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
     __pyx_v_j1 = __pyx_v_i1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":749
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":754
  *             # Next: process all loc1's with the same starting val
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:             # <<<<<<<<<<<<<<
@@ -43525,7 +43543,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":750
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":755
  *             j1 = i1
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -43534,7 +43552,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":751
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":756
  *             while i1 < high1 and arr1[j1] == arr1[i1]:
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2             # <<<<<<<<<<<<<<
@@ -43543,7 +43561,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
  */
       __pyx_v_j2 = __pyx_v_i2;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":752
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":757
  *                 assign_matching(&loc1, arr1, i1, step1, self.fda.sent_id.arr)
  *                 j2 = i2
  *                 while j2 < high2:             # <<<<<<<<<<<<<<
@@ -43554,7 +43572,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":753
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":758
  *                 j2 = i2
  *                 while j2 < high2:
  *                     assign_matching(&loc2, arr2, j2, step2, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -43563,7 +43581,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":754
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":759
  *                 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)             # <<<<<<<<<<<<<<
@@ -43572,7 +43590,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":755
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":760
  *                     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:             # <<<<<<<<<<<<<<
@@ -43582,7 +43600,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":756
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":761
  *                     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)             # <<<<<<<<<<<<<<
@@ -43594,7 +43612,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L12:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":757
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":762
  *                     if comparison == 0:
  *                         result = append_combined_matching(result, &loc1, &loc2, offset_by_one, num_subpatterns, result_len)
  *                     if comparison == 1:             # <<<<<<<<<<<<<<
@@ -43607,7 +43625,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         __pyx_L13:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":759
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":764
  *                     if comparison == 1:
  *                         pass
  *                     if comparison == -1:             # <<<<<<<<<<<<<<
@@ -43617,7 +43635,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":760
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":765
  *                         pass
  *                     if comparison == -1:
  *                         break             # <<<<<<<<<<<<<<
@@ -43629,7 +43647,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":762
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":767
  *                         break
  *                     else:
  *                         j2 = j2 + step2             # <<<<<<<<<<<<<<
@@ -43642,7 +43660,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
       }
       __pyx_L11_break:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":763
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":768
  *                     else:
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1             # <<<<<<<<<<<<<<
@@ -43653,7 +43671,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
     }
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":764
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":769
  *                         j2 = j2 + step2
  *                 i1 = i1 + step1
  *         return result             # <<<<<<<<<<<<<<
@@ -43669,7 +43687,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_merge_helper(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":767
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":772
  * 
  * 
  *     cdef void sort_phrase_loc(self, IntList arr, PhraseLocation loc, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -43691,26 +43709,26 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("sort_phrase_loc", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":772
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":777
  *         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 = 772; __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 = 777; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":773
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":778
  * 
  *         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 = 773; __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 = 778; __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 = 773; __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 = 778; __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));
@@ -43720,20 +43738,20 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":775
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":780
  *             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 = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 780; __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 = 775; __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 = 780; __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 = 775; __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 = 780; __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 = 775; __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 = 780; __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);
@@ -43742,27 +43760,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":776
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":781
  *         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 = 776; __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 = 781; __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 = 776; __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 = 781; __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 = 776; __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 = 781; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":777
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":782
  *             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:             # <<<<<<<<<<<<<<
@@ -43772,7 +43790,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":778
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":783
  *             veb = VEB(arr.len)
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])             # <<<<<<<<<<<<<<
@@ -43782,7 +43800,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":779
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":784
  *             for i from loc.sa_low <= i < loc.sa_high:
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val             # <<<<<<<<<<<<<<
@@ -43791,7 +43809,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
     __pyx_v_i = __pyx_v_veb->veb->min_val;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":780
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":785
  *                 veb._insert(arr.arr[i])
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:             # <<<<<<<<<<<<<<
@@ -43801,7 +43819,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":781
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":786
  *             i = veb.veb.min_val
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i             # <<<<<<<<<<<<<<
@@ -43810,7 +43828,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":782
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":787
  *             for j from 0 <= j < loc.sa_high-loc.sa_low:
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)             # <<<<<<<<<<<<<<
@@ -43822,7 +43840,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":783
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":788
  *                 loc.arr.arr[j] = i
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0             # <<<<<<<<<<<<<<
@@ -43831,7 +43849,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
  */
   __pyx_v_loc->arr_low = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":784
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":789
  *                 i = veb._findsucc(i)
  *         loc.arr_low = 0
  *         loc.arr_high = loc.arr.len             # <<<<<<<<<<<<<<
@@ -43850,7 +43868,7 @@ static void __pyx_f_3_sa_23HieroCachingRuleFactory_sort_phrase_loc(struct __pyx_
   __Pyx_RefNannyFinishContext();
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":787
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":792
  * 
  * 
  *     cdef intersect_helper(self, Phrase prefix, Phrase suffix,             # <<<<<<<<<<<<<<
@@ -43887,7 +43905,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect_helper", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":794
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":799
  *         cdef int* result_ptr
  * 
  *         result_len = 0             # <<<<<<<<<<<<<<
@@ -43896,21 +43914,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_result_len = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":796
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":801
  *         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 = 796; __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 = 801; __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 = 796; __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 = 801; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":797
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":802
  * 
  *         if sym_isvar(suffix[0]):
  *             offset_by_one = 1             # <<<<<<<<<<<<<<
@@ -43922,7 +43940,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":799
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":804
  *             offset_by_one = 1
  *         else:
  *             offset_by_one = 0             # <<<<<<<<<<<<<<
@@ -43933,34 +43951,34 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":801
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":806
  *             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 = 801; __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 = 806; __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 = 801; __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 = 806; __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 = 801; __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 = 806; __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 = 801; __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 = 806; __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 = 801; __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 = 806; __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 = 801; __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 = 806; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_len_last = __pyx_t_6;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":803
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":808
  *         len_last = len(suffix.getchunk(suffix.arity()))
  * 
  *         if prefix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -43970,7 +43988,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":804
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":809
  * 
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)             # <<<<<<<<<<<<<<
@@ -43985,7 +44003,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":805
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":810
  *         if prefix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr             # <<<<<<<<<<<<<<
@@ -43995,7 +44013,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":806
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":811
  *             self.sort_phrase_loc(self.fsa.sa, prefix_loc, prefix)
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -44004,7 +44022,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low1 = __pyx_v_prefix_loc->arr_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":807
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":812
  *         arr1 = prefix_loc.arr
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -44013,7 +44031,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high1 = __pyx_v_prefix_loc->arr_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":808
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":813
  *         low1 = prefix_loc.arr_low
  *         high1 = prefix_loc.arr_high
  *         step1 = prefix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -44022,7 +44040,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step1 = __pyx_v_prefix_loc->num_subpatterns;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":810
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":815
  *         step1 = prefix_loc.num_subpatterns
  * 
  *         if suffix_loc.arr is None:             # <<<<<<<<<<<<<<
@@ -44032,7 +44050,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":811
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":816
  * 
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)             # <<<<<<<<<<<<<<
@@ -44047,7 +44065,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":812
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":817
  *         if suffix_loc.arr is None:
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr             # <<<<<<<<<<<<<<
@@ -44057,7 +44075,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":813
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":818
  *             self.sort_phrase_loc(self.fsa.sa, suffix_loc, suffix)
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low             # <<<<<<<<<<<<<<
@@ -44066,7 +44084,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_low2 = __pyx_v_suffix_loc->arr_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":814
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":819
  *         arr2 = suffix_loc.arr
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high             # <<<<<<<<<<<<<<
@@ -44075,7 +44093,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_high2 = __pyx_v_suffix_loc->arr_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":815
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":820
  *         low2 = suffix_loc.arr_low
  *         high2 = suffix_loc.arr_high
  *         step2 = suffix_loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -44084,26 +44102,26 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
   __pyx_v_step2 = __pyx_v_suffix_loc->num_subpatterns;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":817
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":822
  *         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 = 817; __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 = 822; __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 = 817; __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 = 822; __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 = 817; __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 = 822; __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 = 817; __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 = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_num_subpatterns = __pyx_t_3;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":819
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":824
  *         num_subpatterns = prefix.arity()+1
  * 
  *         if algorithm == MERGE:             # <<<<<<<<<<<<<<
@@ -44113,7 +44131,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":822
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":827
  *             result_ptr = self.merge_helper(low1, high1, arr1.arr, step1,
  *                                     low2, high2, arr2.arr, step2,
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)             # <<<<<<<<<<<<<<
@@ -44125,7 +44143,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":826
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":831
  *             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)             # <<<<<<<<<<<<<<
@@ -44136,7 +44154,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":828
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":833
  *                                     offset_by_one, len_last, num_subpatterns, &result_len)
  * 
  *         if result_len == 0:             # <<<<<<<<<<<<<<
@@ -44146,7 +44164,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   __pyx_t_7 = (__pyx_v_result_len == 0);
   if (__pyx_t_7) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":829
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":834
  * 
  *         if result_len == 0:
  *             free(result_ptr)             # <<<<<<<<<<<<<<
@@ -44155,7 +44173,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result_ptr);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":830
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":835
  *         if result_len == 0:
  *             free(result_ptr)
  *             return None             # <<<<<<<<<<<<<<
@@ -44170,19 +44188,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":832
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":837
  *             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 = 832; __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 = 837; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":833
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":838
  *         else:
  *             result = IntList()
  *             free(result.arr)             # <<<<<<<<<<<<<<
@@ -44191,7 +44209,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     free(__pyx_v_result->arr);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":834
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":839
  *             result = IntList()
  *             free(result.arr)
  *             result.arr = result_ptr             # <<<<<<<<<<<<<<
@@ -44200,7 +44218,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->arr = __pyx_v_result_ptr;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":835
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":840
  *             free(result.arr)
  *             result.arr = result_ptr
  *             result.len = result_len             # <<<<<<<<<<<<<<
@@ -44209,7 +44227,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->len = __pyx_v_result_len;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":836
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":841
  *             result.arr = result_ptr
  *             result.len = result_len
  *             result.size = result_len             # <<<<<<<<<<<<<<
@@ -44218,7 +44236,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
  */
     __pyx_v_result->size = __pyx_v_result_len;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":837
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":842
  *             result.len = result_len
  *             result.size = result_len
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)             # <<<<<<<<<<<<<<
@@ -44226,19 +44244,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 = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 842; __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 = 837; __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 = 837; __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 = 842; __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 = 842; __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 = 837; __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 = 842; __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 = 837; __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 = 837; __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 = 842; __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 = 842; __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 = 837; __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 = 842; __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 = 837; __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 = 842; __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;
@@ -44264,7 +44282,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_intersect_helper(struct
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":839
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":844
  *             return PhraseLocation(arr_low=0, arr_high=result_len, arr=result, num_subpatterns=num_subpatterns)
  * 
  *     cdef loc2str(self, PhraseLocation loc):             # <<<<<<<<<<<<<<
@@ -44287,7 +44305,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("loc2str", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":841
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":846
  *     cdef loc2str(self, PhraseLocation loc):
  *         cdef int i, j
  *         result = "{"             # <<<<<<<<<<<<<<
@@ -44297,7 +44315,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":842
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":847
  *         cdef int i, j
  *         result = "{"
  *         i = 0             # <<<<<<<<<<<<<<
@@ -44306,7 +44324,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
  */
   __pyx_v_i = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":843
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":848
  *         result = "{"
  *         i = 0
  *         while i < loc.arr_high:             # <<<<<<<<<<<<<<
@@ -44317,20 +44335,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":844
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":849
  *         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 = 844; __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 = 849; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":845
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":850
  *         while i < loc.arr_high:
  *             result = result + "("
  *             for j from i <= j < i + loc.num_subpatterns:             # <<<<<<<<<<<<<<
@@ -44340,19 +44358,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++) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":846
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":851
  *             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 = 846; __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 = 851; __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 = 846; __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 = 851; __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 = 846; __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 = 851; __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);
@@ -44360,20 +44378,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
       __pyx_t_2 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":847
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":852
  *             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 = 847; __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 = 852; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":848
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":853
  *                 result = result + ("%d " %loc.arr[j])
  *             result = result + ")"
  *             i = i + loc.num_subpatterns             # <<<<<<<<<<<<<<
@@ -44383,20 +44401,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
     __pyx_v_i = (__pyx_v_i + __pyx_v_loc->num_subpatterns);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":849
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":854
  *             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 = 849; __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 = 854; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":850
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":855
  *             i = i + loc.num_subpatterns
  *         result = result + "}"
  *         return result             # <<<<<<<<<<<<<<
@@ -44422,7 +44440,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_loc2str(CYTHON_UNUSED st
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":852
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":857
  *         return result
  * 
  *     cdef PhraseLocation intersect(self, prefix_node, suffix_node, Phrase phrase):             # <<<<<<<<<<<<<<
@@ -44448,81 +44466,81 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("intersect", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":856
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":861
  *         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 = 856; __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 = 861; __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 = 856; __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 = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_prefix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":857
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":862
  * 
  *         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 = 857; __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 = 862; __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 = 857; __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 = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_suffix = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":858
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":863
  *         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 = 858; __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 = 863; __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 = 858; __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 = 863; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":859
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":864
  *         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 = 859; __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 = 864; __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 = 859; __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 = 864; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":861
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":866
  *         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 = 861; __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 = 866; __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 = 861; __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 = 866; __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 = 861; __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 = 866; __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 = 861; __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 = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_result = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":862
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":867
  * 
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:             # <<<<<<<<<<<<<<
@@ -44532,7 +44550,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":863
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":868
  *         result = self.get_precomputed_collocation(phrase)
  *         if result is not None:
  *             intersect_method = "precomputed"             # <<<<<<<<<<<<<<
@@ -44545,7 +44563,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":865
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":870
  *             intersect_method = "precomputed"
  * 
  *         if result is None:             # <<<<<<<<<<<<<<
@@ -44555,7 +44573,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":866
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":871
  * 
  *         if result is None:
  *             if self.use_baeza_yates:             # <<<<<<<<<<<<<<
@@ -44564,21 +44582,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
  */
     if (__pyx_v_self->use_baeza_yates) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":867
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":872
  *         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 = 867; __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 = 872; __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 = 867; __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 = 872; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":868
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":873
  *             if self.use_baeza_yates:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, BAEZA_YATES)
  *                 intersect_method="double binary"             # <<<<<<<<<<<<<<
@@ -44592,21 +44610,21 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":870
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":875
  *                 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 = 870; __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 = 875; __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 = 870; __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 = 875; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":871
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":876
  *             else:
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"             # <<<<<<<<<<<<<<
@@ -44622,7 +44640,7 @@ static struct __pyx_obj_3_sa_PhraseLocation *__pyx_f_3_sa_23HieroCachingRuleFact
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":872
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":877
  *                 result = self.intersect_helper(prefix, suffix, prefix_loc, suffix_loc, MERGE)
  *                 intersect_method="merge"
  *         return result             # <<<<<<<<<<<<<<
@@ -44660,11 +44678,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   PyObject *__pyx_v_frontier = 0;
   PyObject *__pyx_v_res = 0;
   PyObject *__pyx_v_fwords = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__frontier,&__pyx_n_s__res,&__pyx_n_s__fwords,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -44679,21 +44697,24 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 874; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __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 = 874; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("advance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 879; __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 = 874; __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 = 879; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -44708,7 +44729,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 = 874; __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 = 879; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.advance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -44719,7 +44740,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13advance(PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":874
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":879
  *         return result
  * 
  *     def advance(self, frontier, res, fwords):             # <<<<<<<<<<<<<<
@@ -44760,19 +44781,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("advance", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":876
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":881
  *     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 = 876; __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 = 881; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_nf = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":877
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":882
  *         cdef unsigned na
  *         nf = []
  *         for (toskip, (i, alt, pathlen)) in frontier:             # <<<<<<<<<<<<<<
@@ -44783,31 +44804,23 @@ 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 = 877; __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 = 882; __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[8]; __pyx_lineno = 877; __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 = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 877; __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 = 877; __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[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -44815,35 +44828,29 @@ 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 = 877; __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 = 882; __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 = 882; __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 = 877; __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 = 877; __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 = 877; __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 = 882; __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;
@@ -44851,15 +44858,14 @@ 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 = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __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;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L6_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_toskip);
@@ -44867,22 +44873,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __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 = 877; __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 = 882; __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 = 882; __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); 
@@ -44890,16 +44895,10 @@ 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 = 877; __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 = 877; __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 = 877; __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 = 877; __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 = 882; __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;
@@ -44909,15 +44908,14 @@ 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 = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       goto __pyx_L8_unpacking_done;
       __pyx_L7_unpacking_failed:;
       __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 = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L8_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_i);
@@ -44930,45 +44928,46 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     __pyx_v_pathlen = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":878
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":883
  *         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 = 878; __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 = 883; __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 = 878; __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 = 883; __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 = 878; __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 = 883; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":879
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":884
  *         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 = 879; __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 = 879; __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 = 884; __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 = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_12) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":880
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":885
  *             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 = 880; __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 = 885; __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);
@@ -44979,7 +44978,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 = 880; __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 = 885; __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;
@@ -44987,42 +44986,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     __pyx_L9:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":881
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":886
  *             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 = 881; __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 = 886; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":882
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":887
  *                 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 = 882; __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 = 882; __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 = 887; __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 = 887; __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 = 882; __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 = 887; __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 = 882; __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 = 887; __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 = 882; __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 = 887; __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 = 882; __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 = 887; __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 = 882; __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 = 887; __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 = 882; __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 = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __pyx_t_15 = __pyx_t_14;
     } else {
@@ -45030,34 +45031,34 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
     }
     if (__pyx_t_15) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":883
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":888
  *             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 = 883; __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 = 888; __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 = 883; __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 = 888; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":884
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":889
  *             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 = 884; __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 = 889; __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 = 884; __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 = 889; __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 = 884; __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 = 889; __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 = 884; __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 = 889; __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);
@@ -45068,7 +45069,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 = 884; __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 = 889; __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);
@@ -45076,7 +45077,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 = 884; __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 = 889; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       }
       goto __pyx_L10;
@@ -45085,18 +45086,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":885
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":890
  *                 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 = 885; __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) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":886
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":891
  *                     nf.append((toskip - 1, (ni, na, pathlen + 1)))
  *         if (len(nf) > 0):
  *             return self.advance(nf, res, fwords)             # <<<<<<<<<<<<<<
@@ -45104,9 +45105,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 = 886; __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 = 891; __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 = 886; __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 = 891; __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));
@@ -45117,7 +45118,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 = 886; __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 = 891; __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;
@@ -45128,7 +45129,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12advance(struct __pyx_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":888
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":893
  *             return self.advance(nf, res, fwords)
  *         else:
  *             return res             # <<<<<<<<<<<<<<
@@ -45178,11 +45179,11 @@ 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;
+  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 *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -45201,41 +45202,48 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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 = 890; __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 = 895; __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 = 890; __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 = 895; __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 = 890; __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 = 895; __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 = 890; __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 = 895; __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 = 890; __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 = 895; __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 = 890; __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 = 895; __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 = 890; __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 = 895; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -45258,7 +45266,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 = 890; __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 = 895; __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();
@@ -45269,7 +45277,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_15get_all_nodes_isteps_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":890
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":895
  *             return res
  * 
  *     def get_all_nodes_isteps_away(self, skip, i, spanlen, pathlen, fwords, next_states, reachable_buffer):             # <<<<<<<<<<<<<<
@@ -45307,41 +45315,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_all_nodes_isteps_away", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":892
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":897
  *     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 = 892; __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 = 897; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":893
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":898
  *         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 = 893; __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 = 898; __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 = 893; __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 = 898; __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 = 893; __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 = 893; __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 = 898; __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 = 898; __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 = 893; __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 = 898; __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 = 893; __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 = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_5) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":894
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":899
  *         frontier = []
  *         if (i+spanlen+skip >= len(next_states)):
  *             return frontier             # <<<<<<<<<<<<<<
@@ -45356,14 +45365,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":895
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":900
  *         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 = 895; __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 = 900; __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);
@@ -45371,42 +45380,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 = 895; __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 = 900; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":896
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":901
  *             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 = 896; __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 = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_reachable = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":897
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":902
  *         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 = 897; __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 = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_5) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":898
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":903
  *         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 = 898; __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 = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_reachable);
     __pyx_v_reachable = __pyx_t_1;
@@ -45415,16 +45424,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":900
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":905
  *             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 = 900; __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 = 905; __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 = 900; __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 = 905; __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);
@@ -45435,7 +45444,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 = 900; __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 = 905; __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;
@@ -45443,18 +45452,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_reachable = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":901
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":906
  *         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 = 901; __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 = 906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":902
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":907
  *             reachable = self.reachable(fwords, i, spanlen)
  *             reachable_buffer[key] = reachable
  *         for nextreachable in reachable:             # <<<<<<<<<<<<<<
@@ -45465,31 +45474,23 @@ 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 = 902; __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 = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
     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 = 902; __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 = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_4); __pyx_t_3++;
     } 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 = 902; __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 = 902; __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)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -45499,20 +45500,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     __pyx_v_nextreachable = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":903
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":908
  *             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 = 903; __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 = 908; __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 = 903; __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 = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_8 = Py_TYPE(__pyx_t_1)->tp_iternext;
     }
@@ -45520,24 +45521,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
     for (;;) {
       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 = 903; __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 = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
       } 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 = 903; __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 = 903; __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)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -45547,16 +45540,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_next_id = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":904
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":909
  *         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 = 904; __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 = 909; __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 = 904; __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 = 909; __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);
@@ -45567,7 +45560,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 = 904; __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 = 909; __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;
@@ -45575,19 +45568,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       __pyx_v_jump = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":905
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":910
  *             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 = 905; __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 = 905; __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 = 910; __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 = 910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":906
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":911
  *                 jump = self.shortest(fwords,i,next_id)
  *                 if jump < skip:
  *                     continue             # <<<<<<<<<<<<<<
@@ -45599,50 +45593,51 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
       }
       __pyx_L9:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":907
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":912
  *                 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 = 907; __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 = 912; __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 = 907; __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 = 912; __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 = 907; __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 = 912; __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 = 907; __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 = 912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_5) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":908
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":913
  *                     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 = 908; __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 = 913; __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 = 908; __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 = 913; __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 = 908; __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 = 913; __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 = 908; __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 = 913; __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 = 908; __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 = 913; __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 = 908; __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 = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_9);
           __pyx_t_12 = Py_TYPE(__pyx_t_9)->tp_iternext;
         }
@@ -45650,24 +45645,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
         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 = 908; __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 = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+            __pyx_t_4 = PyList_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++;
           } 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 = 908; __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 = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+            __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_9, __pyx_t_11); __Pyx_INCREF(__pyx_t_4); __pyx_t_11++;
           } 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 = 908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -45677,40 +45664,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
           __pyx_v_alt_id = __pyx_t_4;
           __pyx_t_4 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":909
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":914
  *                 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 = 909; __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 = 914; __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 = 909; __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 = 914; __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 = 909; __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 = 914; __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 = 909; __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 = 914; __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 = 909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyObject_RichCompare(__pyx_t_4, __pyx_t_10, Py_NE); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_13);
           __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 = 909; __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 = 914; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
           if (__pyx_t_5) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":910
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":915
  *                     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 = 910; __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 = 915; __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 = 910; __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 = 915; __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);
@@ -45725,26 +45713,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
             __pyx_v_newel = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":911
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":916
  *                         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 = 911; __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 = 916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             if (__pyx_t_5) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":912
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":917
  *                             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 = 912; __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 = 917; __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 = 912; __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 = 917; __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);
@@ -45755,7 +45743,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 = 912; __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 = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_13)); __pyx_t_13 = 0;
               goto __pyx_L14;
             }
@@ -45774,7 +45762,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_14get_all_nodes_isteps_
   }
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":913
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":918
  *                             if newel not in frontier:
  *                                 frontier.append((next_id,alt_id,pathlen+jump))
  *         return frontier             # <<<<<<<<<<<<<<
@@ -45817,11 +45805,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_dist = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__dist,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -45836,21 +45824,24 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
       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--;
+        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 = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __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 = 915; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("reachable", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 920; __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 = 915; __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 = 920; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -45865,7 +45856,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 = 915; __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 = 920; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.reachable", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -45876,7 +45867,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_17reachable(PyObject *_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":915
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":920
  *         return frontier
  * 
  *     def reachable(self, fwords, ifrom, dist):             # <<<<<<<<<<<<<<
@@ -45906,35 +45897,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("reachable", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":916
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":921
  * 
  *     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 = 916; __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 = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_ret = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":917
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":922
  *     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 = 917; __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 = 917; __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 = 922; __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 = 922; __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 = 917; __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 = 922; __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 = 917; __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 = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   if (__pyx_t_4) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":918
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":923
  *         ret = []
  *         if (ifrom >= len(fwords)):
  *             return ret             # <<<<<<<<<<<<<<
@@ -45949,32 +45941,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":919
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":924
  *         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 = 919; __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 = 924; __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 = 919; __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 = 924; __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 = 919; __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 = 924; __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 = 919; __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 = 924; __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 = 919; __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 = 924; __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 = 919; __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 = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
@@ -45982,24 +45974,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   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 = 919; __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 = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
     } 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 = 919; __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 = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
     } 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 = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -46009,53 +45993,54 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     __pyx_v_alt_id = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":920
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":925
  *             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 = 920; __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 = 925; __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 = 920; __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 = 925; __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 = 920; __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 = 925; __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 = 920; __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 = 925; __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 = 920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_6, Py_EQ); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 925; __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_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 = 920; __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 = 925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":921
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":926
  *         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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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);
@@ -46066,16 +46051,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 = 921; __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 = 926; __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 = 921; __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 = 926; __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 = 921; __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 = 926; __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;
@@ -46084,36 +46069,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":923
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":928
  *                 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 = 923; __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 = 923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_v_dist, __pyx_int_0, Py_EQ); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":924
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":929
  *             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 = 924; __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 = 929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_4) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":925
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":930
  *                 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 = 925; __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 = 930; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           goto __pyx_L8;
         }
         __pyx_L8:;
@@ -46121,29 +46107,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":927
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":932
  *                         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 = 927; __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 = 932; __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 = 927; __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 = 932; __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 = 927; __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 = 932; __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 = 927; __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 = 932; __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 = 927; __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 = 932; __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 = 927; __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 = 932; __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 = 927; __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 = 932; __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);
@@ -46154,7 +46140,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 = 927; __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 = 932; __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;
@@ -46162,7 +46148,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 = 927; __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 = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_6);
           __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext;
         }
@@ -46170,24 +46156,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
         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 = 927; __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 = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+            __pyx_t_3 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
           } 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 = 927; __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 = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            #endif
+            __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_3); __pyx_t_10++;
           } 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 = 927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
               break;
             }
@@ -46197,24 +46175,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
           __pyx_v_ifromchild = __pyx_t_3;
           __pyx_t_3 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":928
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":933
  *                 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 = 928; __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 = 933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_4) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":929
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":934
  *                     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 = 929; __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 = 934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             goto __pyx_L11;
           }
           __pyx_L11:;
@@ -46227,7 +46205,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_16reachable(struct __py
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":931
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":936
  *                             ret.append(ifromchild)
  * 
  *         return ret             # <<<<<<<<<<<<<<
@@ -46264,11 +46242,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   PyObject *__pyx_v_fwords = 0;
   PyObject *__pyx_v_ifrom = 0;
   PyObject *__pyx_v_ito = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__ifrom,&__pyx_n_s__ito,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -46283,21 +46261,24 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
       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--;
+        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 = 933; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 938; __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 = 933; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("shortest", 1, 3, 3, 2); {__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, "shortest") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 933; __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 = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -46312,7 +46293,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 = 933; __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 = 938; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.shortest", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -46323,7 +46304,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_19shortest(PyObject *__
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":933
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":938
  *         return ret
  * 
  *     def shortest(self, fwords, ifrom, ito):             # <<<<<<<<<<<<<<
@@ -46348,7 +46329,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("shortest", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":935
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":940
  *     def shortest(self, fwords, ifrom, ito):
  *         cdef unsigned alt_id
  *         min = 1000             # <<<<<<<<<<<<<<
@@ -46358,19 +46339,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   __Pyx_INCREF(__pyx_int_1000);
   __pyx_v_min = __pyx_int_1000;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":936
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":941
  *         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 = 936; __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 = 936; __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 = 941; __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 = 941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":937
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":942
  *         min = 1000
  *         if (ifrom > ito):
  *             return min             # <<<<<<<<<<<<<<
@@ -46385,19 +46367,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":938
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":943
  *         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 = 938; __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 = 938; __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 = 943; __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 = 943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":939
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":944
  *             return min
  *         if (ifrom == ito):
  *             return 0             # <<<<<<<<<<<<<<
@@ -46412,41 +46395,41 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":940
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":945
  *         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 = 940; __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 = 945; __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 = 940; __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 = 945; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":941
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":946
  *             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 = 941; __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 = 946; __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 = 941; __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 = 946; __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 = 941; __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 = 946; __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 = 941; __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 = 946; __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 = 941; __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 = 946; __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 = 941; __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 = 946; __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);
@@ -46457,7 +46440,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 = 941; __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 = 946; __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;
@@ -46465,38 +46448,39 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_v_currmin = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":942
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":947
  *         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 = 942; __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 = 947; __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 = 942; __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 = 947; __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 = 942; __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 = 947; __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 = 942; __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 = 947; __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 = 942; __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 = 947; __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 = 942; __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 = 947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":943
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":948
  *             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 = 943; __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 = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_v_currmin);
       __pyx_v_currmin = __pyx_t_1;
@@ -46505,19 +46489,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     }
     __pyx_L7:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":944
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":949
  *             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 = 944; __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 = 944; __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 = 949; __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 = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":945
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":950
  *                 currmin += 1
  *             if (currmin<min):
  *                 min = currmin             # <<<<<<<<<<<<<<
@@ -46532,7 +46517,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_18shortest(struct __pyx
     __pyx_L8:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":946
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":951
  *             if (currmin<min):
  *                 min = currmin
  *         return min             # <<<<<<<<<<<<<<
@@ -46566,11 +46551,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   PyObject *__pyx_v__columns = 0;
   PyObject *__pyx_v_curr_idx = 0;
   PyObject *__pyx_v_min_dist = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s___columns,&__pyx_n_s__curr_idx,&__pyx_n_s__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)) {
@@ -46586,12 +46571,14 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
       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--;
+        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 = 948; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("get_next_states", 0, 2, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 953; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
@@ -46600,7 +46587,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 = 948; __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 = 953; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -46617,7 +46604,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 = 948; __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 = 953; __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();
@@ -46628,7 +46615,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_21get_next_states(PyObj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":948
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":953
  *         return min
  * 
  *     def get_next_states(self, _columns, curr_idx, min_dist=2):             # <<<<<<<<<<<<<<
@@ -46661,26 +46648,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("get_next_states", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":949
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":954
  * 
  *     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 = 949; __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 = 954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":950
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":955
  *     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 = 950; __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 = 955; __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);
@@ -46688,7 +46675,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 = 950; __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 = 955; __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));
@@ -46696,7 +46683,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
   __pyx_v_candidate = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":952
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":957
  *         candidate = [[curr_idx,0]]
  * 
  *         while len(candidate) > 0:             # <<<<<<<<<<<<<<
@@ -46704,43 +46691,44 @@ 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 = 952; __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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":953
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":958
  * 
  *         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 = 953; __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 = 958; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":954
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":959
  *         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 = 954; __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 = 959; __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 = 954; __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 = 954; __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 = 959; __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 = 959; __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 = 954; __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 = 959; __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 = 954; __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 = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":955
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":960
  *             curr = candidate.pop()
  *             if curr[0] >= len(_columns):
  *                 continue             # <<<<<<<<<<<<<<
@@ -46752,30 +46740,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":956
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":961
  *             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 = 956; __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 = 961; __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 = 956; __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 = 961; __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 = 956; __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 = 961; __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 = 956; __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 = 961; __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 = 956; __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 = 961; __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 = 956; __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 = 961; __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;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 956; __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 = 961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_7 = __pyx_t_6;
     } else {
@@ -46783,38 +46773,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     }
     if (__pyx_t_7) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":957
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":962
  *                 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 = 957; __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 = 962; __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 = 957; __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 = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L6;
     }
     __pyx_L6:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":958
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":963
  *             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 = 958; __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 = 963; __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 = 958; __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 = 963; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":959
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":964
  *                 result.append(curr[0]);
  *             curr_col = _columns[curr[0]]
  *             for alt in curr_col:             # <<<<<<<<<<<<<<
@@ -46825,31 +46815,23 @@ 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 = 959; __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 = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_9 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
     for (;;) {
       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 = 959; __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 = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++;
       } 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 = 959; __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 = 959; __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)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -46859,18 +46841,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_alt = __pyx_t_1;
       __pyx_t_1 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":960
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":965
  *             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 = 960; __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 = 965; __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 = 960; __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 = 965; __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 = 960; __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 = 965; __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;
@@ -46878,7 +46860,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __pyx_v_next_id = __pyx_t_10;
       __pyx_t_10 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":961
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":966
  *             for alt in curr_col:
  *                 next_id = curr[0]+alt[2]
  *                 jump = 1             # <<<<<<<<<<<<<<
@@ -46889,25 +46871,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       __Pyx_XDECREF(__pyx_v_jump);
       __pyx_v_jump = __pyx_int_1;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":962
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":967
  *                 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 = 962; __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 = 967; __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 = 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 = 967; __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 = 962; __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 = 967; __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 = 962; __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 = 967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":963
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":968
  *                 jump = 1
  *                 if (alt[0] == EPSILON):
  *                     jump = 0             # <<<<<<<<<<<<<<
@@ -46921,30 +46904,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       __pyx_L9:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":964
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":969
  *                 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 = 964; __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 = 969; __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 = 964; __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 = 969; __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 = 964; __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 = 969; __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 = 964; __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 = 969; __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 = 964; __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 = 969; __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 = 964; __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 = 969; __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_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 964; __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 = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_6 = __pyx_t_4;
       } else {
@@ -46952,19 +46937,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
       }
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":965
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":970
  *                     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 = 965; __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 = 970; __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 = 965; __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 = 970; __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 = 965; __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 = 970; __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);
@@ -46972,7 +46957,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 = 965; __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 = 970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         goto __pyx_L10;
       }
@@ -46982,7 +46967,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_20get_next_states(struc
     __pyx_L3_continue:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":966
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":971
  *                 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);             # <<<<<<<<<<<<<<
@@ -46990,12 +46975,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 = 966; __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 = 971; __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 = 966; __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 = 971; __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;
@@ -47031,11 +47016,11 @@ static char __pyx_doc_3_sa_23HieroCachingRuleFactory_22input[] = "When this func
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__fwords,&__pyx_n_s__meta,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("input (wrapper)", 0);
   {
-    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;
@@ -47049,16 +47034,18 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_23input(PyObject *__pyx
       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--;
+        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__meta)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__meta);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("input", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __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 = 968; __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 = 973; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -47071,7 +47058,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 = 968; __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 = 973; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.input", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -47089,6 +47076,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_lambda4(PyObject
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda4 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda4(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -47101,12 +47089,13 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_7lambda4_lambda5
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda5 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda5(__pyx_self);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1145
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1142
  *                         if len(extracts) > 0:
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))             # <<<<<<<<<<<<<<
@@ -47125,14 +47114,14 @@ static PyObject *__pyx_lambda_funcdef_lambda5(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda5", 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 = 1145; __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 = 1142; __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 = 1145; __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 = 1142; __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 = 1145; __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 = 1142; __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;
@@ -47165,16 +47154,16 @@ static PyObject *__pyx_lambda_funcdef_lambda4(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda4", 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 = 1145; __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 = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda4_lambda5, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_7lambda4_lambda5, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __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 = 1145; __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 = 1142; __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 = 1145; __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 = 1142; __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;
@@ -47203,12 +47192,13 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_5input_1lambda6(PyObjec
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda6 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   __pyx_r = __pyx_lambda_funcdef_lambda6(__pyx_self, ((PyObject *)__pyx_v_x));
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1151
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1148
  *                             for f, elist in fphrases.iteritems():
  *                                 for e, alslist in elist.iteritems():
  *                                     alignment, max_locs = max(alslist.iteritems(), key=lambda x: len(x[1]))             # <<<<<<<<<<<<<<
@@ -47226,11 +47216,11 @@ static PyObject *__pyx_lambda_funcdef_lambda6(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda6", 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 = 1151; __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 = 1148; __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 = 1151; __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 = 1148; __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 = 1151; __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 = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -47249,7 +47239,7 @@ static PyObject *__pyx_lambda_funcdef_lambda6(CYTHON_UNUSED PyObject *__pyx_self
 }
 static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1190
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1187
  *         # Online rule extraction and scoring
  *         if self.online:
  *             f_syms = tuple(word[0][0] for word in fwords)             # <<<<<<<<<<<<<<
@@ -47275,7 +47265,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_5input_2genexpr(PyObjec
   __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_23HieroCachingRuleFactory_5input_4generator14, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -47312,37 +47302,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14(__p
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords)) { __Pyx_RaiseClosureNameError("fwords"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords)) { __Pyx_RaiseClosureNameError("fwords"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
   if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords; __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_fwords); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fwords); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __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[8]; __pyx_lineno = 1190; __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 = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 1190; __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 = 1190; __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[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -47353,9 +47335,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14(__p
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_word = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_word, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_word, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_r = __pyx_t_5;
@@ -47375,7 +47357,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14(__p
     __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[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   PyErr_SetNone(PyExc_StopIteration);
@@ -47388,12 +47370,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_5input_4generator14(__p
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":968
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":973
  *         return sorted(result);
  * 
  *     def input(self, fwords, meta):             # <<<<<<<<<<<<<<
@@ -47425,7 +47406,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 = 968; __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 = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -47469,28 +47450,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   int __pyx_t_20;
   int __pyx_t_21;
   PyObject *(*__pyx_t_22)(PyObject *);
-  long __pyx_t_23;
-  Py_ssize_t __pyx_t_24;
+  Py_ssize_t __pyx_t_23;
+  PyObject *(*__pyx_t_24)(PyObject *);
   Py_ssize_t __pyx_t_25;
-  Py_ssize_t __pyx_t_26;
-  Py_ssize_t __pyx_t_27;
-  int __pyx_t_28;
-  int __pyx_t_29;
-  PyObject *(*__pyx_t_30)(PyObject *);
+  int __pyx_t_26;
+  int __pyx_t_27;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("None", 0);
   switch (__pyx_generator->resume_label) {
     case 0: goto __pyx_L3_first_run;
-    case 1: goto __pyx_L66_resume_from_yield;
-    case 2: goto __pyx_L87_resume_from_yield;
+    case 1: goto __pyx_L65_resume_from_yield;
+    case 2: goto __pyx_L86_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 = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":979
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":984
  *         cdef Phrase hiero_phrase
  * 
  *         flen = len(fwords)             # <<<<<<<<<<<<<<
@@ -47499,27 +47477,27 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_fwords;
   __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 = 979; __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 = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_cur_scope->__pyx_v_flen = __pyx_t_2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":980
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":985
  * 
  *         flen = len(fwords)
  *         start_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         self.extract_time = 0.0
  *         self.intersect_time = 0.0
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __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[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __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_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_cur_scope->__pyx_v_start_time = __pyx_t_4;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":981
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":986
  *         flen = len(fwords)
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0             # <<<<<<<<<<<<<<
@@ -47528,7 +47506,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_self->extract_time = 0.0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":982
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":987
  *         start_time = monitor_cpu()
  *         self.extract_time = 0.0
  *         self.intersect_time = 0.0             # <<<<<<<<<<<<<<
@@ -47537,20 +47515,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_self->intersect_time = 0.0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":983
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":988
  *         self.extract_time = 0.0
  *         self.intersect_time = 0.0
  *         nodes_isteps_away_buffer = {}             # <<<<<<<<<<<<<<
  *         hit = 0
  *         reachable_buffer = {}
  */
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_3));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":984
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":989
  *         self.intersect_time = 0.0
  *         nodes_isteps_away_buffer = {}
  *         hit = 0             # <<<<<<<<<<<<<<
@@ -47559,46 +47537,46 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_cur_scope->__pyx_v_hit = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":985
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":990
  *         nodes_isteps_away_buffer = {}
  *         hit = 0
  *         reachable_buffer = {}             # <<<<<<<<<<<<<<
  * 
  *         # Phrase pairs processed by suffix array extractor.  Do not re-extract
  */
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyDict_New(); 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_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_reachable_buffer = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":990
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":995
  *         # during online extraction.  This is probably the hackiest part of
  *         # online grammar extraction.
  *         seen_phrases = set()             # <<<<<<<<<<<<<<
  * 
  *         # Do not cache between sentences
  */
-  __pyx_t_3 = PySet_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PySet_New(0); 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_GIVEREF(((PyObject *)__pyx_t_3));
   __pyx_cur_scope->__pyx_v_seen_phrases = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":993
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":998
  * 
  *         # Do not cache between sentences
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())             # <<<<<<<<<<<<<<
  * 
  *         frontier = []
  */
-  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __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_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __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);
@@ -47607,20 +47585,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_cur_scope->__pyx_v_self->rules->root = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":995
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1000
  *         self.rules.root = ExtendedTrieNode(phrase_location=PhraseLocation())
  * 
  *         frontier = []             # <<<<<<<<<<<<<<
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 995; __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 = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_frontier = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":996
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1001
  * 
  *         frontier = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -47629,72 +47607,73 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_fwords;
   __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 = 996; __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 = 1001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_5;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":997
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1002
  *         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, (i,), alt, 0, self.rules.root, (), False))
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_7;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":998
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1003
  *         for i in range(len(fwords)):
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:             # <<<<<<<<<<<<<<
  *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
  * 
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); 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_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __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_3_sa_EPSILON); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_8 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_NE); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_NE); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":999
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1004
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))             # <<<<<<<<<<<<<<
  * 
  *         xroot = None
  */
-        __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __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 = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __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 = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
         __pyx_t_1 = 0;
-        __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_11 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_11);
-        __pyx_t_12 = PyTuple_New(8); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_12 = PyTuple_New(8); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
         PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_8);
         __Pyx_GIVEREF(__pyx_t_8);
@@ -47720,7 +47699,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_10 = 0;
         __pyx_t_1 = 0;
         __pyx_t_11 = 0;
-        __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_12)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_12)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
         goto __pyx_L8;
       }
@@ -47728,7 +47707,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1001
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1006
  *                     frontier.append((i, i, (i,), alt, 0, self.rules.root, (), False))
  * 
  *         xroot = None             # <<<<<<<<<<<<<<
@@ -47739,7 +47718,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __Pyx_GIVEREF(Py_None);
   __pyx_cur_scope->__pyx_v_xroot = Py_None;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1002
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1007
  * 
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)             # <<<<<<<<<<<<<<
@@ -47748,32 +47727,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1003
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1008
  *         xroot = None
  *         x1 = sym_setindex(self.category, 1)
  *         if x1 in self.rules.root.children:             # <<<<<<<<<<<<<<
  *             xroot = self.rules.root.children[x1]
  *         else:
  */
-  __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_12);
-  __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_11);
-  __pyx_t_9 = (__Pyx_PySequence_Contains(__pyx_t_12, __pyx_t_11, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_9 = ((PySequence_Contains(__pyx_t_11, __pyx_t_12))); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
   if (__pyx_t_9) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1004
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1009
  *         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_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
-    __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_x1, sizeof(int), PyInt_FromLong); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -47785,21 +47764,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1006
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1011
  *             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_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-    if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_self->rules->root) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
-    if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_11) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_11) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1006; __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_12)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
     __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_xroot);
@@ -47808,21 +47787,21 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_xroot = __pyx_t_11;
     __pyx_t_11 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1007
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1012
  *         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_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->rules->root, __pyx_n_s__children); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
-    if (__Pyx_SetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_x1, __pyx_cur_scope->__pyx_v_xroot, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
   }
   __pyx_L9:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1009
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1014
  *             self.rules.root.children[x1] = xroot
  * 
  *         for i in range(self.min_gap_size, len(fwords)):             # <<<<<<<<<<<<<<
@@ -47831,81 +47810,82 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_11 = __pyx_cur_scope->__pyx_v_fwords;
   __Pyx_INCREF(__pyx_t_11);
-  __pyx_t_2 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
   for (__pyx_t_5 = __pyx_cur_scope->__pyx_v_self->min_gap_size; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_5;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1010
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1015
  * 
  *         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, (i,), alt, self.min_gap_size, xroot, (x1,), True))
  */
-    __pyx_t_11 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
-    __pyx_t_6 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_Length(__pyx_t_11); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
     for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_6; __pyx_t_7+=1) {
       __pyx_cur_scope->__pyx_v_alt = __pyx_t_7;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1011
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1016
  *         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, (i,), alt, self.min_gap_size, xroot, (x1,), True))
  * 
  */
-      __pyx_t_11 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_fwords, __pyx_cur_scope->__pyx_v_i, sizeof(int), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
-      __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = __Pyx_GetItemInt(__pyx_t_11, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      __pyx_t_11 = __Pyx_GetItemInt(__pyx_t_12, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_GetItemInt(__pyx_t_12, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-      __pyx_t_12 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_11, __pyx_t_12, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_11, __pyx_t_12, Py_NE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1012
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1017
  *             for alt in range(0, len(fwords[i])):
  *                 if fwords[i][alt][0] != EPSILON:
  *                     frontier.append((i-self.min_gap_size, i, (i,), alt, self.min_gap_size, xroot, (x1,), True))             # <<<<<<<<<<<<<<
  * 
  *         next_states = []
  */
-        __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_i - __pyx_cur_scope->__pyx_v_self->min_gap_size)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
-        __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __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 = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_11);
-        __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __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 = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
         PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11);
         __Pyx_GIVEREF(__pyx_t_11);
         __pyx_t_11 = 0;
-        __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_11);
-        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); 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);
-        __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_x1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_14 = PyTuple_New(1); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __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 = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_14);
         PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_8);
         __Pyx_GIVEREF(__pyx_t_8);
         __pyx_t_8 = 0;
-        __pyx_t_8 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __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 = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_15 = PyTuple_New(8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyTuple_New(8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_1);
         __Pyx_GIVEREF(__pyx_t_1);
@@ -47931,7 +47911,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_3 = 0;
         __pyx_t_14 = 0;
         __pyx_t_8 = 0;
-        __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_15)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_15)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
         goto __pyx_L14;
       }
@@ -47939,20 +47919,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     }
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1014
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1019
  *                     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_15 = PyList_New(0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = PyList_New(0); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_15);
   __Pyx_GIVEREF(((PyObject *)__pyx_t_15));
   __pyx_cur_scope->__pyx_v_next_states = __pyx_t_15;
   __pyx_t_15 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1015
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1020
  * 
  *         next_states = []
  *         for i in range(len(fwords)):             # <<<<<<<<<<<<<<
@@ -47961,25 +47941,25 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   __pyx_t_15 = __pyx_cur_scope->__pyx_v_fwords;
   __Pyx_INCREF(__pyx_t_15);
-  __pyx_t_2 = PyObject_Length(__pyx_t_15); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1015; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Length(__pyx_t_15); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
   for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_2; __pyx_t_5+=1) {
     __pyx_cur_scope->__pyx_v_i = __pyx_t_5;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1016
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1021
  *         next_states = []
  *         for i in range(len(fwords)):
  *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))             # <<<<<<<<<<<<<<
  * 
- *         # for i in range(len(fwords)):
+ *         while len(frontier) > 0:
  */
-    __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_next_states); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
-    __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->min_gap_size); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
-    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __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 = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fwords);
     PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_fwords);
@@ -47990,34 +47970,34 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __Pyx_GIVEREF(__pyx_t_14);
     __pyx_t_8 = 0;
     __pyx_t_14 = 0;
-    __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __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_3)); __pyx_t_3 = 0;
-    __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_14); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_next_states, __pyx_t_14); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1021
- *         #   print >> sys.stderr, fwords[i][0][0], sym_tostring(fwords[i][0][0])
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1023
+ *             next_states.append(self.get_next_states(fwords,i,self.min_gap_size))
  * 
  *         while len(frontier) > 0:             # <<<<<<<<<<<<<<
  *             new_frontier = []
  *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  */
   while (1) {
-    __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_frontier)); 
     __pyx_t_9 = (__pyx_t_2 > 0);
     if (!__pyx_t_9) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1022
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1024
  * 
  *         while len(frontier) > 0:
  *             new_frontier = []             # <<<<<<<<<<<<<<
  *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:
  *                 word_id = fwords[i][alt][0]
  */
-    __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyList_New(0); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
     __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_new_frontier));
@@ -48025,7 +48005,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_new_frontier = __pyx_t_14;
     __pyx_t_14 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1023
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1025
  *         while len(frontier) > 0:
  *             new_frontier = []
  *             for k, i, input_match, alt, pathlen, node, prefix, is_shadow_path in frontier:             # <<<<<<<<<<<<<<
@@ -48035,25 +48015,15 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_t_14 = ((PyObject *)__pyx_cur_scope->__pyx_v_frontier); __Pyx_INCREF(__pyx_t_14); __pyx_t_2 = 0;
     for (;;) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_3 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
       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 != 8)) {
-          if (size > 8) __Pyx_RaiseTooManyValuesError(8);
-          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-          {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        #if CYTHON_COMPILING_IN_CPYTHON
         if (likely(PyTuple_CheckExact(sequence))) {
+          if (unlikely(PyTuple_GET_SIZE(sequence) != 8)) {
+            if (PyTuple_GET_SIZE(sequence) > 8) __Pyx_RaiseTooManyValuesError(8);
+            else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_15 = PyTuple_GET_ITEM(sequence, 0); 
           __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
           __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
@@ -48063,6 +48033,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_16 = PyTuple_GET_ITEM(sequence, 6); 
           __pyx_t_17 = PyTuple_GET_ITEM(sequence, 7); 
         } else {
+          if (unlikely(PyList_GET_SIZE(sequence) != 8)) {
+            if (PyList_GET_SIZE(sequence) > 8) __Pyx_RaiseTooManyValuesError(8);
+            else __Pyx_RaiseNeedMoreValuesError(PyList_GET_SIZE(sequence));
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_15 = PyList_GET_ITEM(sequence, 0); 
           __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
           __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
@@ -48080,44 +48055,44 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_INCREF(__pyx_t_1);
         __Pyx_INCREF(__pyx_t_16);
         __Pyx_INCREF(__pyx_t_17);
-        #else
-        Py_ssize_t i;
-        PyObject** temps[8] = {&__pyx_t_15,&__pyx_t_8,&__pyx_t_11,&__pyx_t_10,&__pyx_t_12,&__pyx_t_1,&__pyx_t_16,&__pyx_t_17};
-        for (i=0; i < 8; i++) {
-          PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          *(temps[i]) = item;
-        }
-        #endif
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      } else
-      {
+      } else {
         Py_ssize_t index = -1;
-        PyObject** temps[8] = {&__pyx_t_15,&__pyx_t_8,&__pyx_t_11,&__pyx_t_10,&__pyx_t_12,&__pyx_t_1,&__pyx_t_16,&__pyx_t_17};
-        __pyx_t_18 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_18 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_18)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_18);
         __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __pyx_t_19 = Py_TYPE(__pyx_t_18)->tp_iternext;
-        for (index=0; index < 8; index++) {
-          PyObject* item = __pyx_t_19(__pyx_t_18); if (unlikely(!item)) goto __pyx_L21_unpacking_failed;
-          __Pyx_GOTREF(item);
-          *(temps[index]) = item;
-        }
-        if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_18), 8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = NULL;
+        index = 0; __pyx_t_15 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_15)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_15);
+        index = 1; __pyx_t_8 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_8)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_8);
+        index = 2; __pyx_t_11 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_11)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_11);
+        index = 3; __pyx_t_10 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_10)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_10);
+        index = 4; __pyx_t_12 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_12)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_12);
+        index = 5; __pyx_t_1 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_1)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_1);
+        index = 6; __pyx_t_16 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_16)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_16);
+        index = 7; __pyx_t_17 = __pyx_t_19(__pyx_t_18); if (unlikely(!__pyx_t_17)) goto __pyx_L21_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_17);
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_18), 8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
         goto __pyx_L22_unpacking_done;
         __pyx_L21_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_18); __pyx_t_18 = 0;
-        __pyx_t_19 = NULL;
-        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_L22_unpacking_done:;
       }
-      __pyx_t_5 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyInt_AsInt(__pyx_t_15); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
       __pyx_cur_scope->__pyx_v_k = __pyx_t_5;
       __pyx_cur_scope->__pyx_v_i = __pyx_t_7;
@@ -48148,19 +48123,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_is_shadow_path = __pyx_t_17;
       __pyx_t_17 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1024
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1026
  *             new_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_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 = 1024; __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 = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_17 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_17, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_17, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_word_id);
@@ -48169,19 +48144,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_word_id = __pyx_t_3;
       __pyx_t_3 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1025
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1027
  *             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_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 = 1025; __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 = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_17 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_alt, sizeof(int), PyInt_FromLong); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_17, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_17, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_spanlen);
@@ -48190,47 +48165,49 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_3;
       __pyx_t_3 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1027
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1029
  *                 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_3 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyInt_FromLong(__pyx_v_3_sa_EPSILON); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_17 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_17); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_17);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1029
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1031
  *                 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_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_17);
-        __pyx_t_3 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
         __pyx_t_17 = __pyx_cur_scope->__pyx_v_fwords;
         __Pyx_INCREF(__pyx_t_17);
-        __pyx_t_6 = PyObject_Length(__pyx_t_17); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyObject_Length(__pyx_t_17); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-        __pyx_t_17 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_17);
-        __pyx_t_16 = PyObject_RichCompare(__pyx_t_3, __pyx_t_17, Py_GE); __Pyx_XGOTREF(__pyx_t_16); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyObject_RichCompare(__pyx_t_3, __pyx_t_17, Py_GE); 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_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_16); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1029; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_16); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1030
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1032
  *                     # skipping because word_id is epsilon
  *                     if i+spanlen >= len(fwords):
  *                         continue             # <<<<<<<<<<<<<<
@@ -48242,43 +48219,43 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L24:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1031
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1033
  *                     if i+spanlen >= len(fwords):
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):             # <<<<<<<<<<<<<<
  *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue
  */
-        __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __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 = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
-        __pyx_t_17 = PyNumber_Add(__pyx_t_16, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyNumber_Add(__pyx_t_16, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_17);
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-        __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_17); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_17); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_16);
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-        __pyx_t_6 = PyObject_Length(__pyx_t_16); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1031; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyObject_Length(__pyx_t_16); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
         for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_6; __pyx_t_20+=1) {
           __pyx_cur_scope->__pyx_v_nualt = __pyx_t_20;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1032
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1034
  *                         continue
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     continue
  * 
  */
-          __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __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 = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_16);
-          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          __pyx_t_3 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
           __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_nualt); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          __pyx_t_1 = PyTuple_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyTuple_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_16);
           __Pyx_GIVEREF(__pyx_t_16);
@@ -48304,11 +48281,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_16 = 0;
           __pyx_t_3 = 0;
           __pyx_t_17 = 0;
-          __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_frontier, ((PyObject *)__pyx_t_1)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
         }
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1033
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1035
  *                     for nualt in range(0,len(fwords[i+spanlen])):
  *                         frontier.append((k, i+spanlen, input_match, nualt, pathlen, node, prefix, is_shadow_path))
  *                     continue             # <<<<<<<<<<<<<<
@@ -48320,19 +48297,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L23:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1035
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1037
  *                     continue
  * 
  *                 phrase = prefix + (word_id,)             # <<<<<<<<<<<<<<
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()
  */
-      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __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 = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_word_id);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_word_id);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_word_id);
-      __pyx_t_17 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1035; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = PyNumber_Add(__pyx_cur_scope->__pyx_v_prefix, ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_phrase);
@@ -48341,19 +48318,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_cur_scope->__pyx_v_phrase = __pyx_t_17;
       __pyx_t_17 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1036
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1038
  * 
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)             # <<<<<<<<<<<<<<
  *                 arity = hiero_phrase.arity()
  * 
  */
-      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_phrase);
       PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_cur_scope->__pyx_v_phrase);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_phrase);
-      __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1036; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
       __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
@@ -48362,23 +48339,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_1);
       __pyx_t_1 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1037
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1039
  *                 phrase = prefix + (word_id,)
  *                 hiero_phrase = Phrase(phrase)
  *                 arity = hiero_phrase.arity()             # <<<<<<<<<<<<<<
  * 
  *                 lookup_required = False
  */
-      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase), __pyx_n_s__arity); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_17 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_17); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_17); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       __pyx_cur_scope->__pyx_v_arity = __pyx_t_20;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1039
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1041
  *                 arity = hiero_phrase.arity()
  * 
  *                 lookup_required = False             # <<<<<<<<<<<<<<
@@ -48387,36 +48364,36 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       __pyx_cur_scope->__pyx_v_lookup_required = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1040
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1042
  * 
  *                 lookup_required = False
  *                 if word_id in node.children:             # <<<<<<<<<<<<<<
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  */
-      __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_17);
-      __pyx_t_9 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_17, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = ((PySequence_Contains(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1041
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1043
  *                 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_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_17);
-        __pyx_t_1 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
         __pyx_t_9 = (__pyx_t_1 == Py_None);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1043
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1045
  *                     if node.children[word_id] is None:
  *                         # Path dead-ends at this node
  *                         continue             # <<<<<<<<<<<<<<
@@ -48428,16 +48405,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1046
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1048
  *                     else:
  *                         # Path continues at this node
  *                         node = node.children[word_id]             # <<<<<<<<<<<<<<
  *                 else:
  *                     if node.suffix_link is None:
  */
-          __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
-          __pyx_t_17 = PyObject_GetItem(__pyx_t_1, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetItem(__pyx_t_1, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_node);
@@ -48451,20 +48428,20 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1048
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1050
  *                         node = node.children[word_id]
  *                 else:
  *                     if node.suffix_link is None:             # <<<<<<<<<<<<<<
  *                         # Current node is root; lookup required
  *                         lookup_required = True
  */
-        __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_17);
         __pyx_t_9 = (__pyx_t_17 == Py_None);
         __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1050
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1052
  *                     if node.suffix_link is None:
  *                         # Current node is root; lookup required
  *                         lookup_required = True             # <<<<<<<<<<<<<<
@@ -48476,54 +48453,54 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1052
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1054
  *                         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_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          __pyx_t_1 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_1);
           __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-          __pyx_t_9 = (__Pyx_PySequence_Contains(__pyx_cur_scope->__pyx_v_word_id, __pyx_t_1, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = ((PySequence_Contains(__pyx_t_1, __pyx_cur_scope->__pyx_v_word_id))); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1053
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1055
  *                     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_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_17 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_17);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             __pyx_t_9 = (__pyx_t_1 == Py_None);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             if (__pyx_t_9) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1055
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1057
  *                             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_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
-              if (PyObject_SetItem(__pyx_t_1, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyObject_SetItem(__pyx_t_1, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1056
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1058
  *                                 # Suffix link reports path is dead end
  *                                 node.children[word_id] = None
  *                                 continue             # <<<<<<<<<<<<<<
@@ -48535,7 +48512,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1059
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1061
  *                             else:
  *                                 # Suffix link indicates lookup is reqired
  *                                 lookup_required = True             # <<<<<<<<<<<<<<
@@ -48549,18 +48526,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           /*else*/ {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1062
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1064
  *                         else:
  *                             #ERROR: We never get here
  *                             raise Exception("Keyword trie error")             # <<<<<<<<<<<<<<
  *                 # checking whether lookup_required
  *                 if lookup_required:
  */
-            __pyx_t_1 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(__pyx_builtin_Exception, ((PyObject *)__pyx_k_tuple_122), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_Raise(__pyx_t_1, 0, 0, 0);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           __pyx_L30:;
         }
@@ -48568,7 +48545,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L27:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1064
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1066
  *                             raise Exception("Keyword trie error")
  *                 # checking whether lookup_required
  *                 if lookup_required:             # <<<<<<<<<<<<<<
@@ -48577,7 +48554,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
       if (__pyx_cur_scope->__pyx_v_lookup_required) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1065
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1067
  *                 # checking whether lookup_required
  *                 if lookup_required:
  *                     new_node = None             # <<<<<<<<<<<<<<
@@ -48590,66 +48567,66 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __Pyx_GIVEREF(Py_None);
         __pyx_cur_scope->__pyx_v_new_node = Py_None;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1066
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1068
  *                 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_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1069
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1071
  *                         # 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_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-          __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_17, __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_17); __pyx_t_17 = 0;
-          __pyx_t_17 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__phrase_location); 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_17); __pyx_t_17 = 0;
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1070
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1072
  *                         # 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_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 = 1070; __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 = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_17 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_3 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_3 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_word_id); if (!__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_17); __pyx_t_17 = 0;
-          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1071
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1073
  *                         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_1, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __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_1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_1, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1071; __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_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_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -48661,7 +48638,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1073
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1075
  *                                 phrase=hiero_phrase)
  *                     else:
  *                         if arity > 0:             # <<<<<<<<<<<<<<
@@ -48671,16 +48648,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_arity > 0);
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1075
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1077
  *                         if arity > 0:
  *                             # Intersecting because of arity > 0
  *                             intersect_start_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)
  *                             intersect_stop_time = monitor_cpu()
  */
-            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); 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_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_intersect_start_time);
@@ -48689,22 +48666,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_intersect_start_time = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1076
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1078
  *                             # Intersecting because of arity > 0
  *                             intersect_start_time = monitor_cpu()
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)             # <<<<<<<<<<<<<<
  *                             intersect_stop_time = monitor_cpu()
  *                             self.intersect_time += intersect_stop_time - intersect_start_time
  */
-            __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__children); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__children); 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(__pyx_t_1); __pyx_t_1 = 0;
-            __pyx_t_1 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __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_1, __pyx_cur_scope->__pyx_v_hiero_phrase)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1076; __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_1, __pyx_cur_scope->__pyx_v_hiero_phrase)); 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(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -48713,16 +48690,16 @@ 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;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1077
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1079
  *                             intersect_start_time = monitor_cpu()
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)
  *                             intersect_stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *                             self.intersect_time += intersect_stop_time - intersect_start_time
  *                         else:
  */
-            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); 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_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_intersect_stop_time);
@@ -48731,67 +48708,67 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_intersect_stop_time = __pyx_t_1;
             __pyx_t_1 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1078
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1080
  *                             phrase_location = self.intersect(node, node.suffix_link.children[word_id], hiero_phrase)
  *                             intersect_stop_time = monitor_cpu()
  *                             self.intersect_time += intersect_stop_time - intersect_start_time             # <<<<<<<<<<<<<<
  *                         else:
  *                             # Suffix array search
  */
-            __pyx_t_1 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->intersect_time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->intersect_time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_3 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_intersect_stop_time, __pyx_cur_scope->__pyx_v_intersect_start_time); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_intersect_stop_time, __pyx_cur_scope->__pyx_v_intersect_start_time); 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_t_17 = PyNumber_InPlaceAdd(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyNumber_InPlaceAdd(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_17);
             __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_17); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1078; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_17); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             __pyx_cur_scope->__pyx_v_self->intersect_time = __pyx_t_4;
             goto __pyx_L34;
           }
           /*else*/ {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1081
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1083
  *                         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_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_17);
-            if (!(likely(((__pyx_t_17) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_17, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (!(likely(((__pyx_t_17) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_17, __pyx_ptype_3_sa_PhraseLocation))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1083; __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_17);
             __pyx_cur_scope->__pyx_v_phrase_location = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_17);
             __pyx_t_17 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1082
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1084
  *                             # 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_17 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->fsa), __pyx_n_s__lookup); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_17);
-            __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_phrase, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_3 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_20)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_3 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_20)); 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_t_6 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __pyx_t_1 = PyInt_FromSsize_t((__pyx_t_6 - 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_1 = PyInt_FromSsize_t((__pyx_t_6 - 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_1);
-            __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_low); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_16);
-            __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_phrase_location->sa_high); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
             PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_3));
             __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
@@ -48805,7 +48782,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_1 = 0;
             __pyx_t_16 = 0;
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
@@ -48815,7 +48792,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_sa_range = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1083
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1085
  *                             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:             # <<<<<<<<<<<<<<
@@ -48825,24 +48802,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_9 = (__pyx_cur_scope->__pyx_v_sa_range != Py_None);
             if (__pyx_t_9) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1084
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1086
  *                             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_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-              __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__sa_low), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-              __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_sa_range, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
-              if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__sa_high), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __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_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_PhraseLocation)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
               __Pyx_GOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location));
@@ -48854,7 +48831,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             /*else*/ {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1086
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1088
  *                                 phrase_location = PhraseLocation(sa_low=sa_range[0], sa_high=sa_range[1])
  *                             else:
  *                                 phrase_location = None             # <<<<<<<<<<<<<<
@@ -48871,7 +48848,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L34:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1088
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1090
  *                                 phrase_location = None
  * 
  *                         if phrase_location is None:             # <<<<<<<<<<<<<<
@@ -48881,19 +48858,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_9 = (((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location) == Py_None);
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1089
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1091
  * 
  *                         if phrase_location is None:
  *                             node.children[word_id] = None             # <<<<<<<<<<<<<<
  *                             # Search failed
  *                             continue
  */
-            __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 = 1089; __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 = 1091; __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, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            if (PyObject_SetItem(__pyx_t_10, __pyx_cur_scope->__pyx_v_word_id, Py_None) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1091
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1093
  *                             node.children[word_id] = None
  *                             # Search failed
  *                             continue             # <<<<<<<<<<<<<<
@@ -48905,7 +48882,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L36:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1093
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1095
  *                             continue
  *                         # Search succeeded
  *                         suffix_link = self.rules.root             # <<<<<<<<<<<<<<
@@ -48918,32 +48895,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1094
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1096
  *                         # 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_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); 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 = (__pyx_t_10 != Py_None);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1095
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1097
  *                         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_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); 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_12 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_GetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_word_id); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_GetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_word_id); if (!__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_12); __pyx_t_12 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link);
@@ -48955,35 +48932,35 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L37:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1096
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1098
  *                         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_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyDict_New(); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_10));
-          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase_location), ((PyObject *)__pyx_cur_scope->__pyx_v_phrase_location)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1097
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1099
  *                             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_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__suffix_link), __pyx_cur_scope->__pyx_v_suffix_link) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1098
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1100
  *                         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_10, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_10, ((PyObject *)__pyx_n_s__phrase), ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase)) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_ExtendedTrieNode)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_10)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
           __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_new_node);
@@ -48994,19 +48971,19 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         }
         __pyx_L33:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1099
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1101
  *                                 suffix_link=suffix_link,
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node             # <<<<<<<<<<<<<<
  *                     node = new_node
  * 
  */
-        __pyx_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_12);
-        if (PyObject_SetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (PyObject_SetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_word_id, __pyx_cur_scope->__pyx_v_new_node) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1100
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1102
  *                                 phrase=hiero_phrase)
  *                     node.children[word_id] = new_node
  *                     node = new_node             # <<<<<<<<<<<<<<
@@ -49019,7 +48996,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;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1105
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1107
  *                     This should happen before we get to extraction (so that
  *                     the node will exist if needed)'''
  *                     if arity < self.max_nonterminals:             # <<<<<<<<<<<<<<
@@ -49029,14 +49006,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
         __pyx_t_9 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1106
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1108
  *                     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_12 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyInt_FromLong((__pyx_cur_scope->__pyx_v_arity + 1)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_xcat_index);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_xcat_index);
@@ -49044,17 +49021,17 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_xcat_index = __pyx_t_12;
           __pyx_t_12 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1107
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1109
  *                     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_20 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_xcat_index); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __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_20);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1108
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1110
  *                         xcat_index = arity+1
  *                         xcat = sym_setindex(self.category, xcat_index)
  *                         suffix_link_xcat_index = xcat_index             # <<<<<<<<<<<<<<
@@ -49067,24 +49044,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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1109
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1111
  *                         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_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1110
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1112
  *                         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_12 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_xcat_index, __pyx_int_1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index);
@@ -49095,159 +49072,159 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           }
           __pyx_L39:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1111
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1113
  *                         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_20 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_suffix_link_xcat_index); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __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_20);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1112
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1114
  *                             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_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          __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 = 1112; __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 = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase_location), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1113
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1115
  *                         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__suffix_link); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__suffix_link); 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_17 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__children); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_17, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = __Pyx_GetItemInt(__pyx_t_17, __pyx_cur_scope->__pyx_v_suffix_link_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__suffix_link), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1114
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1116
  *                         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_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); 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_xcat); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_17)); 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_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_17)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
-          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__phrase), __pyx_t_10) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __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_12)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __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_12)); 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(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1112
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1114
  *                             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_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          if (__Pyx_SetItemInt(__pyx_t_12, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_10, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (__Pyx_SetItemInt(__pyx_t_12, __pyx_cur_scope->__pyx_v_xcat, __pyx_t_10, sizeof(int), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           goto __pyx_L38;
         }
         __pyx_L38:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1117
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1119
  * 
  *                     # 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_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1117; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_21 = (!__pyx_t_9);
         if (__pyx_t_21) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1118
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1120
  *                     # 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_10 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self->sampler), __pyx_n_s__sample); 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_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_12);
           __Pyx_GIVEREF(__pyx_t_12);
           __pyx_t_12 = 0;
-          __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
-          if (!(likely(((__pyx_t_12) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_12, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (!(likely(((__pyx_t_12) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_12, __pyx_ptype_3_sa_IntList))))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __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_12);
           __pyx_cur_scope->__pyx_v_sample = ((struct __pyx_obj_3_sa_IntList *)__pyx_t_12);
           __pyx_t_12 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1119
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1121
  *                     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_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__phrase_location); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __pyx_cur_scope->__pyx_v_num_subpatterns = ((struct __pyx_obj_3_sa_PhraseLocation *)__pyx_t_12)->num_subpatterns;
           __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1120
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1122
  *                         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_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(((PyObject *)__pyx_t_12));
-          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_17) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          if (PyDict_SetItem(__pyx_t_12, ((PyObject *)__pyx_n_s__initial_len), __pyx_t_17) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-          __pyx_t_17 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_IntList)), ((PyObject *)__pyx_empty_tuple), ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_chunklen));
@@ -49256,7 +49233,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_17);
           __pyx_t_17 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1121
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1123
  *                         num_subpatterns = (<PhraseLocation> node.phrase_location).num_subpatterns
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:             # <<<<<<<<<<<<<<
@@ -49266,7 +49243,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_t_20 = __pyx_cur_scope->__pyx_v_num_subpatterns;
           for (__pyx_cur_scope->__pyx_v_j = 0; __pyx_cur_scope->__pyx_v_j < __pyx_t_20; __pyx_cur_scope->__pyx_v_j++) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1122
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1124
  *                         chunklen = IntList(initial_len=num_subpatterns)
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)             # <<<<<<<<<<<<<<
@@ -49276,14 +49253,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);
           }
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1123
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1125
  *                         for j from 0 <= j < num_subpatterns:
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []             # <<<<<<<<<<<<<<
  *                         j = 0
  *                         extract_start = monitor_cpu()
  */
-          __pyx_t_17 = PyList_New(0); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyList_New(0); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
           __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_extracts));
@@ -49291,7 +49268,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extracts = __pyx_t_17;
           __pyx_t_17 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1124
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1126
  *                             chunklen.arr[j] = hiero_phrase.chunklen(j)
  *                         extracts = []
  *                         j = 0             # <<<<<<<<<<<<<<
@@ -49300,16 +49277,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
           __pyx_cur_scope->__pyx_v_j = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1125
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1127
  *                         extracts = []
  *                         j = 0
  *                         extract_start = monitor_cpu()             # <<<<<<<<<<<<<<
  *                         while j < sample.len:
  *                             extract = []
  */
-          __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_17);
-          __pyx_t_12 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_12 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_12);
           __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract_start);
@@ -49318,7 +49295,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_extract_start = __pyx_t_12;
           __pyx_t_12 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1126
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1128
  *                         j = 0
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:             # <<<<<<<<<<<<<<
@@ -49329,14 +49306,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_21 = (__pyx_cur_scope->__pyx_v_j < __pyx_cur_scope->__pyx_v_sample->len);
             if (!__pyx_t_21) break;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1127
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1129
  *                         extract_start = monitor_cpu()
  *                         while j < sample.len:
  *                             extract = []             # <<<<<<<<<<<<<<
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)
  */
-            __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1127; __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 = 1129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -49344,7 +49321,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = ((PyObject *)__pyx_t_12);
             __pyx_t_12 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1129
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1131
  *                             extract = []
  * 
  *                             assign_matching(&matching, sample.arr, j, num_subpatterns, self.fda.sent_id.arr)             # <<<<<<<<<<<<<<
@@ -49353,21 +49330,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);
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1130
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1132
  * 
  *                             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_12 = __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_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = __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_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_17);
             PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_12);
             __Pyx_GIVEREF(__pyx_t_12);
             __pyx_t_12 = 0;
-            __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_17), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_loc);
@@ -49376,14 +49353,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_loc = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1131
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1133
  *                             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)             # <<<<<<<<<<<<<<
- * 
- *                             for f, e, count, als in extract:
+ *                             extracts.extend([(e, loc) for e in extract])
+ *                             j = j + num_subpatterns
  */
-            __pyx_t_12 = ((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_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_12 = ((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_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_extract);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_extract);
@@ -49391,232 +49368,38 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_extract = __pyx_t_12;
             __pyx_t_12 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1133
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1134
+ *                             loc = tuple(sample[j:j+num_subpatterns])
  *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
- * 
- *                             for f, e, count, als in extract:             # <<<<<<<<<<<<<<
- *                               if str(e) == "[X,1] specific policy choices faced [X,2] , not":
- *                                 print >> sys.stderr, sample[j], sample[j + 1], num_subpatterns, hiero_phrase
- */
-            if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
-              __pyx_t_12 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_12); __pyx_t_6 = 0;
-              __pyx_t_22 = NULL;
-            } else {
-              __pyx_t_6 = -1; __pyx_t_12 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); 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_22 = Py_TYPE(__pyx_t_12)->tp_iternext;
-            }
-            for (;;) {
-              if (!__pyx_t_22 && PyList_CheckExact(__pyx_t_12)) {
-                if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_12)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_17 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_6); __Pyx_INCREF(__pyx_t_17); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_17 = PySequence_ITEM(__pyx_t_12, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
-              } else if (!__pyx_t_22 && PyTuple_CheckExact(__pyx_t_12)) {
-                if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_12)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_17 = PyTuple_GET_ITEM(__pyx_t_12, __pyx_t_6); __Pyx_INCREF(__pyx_t_17); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_17 = PySequence_ITEM(__pyx_t_12, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
-              } else {
-                __pyx_t_17 = __pyx_t_22(__pyx_t_12);
-                if (unlikely(!__pyx_t_17)) {
-                  if (PyErr_Occurred()) {
-                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  break;
-                }
-                __Pyx_GOTREF(__pyx_t_17);
-              }
-              if ((likely(PyTuple_CheckExact(__pyx_t_17))) || (PyList_CheckExact(__pyx_t_17))) {
-                PyObject* sequence = __pyx_t_17;
-                #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 = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
-                if (likely(PyTuple_CheckExact(sequence))) {
-                  __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_16 = PyTuple_GET_ITEM(sequence, 1); 
-                  __pyx_t_1 = PyTuple_GET_ITEM(sequence, 2); 
-                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 3); 
-                } else {
-                  __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_16 = PyList_GET_ITEM(sequence, 1); 
-                  __pyx_t_1 = PyList_GET_ITEM(sequence, 2); 
-                  __pyx_t_3 = PyList_GET_ITEM(sequence, 3); 
-                }
-                __Pyx_INCREF(__pyx_t_10);
-                __Pyx_INCREF(__pyx_t_16);
-                __Pyx_INCREF(__pyx_t_1);
-                __Pyx_INCREF(__pyx_t_3);
-                #else
-                Py_ssize_t i;
-                PyObject** temps[4] = {&__pyx_t_10,&__pyx_t_16,&__pyx_t_1,&__pyx_t_3};
-                for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  *(temps[i]) = item;
-                }
-                #endif
-                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-              } else
-              {
-                Py_ssize_t index = -1;
-                PyObject** temps[4] = {&__pyx_t_10,&__pyx_t_16,&__pyx_t_1,&__pyx_t_3};
-                __pyx_t_11 = PyObject_GetIter(__pyx_t_17); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_11);
-                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-                __pyx_t_19 = Py_TYPE(__pyx_t_11)->tp_iternext;
-                for (index=0; index < 4; index++) {
-                  PyObject* item = __pyx_t_19(__pyx_t_11); if (unlikely(!item)) goto __pyx_L47_unpacking_failed;
-                  __Pyx_GOTREF(item);
-                  *(temps[index]) = item;
-                }
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_11), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_19 = NULL;
-                __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-                goto __pyx_L48_unpacking_done;
-                __pyx_L47_unpacking_failed:;
-                __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-                __pyx_t_19 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L48_unpacking_done:;
-              }
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
-              __Pyx_GIVEREF(__pyx_t_10);
-              __pyx_cur_scope->__pyx_v_f = __pyx_t_10;
-              __pyx_t_10 = 0;
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-              __Pyx_GIVEREF(__pyx_t_16);
-              __pyx_cur_scope->__pyx_v_e = __pyx_t_16;
-              __pyx_t_16 = 0;
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-              __Pyx_GIVEREF(__pyx_t_1);
-              __pyx_cur_scope->__pyx_v_count = __pyx_t_1;
-              __pyx_t_1 = 0;
-              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_als);
-              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_als);
-              __Pyx_GIVEREF(__pyx_t_3);
-              __pyx_cur_scope->__pyx_v_als = __pyx_t_3;
-              __pyx_t_3 = 0;
-
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1134
- * 
- *                             for f, e, count, als in extract:
- *                               if str(e) == "[X,1] specific policy choices faced [X,2] , not":             # <<<<<<<<<<<<<<
- *                                 print >> sys.stderr, sample[j], sample[j + 1], num_subpatterns, hiero_phrase
- * 
- */
-              __pyx_t_17 = PyTuple_New(1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_17);
-              __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
-              PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_cur_scope->__pyx_v_e);
-              __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-              __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_17), 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(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
-              __pyx_t_17 = PyObject_RichCompare(__pyx_t_3, ((PyObject *)__pyx_kp_s_123), Py_EQ); __Pyx_XGOTREF(__pyx_t_17); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_21 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_21 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-              if (__pyx_t_21) {
-
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1135
- *                             for f, e, count, als in extract:
- *                               if str(e) == "[X,1] specific policy choices faced [X,2] , not":
- *                                 print >> sys.stderr, sample[j], sample[j + 1], num_subpatterns, hiero_phrase             # <<<<<<<<<<<<<<
- * 
- *                             extracts.extend([(e, loc) for e in extract])
- */
-                __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__sys); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_17);
-                __pyx_t_3 = PyObject_GetAttr(__pyx_t_17, __pyx_n_s__stderr); 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_17); __pyx_t_17 = 0;
-                __pyx_t_17 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_cur_scope->__pyx_v_j, sizeof(int), PyInt_FromLong); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_17);
-                __pyx_t_23 = (__pyx_cur_scope->__pyx_v_j + 1);
-                __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_cur_scope->__pyx_v_sample), __pyx_t_23, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_1);
-                __pyx_t_16 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_subpatterns); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_16);
-                __pyx_t_10 = PyTuple_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_10);
-                PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_17);
-                __Pyx_GIVEREF(__pyx_t_17);
-                PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_t_1);
-                __Pyx_GIVEREF(__pyx_t_1);
-                PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_t_16);
-                __Pyx_GIVEREF(__pyx_t_16);
-                __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
-                PyTuple_SET_ITEM(__pyx_t_10, 3, ((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
-                __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_hiero_phrase));
-                __pyx_t_17 = 0;
-                __pyx_t_1 = 0;
-                __pyx_t_16 = 0;
-                if (__Pyx_Print(__pyx_t_3, ((PyObject *)__pyx_t_10), 1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-                goto __pyx_L49;
-              }
-              __pyx_L49:;
-            }
-            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1137
- *                                 print >> sys.stderr, sample[j], sample[j + 1], num_subpatterns, hiero_phrase
- * 
  *                             extracts.extend([(e, loc) for e in extract])             # <<<<<<<<<<<<<<
  *                             j = j + num_subpatterns
  * 
  */
-            __pyx_t_12 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); 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(((PyObject *)__pyx_cur_scope->__pyx_v_extracts), __pyx_n_s__extend); 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 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_17 = PyList_New(0); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
             if (PyList_CheckExact(__pyx_cur_scope->__pyx_v_extract) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_extract)) {
               __pyx_t_10 = __pyx_cur_scope->__pyx_v_extract; __Pyx_INCREF(__pyx_t_10); __pyx_t_6 = 0;
               __pyx_t_22 = NULL;
             } else {
-              __pyx_t_6 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_6 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_extract); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_10);
               __pyx_t_22 = Py_TYPE(__pyx_t_10)->tp_iternext;
             }
             for (;;) {
               if (!__pyx_t_22 && PyList_CheckExact(__pyx_t_10)) {
                 if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_10)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_16 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_16); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_16 = PySequence_ITEM(__pyx_t_10, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
+                __pyx_t_16 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_16); __pyx_t_6++;
               } else if (!__pyx_t_22 && PyTuple_CheckExact(__pyx_t_10)) {
                 if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
-                #if CYTHON_COMPILING_IN_CPYTHON
-                __pyx_t_16 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_16); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #else
-                __pyx_t_16 = PySequence_ITEM(__pyx_t_10, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
+                __pyx_t_16 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_16); __pyx_t_6++;
               } else {
                 __pyx_t_16 = __pyx_t_22(__pyx_t_10);
                 if (unlikely(!__pyx_t_16)) {
                   if (PyErr_Occurred()) {
                     if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   }
                   break;
                 }
@@ -49627,7 +49410,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_GIVEREF(__pyx_t_16);
               __pyx_cur_scope->__pyx_v_e = __pyx_t_16;
               __pyx_t_16 = 0;
-              __pyx_t_16 = PyTuple_New(2); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PyTuple_New(2); 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_INCREF(__pyx_cur_scope->__pyx_v_e);
               PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_cur_scope->__pyx_v_e);
@@ -49635,24 +49418,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_loc);
               PyTuple_SET_ITEM(__pyx_t_16, 1, __pyx_cur_scope->__pyx_v_loc);
               __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_loc);
-              if (unlikely(__Pyx_PyList_Append(__pyx_t_3, (PyObject*)__pyx_t_16))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (unlikely(PyList_Append(__pyx_t_17, (PyObject*)__pyx_t_16))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            __pyx_t_10 = PyTuple_New(1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __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 = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_INCREF(((PyObject *)__pyx_t_3));
-            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_3));
-            __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
-            __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-            __pyx_t_3 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_INCREF(((PyObject *)__pyx_t_17));
+            PyTuple_SET_ITEM(__pyx_t_10, 0, ((PyObject *)__pyx_t_17));
+            __Pyx_GIVEREF(((PyObject *)__pyx_t_17));
+            __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
+            __pyx_t_17 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_10), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
             __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_10)); __pyx_t_10 = 0;
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1138
- * 
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1135
+ *                             extract = self.extract(hiero_phrase, &matching, chunklen.arr, num_subpatterns)
  *                             extracts.extend([(e, loc) for e in extract])
  *                             j = j + num_subpatterns             # <<<<<<<<<<<<<<
  * 
@@ -49661,7 +49444,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);
           }
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1140
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1137
  *                             j = j + num_subpatterns
  * 
  *                         num_samples = sample.len/num_subpatterns             # <<<<<<<<<<<<<<
@@ -49670,99 +49453,99 @@ 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 = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __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 = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1137; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1141
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1138
  * 
  *                         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_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_17);
+          __pyx_t_10 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
           __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;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1142
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1139
  *                         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 = 1142; __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 = 1139; __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_extract_stop); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_17 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_extract_stop); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_10 = PyNumber_Subtract(__pyx_t_3, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyNumber_Subtract(__pyx_t_17, __pyx_cur_scope->__pyx_v_extract_start); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-          __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+          __pyx_t_4 = __pyx_PyFloat_AsFloat(__pyx_t_10); if (unlikely((__pyx_t_4 == (float)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1139; __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_4;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1143
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1140
  *                         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_6 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_6 = PyList_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_extracts)); 
           __pyx_t_21 = (__pyx_t_6 > 0);
           if (__pyx_t_21) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1144
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1141
  *                         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 = 1144; __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 = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_3 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_17 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fcount);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_fcount);
-            __Pyx_GIVEREF(__pyx_t_3);
-            __pyx_cur_scope->__pyx_v_fcount = __pyx_t_3;
-            __pyx_t_3 = 0;
+            __Pyx_GIVEREF(__pyx_t_17);
+            __pyx_cur_scope->__pyx_v_fcount = __pyx_t_17;
+            __pyx_t_17 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1145
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1142
  *                         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_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda4, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__defaultdict); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
+            __pyx_t_10 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_lambda4, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __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 = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_12);
             PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
             __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_fphrases);
             __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_fphrases);
@@ -49770,7 +49553,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_fphrases = __pyx_t_10;
             __pyx_t_10 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1146
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1143
  *                             fcount = Counter()
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:             # <<<<<<<<<<<<<<
@@ -49780,120 +49563,100 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_t_10 = ((PyObject *)__pyx_cur_scope->__pyx_v_extracts); __Pyx_INCREF(__pyx_t_10); __pyx_t_6 = 0;
             for (;;) {
               if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_10)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_12); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_12 = PySequence_ITEM(__pyx_t_10, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_12 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_12); __pyx_t_6++;
               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[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_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[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_17 = PyTuple_GET_ITEM(sequence, 0); 
                   __pyx_t_16 = 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[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_17 = PyList_GET_ITEM(sequence, 0); 
                   __pyx_t_16 = PyList_GET_ITEM(sequence, 1); 
                 }
-                __Pyx_INCREF(__pyx_t_3);
+                __Pyx_INCREF(__pyx_t_17);
                 __Pyx_INCREF(__pyx_t_16);
-                #else
-                __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_16 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                #endif
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              } else
-              {
+              } else {
                 Py_ssize_t index = -1;
-                __pyx_t_1 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __pyx_t_19 = Py_TYPE(__pyx_t_1)->tp_iternext;
-                index = 0; __pyx_t_3 = __pyx_t_19(__pyx_t_1); if (unlikely(!__pyx_t_3)) goto __pyx_L55_unpacking_failed;
-                __Pyx_GOTREF(__pyx_t_3);
-                index = 1; __pyx_t_16 = __pyx_t_19(__pyx_t_1); if (unlikely(!__pyx_t_16)) goto __pyx_L55_unpacking_failed;
+                index = 0; __pyx_t_17 = __pyx_t_19(__pyx_t_1); if (unlikely(!__pyx_t_17)) goto __pyx_L50_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_17);
+                index = 1; __pyx_t_16 = __pyx_t_19(__pyx_t_1); if (unlikely(!__pyx_t_16)) goto __pyx_L50_unpacking_failed;
                 __Pyx_GOTREF(__pyx_t_16);
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_1), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_19 = NULL;
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_1), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                goto __pyx_L56_unpacking_done;
-                __pyx_L55_unpacking_failed:;
+                goto __pyx_L51_unpacking_done;
+                __pyx_L50_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-                __pyx_t_19 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L56_unpacking_done:;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_L51_unpacking_done:;
               }
-              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[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                }
-                #if CYTHON_COMPILING_IN_CPYTHON
+              if ((likely(PyTuple_CheckExact(__pyx_t_17))) || (PyList_CheckExact(__pyx_t_17))) {
+                PyObject* sequence = __pyx_t_17;
                 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 = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
-                  __pyx_t_17 = PyTuple_GET_ITEM(sequence, 1); 
+                  __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
                   __pyx_t_11 = PyTuple_GET_ITEM(sequence, 2); 
                   __pyx_t_8 = 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 = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
                   __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
-                  __pyx_t_17 = PyList_GET_ITEM(sequence, 1); 
+                  __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
                   __pyx_t_11 = PyList_GET_ITEM(sequence, 2); 
                   __pyx_t_8 = PyList_GET_ITEM(sequence, 3); 
                 }
                 __Pyx_INCREF(__pyx_t_1);
-                __Pyx_INCREF(__pyx_t_17);
+                __Pyx_INCREF(__pyx_t_3);
                 __Pyx_INCREF(__pyx_t_11);
                 __Pyx_INCREF(__pyx_t_8);
-                #else
-                Py_ssize_t i;
-                PyObject** temps[4] = {&__pyx_t_1,&__pyx_t_17,&__pyx_t_11,&__pyx_t_8};
-                for (i=0; i < 4; i++) {
-                  PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  *(temps[i]) = item;
-                }
-                #endif
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              } else
-              {
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+              } else {
                 Py_ssize_t index = -1;
-                PyObject** temps[4] = {&__pyx_t_1,&__pyx_t_17,&__pyx_t_11,&__pyx_t_8};
-                __pyx_t_15 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_GetIter(__pyx_t_17); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
                 __pyx_t_19 = Py_TYPE(__pyx_t_15)->tp_iternext;
-                for (index=0; index < 4; index++) {
-                  PyObject* item = __pyx_t_19(__pyx_t_15); if (unlikely(!item)) goto __pyx_L57_unpacking_failed;
-                  __Pyx_GOTREF(item);
-                  *(temps[index]) = item;
-                }
-                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_15), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_19 = NULL;
+                index = 0; __pyx_t_1 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_1)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_1);
+                index = 1; __pyx_t_3 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_3)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_3);
+                index = 2; __pyx_t_11 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_11)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_11);
+                index = 3; __pyx_t_8 = __pyx_t_19(__pyx_t_15); if (unlikely(!__pyx_t_8)) goto __pyx_L52_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_8);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_15), 4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                goto __pyx_L58_unpacking_done;
-                __pyx_L57_unpacking_failed:;
+                goto __pyx_L53_unpacking_done;
+                __pyx_L52_unpacking_failed:;
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-                __pyx_t_19 = NULL;
-                if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_L58_unpacking_done:;
+                if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1143; __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);
@@ -49902,9 +49665,9 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_t_1 = 0;
               __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-              __Pyx_GIVEREF(__pyx_t_17);
-              __pyx_cur_scope->__pyx_v_e = __pyx_t_17;
-              __pyx_t_17 = 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_count);
               __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
               __Pyx_GIVEREF(__pyx_t_11);
@@ -49921,7 +49684,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
               __pyx_cur_scope->__pyx_v_loc = __pyx_t_16;
               __pyx_t_16 = 0;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1147
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1144
  *                             fphrases = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))
  *                             for (f, e, count, als), loc in extracts:
  *                                 fcount[f] += count             # <<<<<<<<<<<<<<
@@ -49930,306 +49693,415 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
               __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
               __pyx_t_12 = __pyx_cur_scope->__pyx_v_f;
-              __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_12); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_12); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_16);
-              __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_t_16, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_17 = PyNumber_InPlaceAdd(__pyx_t_16, __pyx_cur_scope->__pyx_v_count); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_17);
               __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_12, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_t_12, __pyx_t_17) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1148
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1145
  *                             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_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fphrases, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __pyx_t_3 = PyObject_GetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __pyx_t_17 = PyObject_GetItem(__pyx_t_12, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_17);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __pyx_t_12 = PyObject_GetItem(__pyx_t_3, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_12 = PyObject_GetItem(__pyx_t_17, __pyx_cur_scope->__pyx_v_als); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_12);
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-              __pyx_t_3 = __Pyx_PyObject_Append(__pyx_t_12, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
+              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+              __pyx_t_17 = __Pyx_PyObject_Append(__pyx_t_12, __pyx_cur_scope->__pyx_v_loc); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_17);
               __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1149
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1146
  *                                 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_6 = 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 = 1149; __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 = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_10);
+            __pyx_t_17 = PyObject_Call(__pyx_t_10, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
+            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
+            if (PyList_CheckExact(__pyx_t_17) || PyTuple_CheckExact(__pyx_t_17)) {
+              __pyx_t_10 = __pyx_t_17; __Pyx_INCREF(__pyx_t_10); __pyx_t_6 = 0;
+              __pyx_t_22 = NULL;
+            } else {
+              __pyx_t_6 = -1; __pyx_t_10 = PyObject_GetIter(__pyx_t_17); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_10);
+              __pyx_t_22 = Py_TYPE(__pyx_t_10)->tp_iternext;
             }
-            __pyx_t_3 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_fphrases, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_24), (&__pyx_t_20)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __Pyx_XDECREF(__pyx_t_10);
-            __pyx_t_10 = __pyx_t_3;
-            __pyx_t_3 = 0;
-            while (1) {
-              __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_10, __pyx_t_24, &__pyx_t_6, &__pyx_t_3, &__pyx_t_12, NULL, __pyx_t_20);
-              if (unlikely(__pyx_t_7 == 0)) break;
-              if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __Pyx_GOTREF(__pyx_t_12);
+            __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+            for (;;) {
+              if (!__pyx_t_22 && PyList_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_17 = PyList_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_17); __pyx_t_6++;
+              } else if (!__pyx_t_22 && PyTuple_CheckExact(__pyx_t_10)) {
+                if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_10)) break;
+                __pyx_t_17 = PyTuple_GET_ITEM(__pyx_t_10, __pyx_t_6); __Pyx_INCREF(__pyx_t_17); __pyx_t_6++;
+              } else {
+                __pyx_t_17 = __pyx_t_22(__pyx_t_10);
+                if (unlikely(!__pyx_t_17)) {
+                  if (PyErr_Occurred()) {
+                    if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                    else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  break;
+                }
+                __Pyx_GOTREF(__pyx_t_17);
+              }
+              if ((likely(PyTuple_CheckExact(__pyx_t_17))) || (PyList_CheckExact(__pyx_t_17))) {
+                PyObject* sequence = __pyx_t_17;
+                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 = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = 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 = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  }
+                  __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
+                  __pyx_t_16 = PyList_GET_ITEM(sequence, 1); 
+                }
+                __Pyx_INCREF(__pyx_t_12);
+                __Pyx_INCREF(__pyx_t_16);
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+              } else {
+                Py_ssize_t index = -1;
+                __pyx_t_8 = PyObject_GetIter(__pyx_t_17); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
+                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+                __pyx_t_19 = Py_TYPE(__pyx_t_8)->tp_iternext;
+                index = 0; __pyx_t_12 = __pyx_t_19(__pyx_t_8); if (unlikely(!__pyx_t_12)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_12);
+                index = 1; __pyx_t_16 = __pyx_t_19(__pyx_t_8); if (unlikely(!__pyx_t_16)) goto __pyx_L56_unpacking_failed;
+                __Pyx_GOTREF(__pyx_t_16);
+                if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_8), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+                goto __pyx_L57_unpacking_done;
+                __pyx_L56_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 = 1146; __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_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_12);
-              __pyx_cur_scope->__pyx_v_elist = __pyx_t_12;
+              __pyx_cur_scope->__pyx_v_f = __pyx_t_12;
               __pyx_t_12 = 0;
+              __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_elist);
+              __Pyx_GIVEREF(__pyx_t_16);
+              __pyx_cur_scope->__pyx_v_elist = __pyx_t_16;
+              __pyx_t_16 = 0;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1150
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1147
  *                                 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_25 = 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 = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_t_17 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_elist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_17);
+              __pyx_t_16 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_GOTREF(__pyx_t_16);
+              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+              if (PyList_CheckExact(__pyx_t_16) || PyTuple_CheckExact(__pyx_t_16)) {
+                __pyx_t_17 = __pyx_t_16; __Pyx_INCREF(__pyx_t_17); __pyx_t_23 = 0;
+                __pyx_t_24 = NULL;
+              } else {
+                __pyx_t_23 = -1; __pyx_t_17 = PyObject_GetIter(__pyx_t_16); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_17);
+                __pyx_t_24 = Py_TYPE(__pyx_t_17)->tp_iternext;
               }
-              __pyx_t_3 = __Pyx_dict_iterator(__pyx_cur_scope->__pyx_v_elist, 0, ((PyObject *)__pyx_n_s__iteritems), (&__pyx_t_26), (&__pyx_t_7)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_3);
-              __Pyx_XDECREF(__pyx_t_12);
-              __pyx_t_12 = __pyx_t_3;
-              __pyx_t_3 = 0;
-              while (1) {
-                __pyx_t_5 = __Pyx_dict_iter_next(__pyx_t_12, __pyx_t_26, &__pyx_t_25, &__pyx_t_3, &__pyx_t_16, NULL, __pyx_t_7);
-                if (unlikely(__pyx_t_5 == 0)) break;
-                if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __Pyx_GOTREF(__pyx_t_16);
+              __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+              for (;;) {
+                if (!__pyx_t_24 && PyList_CheckExact(__pyx_t_17)) {
+                  if (__pyx_t_23 >= PyList_GET_SIZE(__pyx_t_17)) break;
+                  __pyx_t_16 = PyList_GET_ITEM(__pyx_t_17, __pyx_t_23); __Pyx_INCREF(__pyx_t_16); __pyx_t_23++;
+                } else if (!__pyx_t_24 && PyTuple_CheckExact(__pyx_t_17)) {
+                  if (__pyx_t_23 >= PyTuple_GET_SIZE(__pyx_t_17)) break;
+                  __pyx_t_16 = PyTuple_GET_ITEM(__pyx_t_17, __pyx_t_23); __Pyx_INCREF(__pyx_t_16); __pyx_t_23++;
+                } else {
+                  __pyx_t_16 = __pyx_t_24(__pyx_t_17);
+                  if (unlikely(!__pyx_t_16)) {
+                    if (PyErr_Occurred()) {
+                      if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    break;
+                  }
+                  __Pyx_GOTREF(__pyx_t_16);
+                }
+                if ((likely(PyTuple_CheckExact(__pyx_t_16))) || (PyList_CheckExact(__pyx_t_16))) {
+                  PyObject* sequence = __pyx_t_16;
+                  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 = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_12 = PyTuple_GET_ITEM(sequence, 0); 
+                    __pyx_t_8 = 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 = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_12 = PyList_GET_ITEM(sequence, 0); 
+                    __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
+                  }
+                  __Pyx_INCREF(__pyx_t_12);
+                  __Pyx_INCREF(__pyx_t_8);
+                  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+                } else {
+                  Py_ssize_t index = -1;
+                  __pyx_t_11 = PyObject_GetIter(__pyx_t_16); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_GOTREF(__pyx_t_11);
+                  __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
+                  __pyx_t_19 = Py_TYPE(__pyx_t_11)->tp_iternext;
+                  index = 0; __pyx_t_12 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_12)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_12);
+                  index = 1; __pyx_t_8 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_8)) goto __pyx_L60_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_8);
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_11), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+                  goto __pyx_L61_unpacking_done;
+                  __pyx_L60_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 = 1147; __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_3);
-                __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_12);
+                __pyx_cur_scope->__pyx_v_e = __pyx_t_12;
+                __pyx_t_12 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alslist);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alslist);
-                __Pyx_GIVEREF(__pyx_t_16);
-                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_16;
-                __pyx_t_16 = 0;
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_cur_scope->__pyx_v_alslist = __pyx_t_8;
+                __pyx_t_8 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1151
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1148
  *                             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_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__iteritems); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                __pyx_t_3 = PyObject_Call(__pyx_t_16, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_8 = PyObject_Call(__pyx_t_16, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_3);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_t_3 = 0;
-                __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-                __pyx_t_8 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda6, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_8);
-                if (PyDict_SetItem(__pyx_t_3, ((PyObject *)__pyx_n_s__key), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-                __pyx_t_8 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_16), ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_8);
+                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_8);
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_t_8 = 0;
+                __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(((PyObject *)__pyx_t_8));
+                __pyx_t_12 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_5input_1lambda6, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_12);
+                if (PyDict_SetItem(__pyx_t_8, ((PyObject *)__pyx_n_s__key), __pyx_t_12) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+                __pyx_t_12 = PyObject_Call(__pyx_builtin_max, ((PyObject *)__pyx_t_16), ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_12);
                 __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
-                __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-                if ((likely(PyTuple_CheckExact(__pyx_t_8))) || (PyList_CheckExact(__pyx_t_8))) {
-                  PyObject* sequence = __pyx_t_8;
-                  #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 = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  }
-                  #if CYTHON_COMPILING_IN_CPYTHON
+                __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+                if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
+                  PyObject* sequence = __pyx_t_12;
                   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[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
                     __pyx_t_16 = 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[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                    }
+                    __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
                     __pyx_t_16 = PyList_GET_ITEM(sequence, 1); 
                   }
-                  __Pyx_INCREF(__pyx_t_3);
+                  __Pyx_INCREF(__pyx_t_8);
                   __Pyx_INCREF(__pyx_t_16);
-                  #else
-                  __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_16 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
-                  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-                } else
-                {
+                  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+                } else {
                   Py_ssize_t index = -1;
-                  __pyx_t_11 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_11 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_11);
-                  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+                  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                   __pyx_t_19 = Py_TYPE(__pyx_t_11)->tp_iternext;
-                  index = 0; __pyx_t_3 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_3)) goto __pyx_L63_unpacking_failed;
-                  __Pyx_GOTREF(__pyx_t_3);
-                  index = 1; __pyx_t_16 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_16)) goto __pyx_L63_unpacking_failed;
+                  index = 0; __pyx_t_8 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_8)) goto __pyx_L62_unpacking_failed;
+                  __Pyx_GOTREF(__pyx_t_8);
+                  index = 1; __pyx_t_16 = __pyx_t_19(__pyx_t_11); if (unlikely(!__pyx_t_16)) goto __pyx_L62_unpacking_failed;
                   __Pyx_GOTREF(__pyx_t_16);
-                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_11), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_19 = NULL;
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_11), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-                  goto __pyx_L64_unpacking_done;
-                  __pyx_L63_unpacking_failed:;
+                  goto __pyx_L63_unpacking_done;
+                  __pyx_L62_unpacking_failed:;
                   __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-                  __pyx_t_19 = NULL;
-                  if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_L64_unpacking_done:;
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_L63_unpacking_done:;
                 }
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_alignment);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_cur_scope->__pyx_v_alignment = __pyx_t_8;
+                __pyx_t_8 = 0;
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_max_locs);
                 __Pyx_GIVEREF(__pyx_t_16);
                 __pyx_cur_scope->__pyx_v_max_locs = __pyx_t_16;
                 __pyx_t_16 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1152
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1149
  *                                 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_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_8);
-                __pyx_t_16 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__chain); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_12 = __Pyx_GetName(__pyx_m, __pyx_n_s__itertools); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_12);
+                __pyx_t_16 = PyObject_GetAttr(__pyx_t_12, __pyx_n_s__chain); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-                __pyx_t_8 = PyObject_GetAttr(__pyx_t_16, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_8);
+                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+                __pyx_t_12 = PyObject_GetAttr(__pyx_t_16, __pyx_n_s__from_iterable); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_12);
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_alslist, __pyx_n_s__itervalues); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                __pyx_t_3 = PyObject_Call(__pyx_t_16, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_8 = PyObject_Call(__pyx_t_16, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
                 __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
-                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_3);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_t_3 = 0;
-                __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
-                __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_8);
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_t_8 = 0;
+                __pyx_t_8 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
+                __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
-                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                PyTuple_SET_ITEM(__pyx_t_16, 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_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_8);
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_t_8 = 0;
+                __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_16), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
                 __Pyx_DECREF(((PyObject *)__pyx_t_16)); __pyx_t_16 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_XDECREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_3);
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_cur_scope->__pyx_v_locs = ((PyObject*)__pyx_t_8);
+                __pyx_t_8 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1153
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1150
  *                                     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_27 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); if (unlikely(__pyx_t_27 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_27); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_25 = PyTuple_GET_SIZE(((PyObject *)__pyx_cur_scope->__pyx_v_locs)); 
+                __pyx_t_8 = PyInt_FromSsize_t(__pyx_t_25); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
                 __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_count);
                 __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_count);
-                __Pyx_GIVEREF(__pyx_t_3);
-                __pyx_cur_scope->__pyx_v_count = __pyx_t_3;
-                __pyx_t_3 = 0;
+                __Pyx_GIVEREF(__pyx_t_8);
+                __pyx_cur_scope->__pyx_v_count = __pyx_t_8;
+                __pyx_t_8 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1154
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1151
  *                                     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, input_match,
  */
-                __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_8);
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1155
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1152
  *                                     count = len(locs)
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,             # <<<<<<<<<<<<<<
  *                                                (k,i+spanlen), locs, input_match,
  *                                                fwords, self.fda, self.eda,
  */
-                __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_16 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fcount, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_16) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_16);
-                __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_8);
+                __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_num_samples); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1152; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_12);
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1156
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1153
  *                                     scores = self.scorer.score(FeatureContext(
  *                                                f, e, count, fcount[f], num_samples,
  *                                                (k,i+spanlen), locs, input_match,             # <<<<<<<<<<<<<<
  *                                                fwords, self.fda, self.eda,
  *                                                meta,
  */
-                __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
-                __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_17);
-                __pyx_t_1 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __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 = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                __pyx_t_1 = PyNumber_Add(__pyx_t_3, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
-                __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-                __pyx_t_17 = PyTuple_New(2); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                __Pyx_GOTREF(__pyx_t_17);
-                PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_11);
+                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __Pyx_GOTREF(__pyx_t_3);
+                PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_11);
                 __Pyx_GIVEREF(__pyx_t_11);
-                PyTuple_SET_ITEM(__pyx_t_17, 1, __pyx_t_1);
+                PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1);
                 __Pyx_GIVEREF(__pyx_t_1);
                 __pyx_t_11 = 0;
                 __pyx_t_1 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1160
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1157
  *                                                meta,
  *                                                # Include online stats.  None if none.
  *                                                self.online_ctx_lookup(f, e)))             # <<<<<<<<<<<<<<
  *                                     # Phrase pair processed
  *                                     if self.online:
  */
-                __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__online_ctx_lookup); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__online_ctx_lookup); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
-                __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_cur_scope->__pyx_v_f);
@@ -50237,11 +50109,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
                 PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_cur_scope->__pyx_v_e);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-                __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-                __pyx_t_11 = PyTuple_New(13); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = PyTuple_New(13); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
                 __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                 PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_cur_scope->__pyx_v_f);
@@ -50254,10 +50126,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_count);
                 PyTuple_SET_ITEM(__pyx_t_11, 3, __pyx_t_16);
                 __Pyx_GIVEREF(__pyx_t_16);
-                PyTuple_SET_ITEM(__pyx_t_11, 4, __pyx_t_8);
-                __Pyx_GIVEREF(__pyx_t_8);
-                PyTuple_SET_ITEM(__pyx_t_11, 5, ((PyObject *)__pyx_t_17));
-                __Pyx_GIVEREF(((PyObject *)__pyx_t_17));
+                PyTuple_SET_ITEM(__pyx_t_11, 4, __pyx_t_12);
+                __Pyx_GIVEREF(__pyx_t_12);
+                PyTuple_SET_ITEM(__pyx_t_11, 5, ((PyObject *)__pyx_t_3));
+                __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
                 __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 PyTuple_SET_ITEM(__pyx_t_11, 6, ((PyObject *)__pyx_cur_scope->__pyx_v_locs));
                 __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_locs));
@@ -50279,14 +50151,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 PyTuple_SET_ITEM(__pyx_t_11, 12, __pyx_t_15);
                 __Pyx_GIVEREF(__pyx_t_15);
                 __pyx_t_16 = 0;
-                __pyx_t_8 = 0;
-                __pyx_t_17 = 0;
+                __pyx_t_12 = 0;
+                __pyx_t_3 = 0;
                 __pyx_t_15 = 0;
-                __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
-                __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+                __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
                 __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-                __pyx_t_11 = ((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_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = ((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_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
                 __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
                 __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -50295,7 +50167,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 __pyx_cur_scope->__pyx_v_scores = ((struct __pyx_obj_3_sa_FeatureVector *)__pyx_t_11);
                 __pyx_t_11 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1162
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1159
  *                                                self.online_ctx_lookup(f, e)))
  *                                     # Phrase pair processed
  *                                     if self.online:             # <<<<<<<<<<<<<<
@@ -50304,14 +50176,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
                 if (__pyx_cur_scope->__pyx_v_self->online) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1163
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1160
  *                                     # Phrase pair processed
  *                                     if self.online:
  *                                         seen_phrases.add((f, e))             # <<<<<<<<<<<<<<
  *                                     yield Rule(self.category, f, e, scores, alignment)
  * 
  */
-                  __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_11);
                   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
                   PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_cur_scope->__pyx_v_f);
@@ -50319,22 +50191,22 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
                   PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_cur_scope->__pyx_v_e);
                   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-                  __pyx_t_13 = PySet_Add(__pyx_cur_scope->__pyx_v_seen_phrases, ((PyObject *)__pyx_t_11)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_13 = PySet_Add(__pyx_cur_scope->__pyx_v_seen_phrases, ((PyObject *)__pyx_t_11)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-                  goto __pyx_L65;
+                  goto __pyx_L64;
                 }
-                __pyx_L65:;
+                __pyx_L64:;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1164
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1161
  *                                     if self.online:
  *                                         seen_phrases.add((f, e))
  *                                     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_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
-                __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_11);
                 __Pyx_GIVEREF(__pyx_t_11);
@@ -50351,54 +50223,50 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
                 PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_cur_scope->__pyx_v_alignment);
                 __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
                 __pyx_t_11 = 0;
-                __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_11);
                 __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
                 __pyx_r = __pyx_t_11;
                 __pyx_t_11 = 0;
                 __pyx_cur_scope->__pyx_t_0 = __pyx_t_2;
                 __pyx_cur_scope->__pyx_t_1 = __pyx_t_6;
-                __pyx_cur_scope->__pyx_t_2 = __pyx_t_7;
                 __Pyx_XGIVEREF(__pyx_t_10);
-                __pyx_cur_scope->__pyx_t_3 = __pyx_t_10;
-                __Pyx_XGIVEREF(__pyx_t_12);
-                __pyx_cur_scope->__pyx_t_4 = __pyx_t_12;
+                __pyx_cur_scope->__pyx_t_2 = __pyx_t_10;
                 __Pyx_XGIVEREF(__pyx_t_14);
-                __pyx_cur_scope->__pyx_t_5 = __pyx_t_14;
-                __pyx_cur_scope->__pyx_t_6 = __pyx_t_20;
+                __pyx_cur_scope->__pyx_t_3 = __pyx_t_14;
+                __Pyx_XGIVEREF(__pyx_t_17);
+                __pyx_cur_scope->__pyx_t_4 = __pyx_t_17;
+                __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_24;
-                __pyx_cur_scope->__pyx_t_8 = __pyx_t_25;
-                __pyx_cur_scope->__pyx_t_9 = __pyx_t_26;
                 __Pyx_XGIVEREF(__pyx_r);
                 __Pyx_RefNannyFinishContext();
                 /* return from generator, yielding value */
                 __pyx_generator->resume_label = 1;
                 return __pyx_r;
-                __pyx_L66_resume_from_yield:;
+                __pyx_L65_resume_from_yield:;
                 __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
                 __pyx_t_6 = __pyx_cur_scope->__pyx_t_1;
-                __pyx_t_7 = __pyx_cur_scope->__pyx_t_2;
-                __pyx_t_10 = __pyx_cur_scope->__pyx_t_3;
-                __pyx_cur_scope->__pyx_t_3 = 0;
+                __pyx_t_10 = __pyx_cur_scope->__pyx_t_2;
+                __pyx_cur_scope->__pyx_t_2 = 0;
                 __Pyx_XGOTREF(__pyx_t_10);
-                __pyx_t_12 = __pyx_cur_scope->__pyx_t_4;
-                __pyx_cur_scope->__pyx_t_4 = 0;
-                __Pyx_XGOTREF(__pyx_t_12);
-                __pyx_t_14 = __pyx_cur_scope->__pyx_t_5;
-                __pyx_cur_scope->__pyx_t_5 = 0;
+                __pyx_t_14 = __pyx_cur_scope->__pyx_t_3;
+                __pyx_cur_scope->__pyx_t_3 = 0;
                 __Pyx_XGOTREF(__pyx_t_14);
-                __pyx_t_20 = __pyx_cur_scope->__pyx_t_6;
+                __pyx_t_17 = __pyx_cur_scope->__pyx_t_4;
+                __pyx_cur_scope->__pyx_t_4 = 0;
+                __Pyx_XGOTREF(__pyx_t_17);
+                __pyx_t_22 = __pyx_cur_scope->__pyx_t_5;
+                __pyx_t_23 = __pyx_cur_scope->__pyx_t_6;
                 __pyx_t_24 = __pyx_cur_scope->__pyx_t_7;
-                __pyx_t_25 = __pyx_cur_scope->__pyx_t_8;
-                __pyx_t_26 = __pyx_cur_scope->__pyx_t_9;
-                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               }
-              __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
             }
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-            goto __pyx_L52;
+            goto __pyx_L47;
           }
-          __pyx_L52:;
+          __pyx_L47:;
           goto __pyx_L40;
         }
         __pyx_L40:;
@@ -50406,121 +50274,123 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       }
       __pyx_L32:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1166
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1163
  *                                     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, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  */
-      __pyx_t_24 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_21 = (__pyx_t_24 < __pyx_cur_scope->__pyx_v_self->max_length);
+      __pyx_t_6 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_21 = (__pyx_t_6 < __pyx_cur_scope->__pyx_v_self->max_length);
       if (__pyx_t_21) {
-        __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __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 = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_12 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_17 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
         __pyx_t_10 = __pyx_cur_scope->__pyx_v_fwords;
         __Pyx_INCREF(__pyx_t_10);
-        __pyx_t_24 = PyObject_Length(__pyx_t_10); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_6 = PyObject_Length(__pyx_t_10); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_24); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __pyx_t_11 = PyObject_RichCompare(__pyx_t_12, __pyx_t_10, Py_LT); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+        __pyx_t_11 = PyObject_RichCompare(__pyx_t_17, __pyx_t_10, Py_LT); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_11);
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
         if (__pyx_t_9) {
-          __pyx_t_11 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyNumber_Add(__pyx_cur_scope->__pyx_v_pathlen, __pyx_int_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_11);
-          __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 = 1166; __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 = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_12 = PyObject_RichCompare(__pyx_t_11, __pyx_t_10, Py_LE); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyObject_RichCompare(__pyx_t_11, __pyx_t_10, Py_LE); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_17);
           __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-          __pyx_t_28 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_28 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-          __pyx_t_29 = __pyx_t_28;
+          __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_17); if (unlikely(__pyx_t_26 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+          __pyx_t_27 = __pyx_t_26;
         } else {
-          __pyx_t_29 = __pyx_t_9;
+          __pyx_t_27 = __pyx_t_9;
         }
-        __pyx_t_9 = __pyx_t_29;
+        __pyx_t_9 = __pyx_t_27;
       } else {
         __pyx_t_9 = __pyx_t_21;
       }
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1167
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1164
  * 
  *                 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, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity
  */
-        __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
-        __pyx_t_10 = PyNumber_Add(__pyx_t_12, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
+        __pyx_t_10 = PyNumber_Add(__pyx_t_17, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-        __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_12);
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+        __pyx_t_17 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fwords, __pyx_t_10); if (!__pyx_t_17) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_17);
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_24 = PyObject_Length(__pyx_t_12); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-        for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_24; __pyx_t_20+=1) {
+        __pyx_t_6 = PyObject_Length(__pyx_t_17); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+        for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_6; __pyx_t_20+=1) {
           __pyx_cur_scope->__pyx_v_alt_id = __pyx_t_20;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1168
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1165
  *                 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, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))             # <<<<<<<<<<<<<<
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  */
-          __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_12);
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_17);
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_11 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_11 = PyNumber_Add(__pyx_t_10, __pyx_cur_scope->__pyx_v_spanlen); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1165; __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_cur_scope->__pyx_v_alt_id); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __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 = 1165; __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 = 1168; __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 = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __pyx_t_3 = PyTuple_New(8); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_12);
-          __Pyx_GIVEREF(__pyx_t_12);
-          PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_11);
+          __pyx_t_8 = PyTuple_New(8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_17);
+          __Pyx_GIVEREF(__pyx_t_17);
+          PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_11);
           __Pyx_GIVEREF(__pyx_t_11);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_input_match);
-          PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_cur_scope->__pyx_v_input_match);
+          PyTuple_SET_ITEM(__pyx_t_8, 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_10);
+          PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
-          PyTuple_SET_ITEM(__pyx_t_3, 4, __pyx_t_15);
+          PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_t_15);
           __Pyx_GIVEREF(__pyx_t_15);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
-          PyTuple_SET_ITEM(__pyx_t_3, 5, __pyx_cur_scope->__pyx_v_node);
+          PyTuple_SET_ITEM(__pyx_t_8, 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_3, 6, __pyx_cur_scope->__pyx_v_phrase);
+          PyTuple_SET_ITEM(__pyx_t_8, 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_3, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
+          PyTuple_SET_ITEM(__pyx_t_8, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-          __pyx_t_12 = 0;
+          __pyx_t_17 = 0;
           __pyx_t_11 = 0;
           __pyx_t_10 = 0;
           __pyx_t_15 = 0;
-          __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+          __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_8)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
         }
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1169
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1166
  *                     for alt_id in range(len(fwords[i+spanlen])):
  *                         new_frontier.append((k, i+spanlen, input_match, alt_id, pathlen + 1, node, phrase, is_shadow_path))
  *                     num_subpatterns = arity             # <<<<<<<<<<<<<<
@@ -50529,18 +50399,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
         __pyx_cur_scope->__pyx_v_num_subpatterns = __pyx_cur_scope->__pyx_v_arity;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1170
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1167
  *                         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_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_is_shadow_path); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1167; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __pyx_t_21 = (!__pyx_t_9);
         if (__pyx_t_21) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1171
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1168
  *                     num_subpatterns = arity
  *                     if not is_shadow_path:
  *                         num_subpatterns = num_subpatterns + 1             # <<<<<<<<<<<<<<
@@ -50548,34 +50418,34 @@ 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_L70;
+          goto __pyx_L69;
         }
-        __pyx_L70:;
+        __pyx_L69:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1172
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1169
  *                     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_24 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_24 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_21 = ((__pyx_t_24 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
+        __pyx_t_6 = PyObject_Length(__pyx_cur_scope->__pyx_v_phrase); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_21 = ((__pyx_t_6 + 1) < __pyx_cur_scope->__pyx_v_self->max_length);
         if (__pyx_t_21) {
           __pyx_t_9 = (__pyx_cur_scope->__pyx_v_arity < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
           if (__pyx_t_9) {
-            __pyx_t_29 = (__pyx_cur_scope->__pyx_v_num_subpatterns < __pyx_cur_scope->__pyx_v_self->max_chunks);
-            __pyx_t_28 = __pyx_t_29;
+            __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_28 = __pyx_t_9;
+            __pyx_t_26 = __pyx_t_9;
           }
-          __pyx_t_9 = __pyx_t_28;
+          __pyx_t_9 = __pyx_t_26;
         } else {
           __pyx_t_9 = __pyx_t_21;
         }
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1173
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1170
  *                         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)             # <<<<<<<<<<<<<<
@@ -50584,41 +50454,41 @@ 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));
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1174
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1171
  *                     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_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 = 1174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_3, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s__children); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_8, __pyx_cur_scope->__pyx_v_xcat, sizeof(int), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_15);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1176
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1173
  *                         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 = 1176; __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 = 1173; __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 = 1176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_10 = PyList_New(4); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1173; __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_3);
-          __Pyx_GIVEREF(__pyx_t_3);
+          PyList_SET_ITEM(__pyx_t_10, 1, __pyx_t_8);
+          __Pyx_GIVEREF(__pyx_t_8);
           __Pyx_INCREF(__pyx_int_1);
           PyList_SET_ITEM(__pyx_t_10, 2, __pyx_int_1);
           __Pyx_GIVEREF(__pyx_int_1);
@@ -50626,73 +50496,73 @@ 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_15 = 0;
-          __pyx_t_3 = 0;
-          __pyx_t_3 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(((PyObject *)__pyx_t_3));
+          __pyx_t_8 = 0;
+          __pyx_t_8 = ((PyObject *)PyList_AsTuple(__pyx_t_10)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(((PyObject *)__pyx_t_8));
           __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_3));
-          __pyx_cur_scope->__pyx_v_key = __pyx_t_3;
-          __pyx_t_3 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_8));
+          __pyx_cur_scope->__pyx_v_key = __pyx_t_8;
+          __pyx_t_8 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1177
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1174
  *                         # 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_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
+          __pyx_t_8 = PyList_New(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
           __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-          __Pyx_GIVEREF(((PyObject *)__pyx_t_3));
-          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_3);
-          __pyx_t_3 = 0;
+          __Pyx_GIVEREF(((PyObject *)__pyx_t_8));
+          __pyx_cur_scope->__pyx_v_frontier_nodes = ((PyObject *)__pyx_t_8);
+          __pyx_t_8 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1178
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1175
  *                         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_9 = (__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_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_9 = ((PyDict_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)))); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1179
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1176
  *                         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_3 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_8 = __Pyx_PyDict_GetItem(((PyObject *)__pyx_cur_scope->__pyx_v_nodes_isteps_away_buffer), ((PyObject *)__pyx_cur_scope->__pyx_v_key)); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_8);
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
-            __Pyx_GIVEREF(__pyx_t_3);
-            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_3;
-            __pyx_t_3 = 0;
-            goto __pyx_L72;
+            __Pyx_GIVEREF(__pyx_t_8);
+            __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_8;
+            __pyx_t_8 = 0;
+            goto __pyx_L71;
           }
           /*else*/ {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1181
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1178
  *                             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_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_124); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __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 = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s_123); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_8);
+            __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 = 1178; __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 = 1181; __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 = 1178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __pyx_t_11 = PyTuple_New(7); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyTuple_New(7); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_11);
             PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
@@ -50715,9 +50585,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_15 = 0;
-            __pyx_t_15 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_15 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
             __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_frontier_nodes);
@@ -50725,18 +50595,18 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             __pyx_cur_scope->__pyx_v_frontier_nodes = __pyx_t_15;
             __pyx_t_15 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1182
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1179
  *                         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 = 1182; __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 = 1179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
-          __pyx_L72:;
+          __pyx_L71:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1184
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1181
  *                             nodes_isteps_away_buffer[key] = frontier_nodes
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:             # <<<<<<<<<<<<<<
@@ -50744,34 +50614,26 @@ 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_24 = 0;
+            __pyx_t_15 = __pyx_cur_scope->__pyx_v_frontier_nodes; __Pyx_INCREF(__pyx_t_15); __pyx_t_6 = 0;
             __pyx_t_22 = NULL;
           } else {
-            __pyx_t_24 = -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 = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_6 = -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 = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_15);
             __pyx_t_22 = Py_TYPE(__pyx_t_15)->tp_iternext;
           }
           for (;;) {
             if (!__pyx_t_22 && PyList_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_24 >= PyList_GET_SIZE(__pyx_t_15)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_24); __Pyx_INCREF(__pyx_t_11); __pyx_t_24++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_15, __pyx_t_24); __pyx_t_24++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_15)) break;
+              __pyx_t_11 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_6); __Pyx_INCREF(__pyx_t_11); __pyx_t_6++;
             } else if (!__pyx_t_22 && PyTuple_CheckExact(__pyx_t_15)) {
-              if (__pyx_t_24 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-              #if CYTHON_COMPILING_IN_CPYTHON
-              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_24); __Pyx_INCREF(__pyx_t_11); __pyx_t_24++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #else
-              __pyx_t_11 = PySequence_ITEM(__pyx_t_15, __pyx_t_24); __pyx_t_24++; if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
+              __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_6); __Pyx_INCREF(__pyx_t_11); __pyx_t_6++;
             } else {
               __pyx_t_11 = __pyx_t_22(__pyx_t_15);
               if (unlikely(!__pyx_t_11)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -50779,145 +50641,137 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
             }
             if ((likely(PyTuple_CheckExact(__pyx_t_11))) || (PyList_CheckExact(__pyx_t_11))) {
               PyObject* sequence = __pyx_t_11;
-              #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 = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_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) != 3)) {
+                  if (PyTuple_GET_SIZE(sequence) > 3) __Pyx_RaiseTooManyValuesError(3);
+                  else __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(sequence));
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyTuple_GET_ITEM(sequence, 1); 
-                __pyx_t_12 = PyTuple_GET_ITEM(sequence, 2); 
+                __pyx_t_17 = PyTuple_GET_ITEM(sequence, 2); 
               } else {
-                __pyx_t_3 = 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 = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                }
+                __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
                 __pyx_t_10 = PyList_GET_ITEM(sequence, 1); 
-                __pyx_t_12 = PyList_GET_ITEM(sequence, 2); 
+                __pyx_t_17 = PyList_GET_ITEM(sequence, 2); 
               }
-              __Pyx_INCREF(__pyx_t_3);
+              __Pyx_INCREF(__pyx_t_8);
               __Pyx_INCREF(__pyx_t_10);
-              __Pyx_INCREF(__pyx_t_12);
-              #else
-              __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __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 = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_12 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __Pyx_INCREF(__pyx_t_17);
               __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-            } else
-            {
+            } else {
               Py_ssize_t index = -1;
-              __pyx_t_17 = PyObject_GetIter(__pyx_t_11); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __Pyx_GOTREF(__pyx_t_17);
-              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-              __pyx_t_19 = Py_TYPE(__pyx_t_17)->tp_iternext;
-              index = 0; __pyx_t_3 = __pyx_t_19(__pyx_t_17); if (unlikely(!__pyx_t_3)) goto __pyx_L75_unpacking_failed;
+              __pyx_t_3 = PyObject_GetIter(__pyx_t_11); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_3);
-              index = 1; __pyx_t_10 = __pyx_t_19(__pyx_t_17); if (unlikely(!__pyx_t_10)) goto __pyx_L75_unpacking_failed;
+              __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+              __pyx_t_19 = Py_TYPE(__pyx_t_3)->tp_iternext;
+              index = 0; __pyx_t_8 = __pyx_t_19(__pyx_t_3); if (unlikely(!__pyx_t_8)) goto __pyx_L74_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_8);
+              index = 1; __pyx_t_10 = __pyx_t_19(__pyx_t_3); if (unlikely(!__pyx_t_10)) goto __pyx_L74_unpacking_failed;
               __Pyx_GOTREF(__pyx_t_10);
-              index = 2; __pyx_t_12 = __pyx_t_19(__pyx_t_17); if (unlikely(!__pyx_t_12)) goto __pyx_L75_unpacking_failed;
-              __Pyx_GOTREF(__pyx_t_12);
-              if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_17), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_19 = NULL;
-              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-              goto __pyx_L76_unpacking_done;
-              __pyx_L75_unpacking_failed:;
-              __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
-              __pyx_t_19 = NULL;
-              if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_L76_unpacking_done:;
+              index = 2; __pyx_t_17 = __pyx_t_19(__pyx_t_3); if (unlikely(!__pyx_t_17)) goto __pyx_L74_unpacking_failed;
+              __Pyx_GOTREF(__pyx_t_17);
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+              goto __pyx_L75_unpacking_done;
+              __pyx_L74_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 = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              __pyx_L75_unpacking_done:;
             }
-            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-            __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_20 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_20 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+            __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_10); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
             __pyx_cur_scope->__pyx_v_i = __pyx_t_20;
             __pyx_cur_scope->__pyx_v_alt = __pyx_t_7;
             __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_pathlen);
             __Pyx_DECREF(__pyx_cur_scope->__pyx_v_pathlen);
-            __Pyx_GIVEREF(__pyx_t_12);
-            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_12;
-            __pyx_t_12 = 0;
+            __Pyx_GIVEREF(__pyx_t_17);
+            __pyx_cur_scope->__pyx_v_pathlen = __pyx_t_17;
+            __pyx_t_17 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1185
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1182
  * 
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))             # <<<<<<<<<<<<<<
  *             frontier = new_frontier
  * 
  */
-            __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_11 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_k); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_11);
-            __pyx_t_12 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_12);
-            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_17);
+            __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_i); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __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 = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_10);
+            __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_8);
+            PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
             __pyx_t_10 = 0;
-            __pyx_t_10 = PyNumber_Add(__pyx_cur_scope->__pyx_v_input_match, ((PyObject *)__pyx_t_3)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_10 = PyNumber_Add(__pyx_cur_scope->__pyx_v_input_match, ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_10);
-            __Pyx_DECREF(((PyObject *)__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 = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_3);
-            __pyx_t_17 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_17);
-            __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_8);
-            PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_17);
-            __Pyx_GIVEREF(__pyx_t_17);
-            __pyx_t_17 = 0;
-            __pyx_t_17 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_8)); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_GOTREF(__pyx_t_17);
             __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-            __pyx_t_8 = PyTuple_New(8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __pyx_t_8 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_alt); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_8);
-            PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_11);
+            __pyx_t_3 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_xcat); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_3);
+            __pyx_t_3 = 0;
+            __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_phrase, ((PyObject *)__pyx_t_12)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_3);
+            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
+            __pyx_t_12 = PyTuple_New(8); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_GOTREF(__pyx_t_12);
+            PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_11);
             __Pyx_GIVEREF(__pyx_t_11);
-            PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_12);
-            __Pyx_GIVEREF(__pyx_t_12);
-            PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_10);
+            PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_17);
+            __Pyx_GIVEREF(__pyx_t_17);
+            PyTuple_SET_ITEM(__pyx_t_12, 2, __pyx_t_10);
             __Pyx_GIVEREF(__pyx_t_10);
-            PyTuple_SET_ITEM(__pyx_t_8, 3, __pyx_t_3);
-            __Pyx_GIVEREF(__pyx_t_3);
+            PyTuple_SET_ITEM(__pyx_t_12, 3, __pyx_t_8);
+            __Pyx_GIVEREF(__pyx_t_8);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pathlen);
-            PyTuple_SET_ITEM(__pyx_t_8, 4, __pyx_cur_scope->__pyx_v_pathlen);
+            PyTuple_SET_ITEM(__pyx_t_12, 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_8, 5, __pyx_cur_scope->__pyx_v_xnode);
+            PyTuple_SET_ITEM(__pyx_t_12, 5, __pyx_cur_scope->__pyx_v_xnode);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_xnode);
-            PyTuple_SET_ITEM(__pyx_t_8, 6, __pyx_t_17);
-            __Pyx_GIVEREF(__pyx_t_17);
+            PyTuple_SET_ITEM(__pyx_t_12, 6, __pyx_t_3);
+            __Pyx_GIVEREF(__pyx_t_3);
             __Pyx_INCREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
-            PyTuple_SET_ITEM(__pyx_t_8, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
+            PyTuple_SET_ITEM(__pyx_t_12, 7, __pyx_cur_scope->__pyx_v_is_shadow_path);
             __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_is_shadow_path);
             __pyx_t_11 = 0;
-            __pyx_t_12 = 0;
+            __pyx_t_17 = 0;
             __pyx_t_10 = 0;
+            __pyx_t_8 = 0;
             __pyx_t_3 = 0;
-            __pyx_t_17 = 0;
-            __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_8)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-            __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+            __pyx_t_13 = PyList_Append(__pyx_cur_scope->__pyx_v_new_frontier, ((PyObject *)__pyx_t_12)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
           }
           __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-          goto __pyx_L71;
+          goto __pyx_L70;
         }
-        __pyx_L71:;
-        goto __pyx_L67;
+        __pyx_L70:;
+        goto __pyx_L66;
       }
-      __pyx_L67:;
+      __pyx_L66:;
       __pyx_L19_continue:;
     }
     __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1186
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1183
  *                         for (i, alt, pathlen) in frontier_nodes:
  *                             new_frontier.append((k, i, input_match + (i,), alt, pathlen, xnode, phrase +(xcat,), is_shadow_path))
  *             frontier = new_frontier             # <<<<<<<<<<<<<<
@@ -50931,7 +50785,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
     __pyx_cur_scope->__pyx_v_frontier = __pyx_cur_scope->__pyx_v_new_frontier;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1189
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1186
  * 
  *         # Online rule extraction and scoring
  *         if self.online:             # <<<<<<<<<<<<<<
@@ -50940,134 +50794,118 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
  */
   if (__pyx_cur_scope->__pyx_v_self->online) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1190
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1187
  *         # Online rule extraction and scoring
  *         if self.online:
  *             f_syms = tuple(word[0][0] for word in fwords)             # <<<<<<<<<<<<<<
  *             for (f, lex_i, lex_j) in self.get_f_phrases(f_syms):
  *                 spanlen = (lex_j - lex_i) + 1
  */
-    __pyx_t_14 = __pyx_pf_3_sa_23HieroCachingRuleFactory_5input_2genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = __pyx_pf_3_sa_23HieroCachingRuleFactory_5input_2genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
-    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __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 = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     PyTuple_SET_ITEM(__pyx_t_15, 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_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
     __Pyx_GIVEREF(__pyx_t_14);
     __pyx_cur_scope->__pyx_v_f_syms = ((PyObject*)__pyx_t_14);
     __pyx_t_14 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1191
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1188
  *         if self.online:
  *             f_syms = tuple(word[0][0] for word in fwords)
  *             for (f, lex_i, lex_j) in self.get_f_phrases(f_syms):             # <<<<<<<<<<<<<<
  *                 spanlen = (lex_j - lex_i) + 1
  *                 if not sym_isvar(f[0]):
  */
-    __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_f_phrases); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_f_phrases); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
-    __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __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 = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_v_f_syms));
     PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_cur_scope->__pyx_v_f_syms));
     __Pyx_GIVEREF(((PyObject *)__pyx_cur_scope->__pyx_v_f_syms));
-    __pyx_t_8 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_8);
+    __pyx_t_12 = PyObject_Call(__pyx_t_14, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_12);
     __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-    if (PyList_CheckExact(__pyx_t_8) || PyTuple_CheckExact(__pyx_t_8)) {
-      __pyx_t_15 = __pyx_t_8; __Pyx_INCREF(__pyx_t_15); __pyx_t_2 = 0;
+    if (PyList_CheckExact(__pyx_t_12) || PyTuple_CheckExact(__pyx_t_12)) {
+      __pyx_t_15 = __pyx_t_12; __Pyx_INCREF(__pyx_t_15); __pyx_t_2 = 0;
       __pyx_t_22 = NULL;
     } else {
-      __pyx_t_2 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = -1; __pyx_t_15 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __pyx_t_22 = Py_TYPE(__pyx_t_15)->tp_iternext;
     }
-    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
     for (;;) {
       if (!__pyx_t_22 && PyList_CheckExact(__pyx_t_15)) {
         if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_15)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_8 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_2); __Pyx_INCREF(__pyx_t_8); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_8 = PySequence_ITEM(__pyx_t_15, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_12 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
       } else if (!__pyx_t_22 && PyTuple_CheckExact(__pyx_t_15)) {
         if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_15)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_2); __Pyx_INCREF(__pyx_t_8); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_8 = PySequence_ITEM(__pyx_t_15, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_15, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
       } else {
-        __pyx_t_8 = __pyx_t_22(__pyx_t_15);
-        if (unlikely(!__pyx_t_8)) {
+        __pyx_t_12 = __pyx_t_22(__pyx_t_15);
+        if (unlikely(!__pyx_t_12)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
-        __Pyx_GOTREF(__pyx_t_8);
+        __Pyx_GOTREF(__pyx_t_12);
       }
-      if ((likely(PyTuple_CheckExact(__pyx_t_8))) || (PyList_CheckExact(__pyx_t_8))) {
-        PyObject* sequence = __pyx_t_8;
-        #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 = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        }
-        #if CYTHON_COMPILING_IN_CPYTHON
+      if ((likely(PyTuple_CheckExact(__pyx_t_12))) || (PyList_CheckExact(__pyx_t_12))) {
+        PyObject* sequence = __pyx_t_12;
         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 = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_14 = PyTuple_GET_ITEM(sequence, 0); 
-          __pyx_t_17 = PyTuple_GET_ITEM(sequence, 1); 
-          __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
+          __pyx_t_3 = 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[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          }
           __pyx_t_14 = PyList_GET_ITEM(sequence, 0); 
-          __pyx_t_17 = PyList_GET_ITEM(sequence, 1); 
-          __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
+          __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
+          __pyx_t_8 = PyList_GET_ITEM(sequence, 2); 
         }
         __Pyx_INCREF(__pyx_t_14);
-        __Pyx_INCREF(__pyx_t_17);
         __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 = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_17 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __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 = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      } else
-      {
+        __Pyx_INCREF(__pyx_t_8);
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
+      } else {
         Py_ssize_t index = -1;
-        __pyx_t_10 = PyObject_GetIter(__pyx_t_8); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_10 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_10);
-        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
         __pyx_t_19 = Py_TYPE(__pyx_t_10)->tp_iternext;
-        index = 0; __pyx_t_14 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_14)) goto __pyx_L80_unpacking_failed;
+        index = 0; __pyx_t_14 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_14)) goto __pyx_L79_unpacking_failed;
         __Pyx_GOTREF(__pyx_t_14);
-        index = 1; __pyx_t_17 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_17)) goto __pyx_L80_unpacking_failed;
-        __Pyx_GOTREF(__pyx_t_17);
-        index = 2; __pyx_t_3 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_3)) goto __pyx_L80_unpacking_failed;
+        index = 1; __pyx_t_3 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_3)) goto __pyx_L79_unpacking_failed;
         __Pyx_GOTREF(__pyx_t_3);
-        if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_10), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_19 = NULL;
+        index = 2; __pyx_t_8 = __pyx_t_19(__pyx_t_10); if (unlikely(!__pyx_t_8)) goto __pyx_L79_unpacking_failed;
+        __Pyx_GOTREF(__pyx_t_8);
+        if (__Pyx_IternextUnpackEndCheck(__pyx_t_19(__pyx_t_10), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        goto __pyx_L81_unpacking_done;
-        __pyx_L80_unpacking_failed:;
+        goto __pyx_L80_unpacking_done;
+        __pyx_L79_unpacking_failed:;
         __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-        __pyx_t_19 = NULL;
-        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_L81_unpacking_done:;
+        if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+        if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_L80_unpacking_done:;
       }
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_f);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_f);
@@ -51076,216 +50914,208 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
       __pyx_t_14 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_lex_i);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_lex_i);
-      __Pyx_GIVEREF(__pyx_t_17);
-      __pyx_cur_scope->__pyx_v_lex_i = __pyx_t_17;
-      __pyx_t_17 = 0;
-      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_lex_j);
-      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_lex_j);
       __Pyx_GIVEREF(__pyx_t_3);
-      __pyx_cur_scope->__pyx_v_lex_j = __pyx_t_3;
+      __pyx_cur_scope->__pyx_v_lex_i = __pyx_t_3;
       __pyx_t_3 = 0;
+      __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_lex_j);
+      __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_lex_j);
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_cur_scope->__pyx_v_lex_j = __pyx_t_8;
+      __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1192
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1189
  *             f_syms = tuple(word[0][0] for word in fwords)
  *             for (f, lex_i, lex_j) in self.get_f_phrases(f_syms):
  *                 spanlen = (lex_j - lex_i) + 1             # <<<<<<<<<<<<<<
  *                 if not sym_isvar(f[0]):
  *                     spanlen += 1
  */
-      __pyx_t_8 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_lex_j, __pyx_cur_scope->__pyx_v_lex_i); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_lex_j, __pyx_cur_scope->__pyx_v_lex_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
+      __pyx_t_8 = PyNumber_Add(__pyx_t_12, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_3 = PyNumber_Add(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
       __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_spanlen);
       __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_spanlen);
-      __Pyx_GIVEREF(__pyx_t_3);
-      __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_3;
-      __pyx_t_3 = 0;
+      __Pyx_GIVEREF(__pyx_t_8);
+      __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_8;
+      __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1193
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1190
  *             for (f, lex_i, lex_j) in self.get_f_phrases(f_syms):
  *                 spanlen = (lex_j - lex_i) + 1
  *                 if not sym_isvar(f[0]):             # <<<<<<<<<<<<<<
  *                     spanlen += 1
  *                 if not sym_isvar(f[1]):
  */
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_f, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_f, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_t_9 = (!__pyx_f_3_sa_sym_isvar(__pyx_t_7));
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1194
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1191
  *                 spanlen = (lex_j - lex_i) + 1
  *                 if not sym_isvar(f[0]):
  *                     spanlen += 1             # <<<<<<<<<<<<<<
  *                 if not sym_isvar(f[1]):
  *                     spanlen += 1
  */
-        __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_cur_scope->__pyx_v_spanlen, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_8 = PyNumber_InPlaceAdd(__pyx_cur_scope->__pyx_v_spanlen, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
         __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_spanlen);
         __Pyx_DECREF(__pyx_cur_scope->__pyx_v_spanlen);
-        __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_3;
-        __pyx_t_3 = 0;
-        goto __pyx_L82;
+        __Pyx_GIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L81;
       }
-      __pyx_L82:;
+      __pyx_L81:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1195
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1192
  *                 if not sym_isvar(f[0]):
  *                     spanlen += 1
  *                 if not sym_isvar(f[1]):             # <<<<<<<<<<<<<<
  *                     spanlen += 1
  *                 for e in self.phrases_fe.get(f, ()):
  */
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_f, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_3); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_f, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_7 = __Pyx_PyInt_AsInt(__pyx_t_8); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_t_9 = (!__pyx_f_3_sa_sym_isvar(__pyx_t_7));
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1196
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1193
  *                     spanlen += 1
  *                 if not sym_isvar(f[1]):
  *                     spanlen += 1             # <<<<<<<<<<<<<<
  *                 for e in self.phrases_fe.get(f, ()):
  *                     if (f, e) not in seen_phrases:
  */
-        __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_cur_scope->__pyx_v_spanlen, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_3);
+        __pyx_t_8 = PyNumber_InPlaceAdd(__pyx_cur_scope->__pyx_v_spanlen, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_8);
         __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_spanlen);
         __Pyx_DECREF(__pyx_cur_scope->__pyx_v_spanlen);
-        __Pyx_GIVEREF(__pyx_t_3);
-        __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_3;
-        __pyx_t_3 = 0;
-        goto __pyx_L83;
+        __Pyx_GIVEREF(__pyx_t_8);
+        __pyx_cur_scope->__pyx_v_spanlen = __pyx_t_8;
+        __pyx_t_8 = 0;
+        goto __pyx_L82;
       }
-      __pyx_L83:;
+      __pyx_L82:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1197
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1194
  *                 if not sym_isvar(f[1]):
  *                     spanlen += 1
  *                 for e in self.phrases_fe.get(f, ()):             # <<<<<<<<<<<<<<
  *                     if (f, e) not in seen_phrases:
  *                         # Don't add multiple instances of the same phrase here
  */
-      __pyx_t_3 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->phrases_fe, __pyx_n_s__get); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __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[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_self->phrases_fe, __pyx_n_s__get); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
+      __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_12);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_cur_scope->__pyx_v_f);
+      PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_cur_scope->__pyx_v_f);
       __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f);
       __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
-      PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_empty_tuple));
+      PyTuple_SET_ITEM(__pyx_t_12, 1, ((PyObject *)__pyx_empty_tuple));
       __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple));
-      __pyx_t_17 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(__pyx_t_17);
-      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-      if (PyList_CheckExact(__pyx_t_17) || PyTuple_CheckExact(__pyx_t_17)) {
-        __pyx_t_8 = __pyx_t_17; __Pyx_INCREF(__pyx_t_8); __pyx_t_24 = 0;
-        __pyx_t_30 = NULL;
+      __pyx_t_3 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __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_12)); __pyx_t_12 = 0;
+      if (PyList_CheckExact(__pyx_t_3) || PyTuple_CheckExact(__pyx_t_3)) {
+        __pyx_t_12 = __pyx_t_3; __Pyx_INCREF(__pyx_t_12); __pyx_t_6 = 0;
+        __pyx_t_24 = NULL;
       } else {
-        __pyx_t_24 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_17); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_30 = Py_TYPE(__pyx_t_8)->tp_iternext;
+        __pyx_t_6 = -1; __pyx_t_12 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_12);
+        __pyx_t_24 = Py_TYPE(__pyx_t_12)->tp_iternext;
       }
-      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       for (;;) {
-        if (!__pyx_t_30 && PyList_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_24 >= PyList_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_17 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_24); __Pyx_INCREF(__pyx_t_17); __pyx_t_24++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_17 = PySequence_ITEM(__pyx_t_8, __pyx_t_24); __pyx_t_24++; if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
-        } else if (!__pyx_t_30 && PyTuple_CheckExact(__pyx_t_8)) {
-          if (__pyx_t_24 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_17 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_24); __Pyx_INCREF(__pyx_t_17); __pyx_t_24++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_17 = PySequence_ITEM(__pyx_t_8, __pyx_t_24); __pyx_t_24++; if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+        if (!__pyx_t_24 && PyList_CheckExact(__pyx_t_12)) {
+          if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_12)) break;
+          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_12, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
+        } else if (!__pyx_t_24 && PyTuple_CheckExact(__pyx_t_12)) {
+          if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_12)) break;
+          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_12, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++;
         } else {
-          __pyx_t_17 = __pyx_t_30(__pyx_t_8);
-          if (unlikely(!__pyx_t_17)) {
+          __pyx_t_3 = __pyx_t_24(__pyx_t_12);
+          if (unlikely(!__pyx_t_3)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
-          __Pyx_GOTREF(__pyx_t_17);
+          __Pyx_GOTREF(__pyx_t_3);
         }
         __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_e);
         __Pyx_XDECREF(__pyx_cur_scope->__pyx_v_e);
-        __Pyx_GIVEREF(__pyx_t_17);
-        __pyx_cur_scope->__pyx_v_e = __pyx_t_17;
-        __pyx_t_17 = 0;
+        __Pyx_GIVEREF(__pyx_t_3);
+        __pyx_cur_scope->__pyx_v_e = __pyx_t_3;
+        __pyx_t_3 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1198
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1195
  *                     spanlen += 1
  *                 for e in self.phrases_fe.get(f, ()):
  *                     if (f, e) not in seen_phrases:             # <<<<<<<<<<<<<<
  *                         # Don't add multiple instances of the same phrase here
  *                         seen_phrases.add((f, e))
  */
-        __pyx_t_17 = PyTuple_New(2); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(__pyx_t_17);
+        __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_3);
         __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-        PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_cur_scope->__pyx_v_f);
+        PyTuple_SET_ITEM(__pyx_t_3, 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_17, 1, __pyx_cur_scope->__pyx_v_e);
+        PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_cur_scope->__pyx_v_e);
         __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-        __pyx_t_9 = (__Pyx_PySequence_Contains(((PyObject *)__pyx_t_17), ((PyObject *)__pyx_cur_scope->__pyx_v_seen_phrases), Py_NE)); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
+        __pyx_t_9 = (__Pyx_NegateNonNeg(PySequence_Contains(((PyObject *)__pyx_cur_scope->__pyx_v_seen_phrases), ((PyObject *)__pyx_t_3)))); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1200
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1197
  *                     if (f, e) not in seen_phrases:
  *                         # Don't add multiple instances of the same phrase here
  *                         seen_phrases.add((f, e))             # <<<<<<<<<<<<<<
  *                         scores = self.scorer.score(FeatureContext(
  *                                 f, e, 0, 0, 0,
  */
-          __pyx_t_17 = PyTuple_New(2); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_17);
+          __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
-          PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_cur_scope->__pyx_v_f);
+          PyTuple_SET_ITEM(__pyx_t_3, 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_17, 1, __pyx_cur_scope->__pyx_v_e);
+          PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_cur_scope->__pyx_v_e);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-          __pyx_t_13 = PySet_Add(__pyx_cur_scope->__pyx_v_seen_phrases, ((PyObject *)__pyx_t_17)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_DECREF(((PyObject *)__pyx_t_17)); __pyx_t_17 = 0;
+          __pyx_t_13 = PySet_Add(__pyx_cur_scope->__pyx_v_seen_phrases, ((PyObject *)__pyx_t_3)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1201
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1198
  *                         # Don't add multiple instances of the same phrase here
  *                         seen_phrases.add((f, e))
  *                         scores = self.scorer.score(FeatureContext(             # <<<<<<<<<<<<<<
  *                                 f, e, 0, 0, 0,
  *                                 spanlen, None, None,
  */
-          __pyx_t_17 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_17)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_17);
+          __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__FeatureContext); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_3);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1206
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1203
  *                                 fwords, self.fda, self.eda,
  *                                 meta,
  *                                 self.online_ctx_lookup(f, e)))             # <<<<<<<<<<<<<<
  *                         alignment = self.phrases_al[f][e]
  *                         yield Rule(self.category, f, e, scores, alignment)
  */
-          __pyx_t_3 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__online_ctx_lookup); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          __Pyx_GOTREF(__pyx_t_3);
-          __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__online_ctx_lookup); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __Pyx_GOTREF(__pyx_t_8);
+          __pyx_t_14 = PyTuple_New(2); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
           PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_f);
@@ -51293,11 +51123,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e);
           PyTuple_SET_ITEM(__pyx_t_14, 1, __pyx_cur_scope->__pyx_v_e);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e);
-          __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-          __pyx_t_14 = PyTuple_New(13); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyTuple_New(13); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f);
           PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_f);
@@ -51338,11 +51168,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           PyTuple_SET_ITEM(__pyx_t_14, 12, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(__pyx_t_17, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
+          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
-          __pyx_t_14 = ((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_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = ((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_10)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           __Pyx_XGOTREF(((PyObject *)__pyx_cur_scope->__pyx_v_scores));
@@ -51351,16 +51181,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_14);
           __pyx_t_14 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1207
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1204
  *                                 meta,
  *                                 self.online_ctx_lookup(f, e)))
  *                         alignment = self.phrases_al[f][e]             # <<<<<<<<<<<<<<
  *                         yield Rule(self.category, f, e, scores, alignment)
  * 
  */
-          __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_cur_scope->__pyx_v_f); if (!__pyx_t_14) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
-          __pyx_t_10 = PyObject_GetItem(__pyx_t_14, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_GetItem(__pyx_t_14, __pyx_cur_scope->__pyx_v_e); if (!__pyx_t_10) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
           __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_alignment);
@@ -51369,16 +51199,16 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           __pyx_cur_scope->__pyx_v_alignment = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1208
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1205
  *                                 self.online_ctx_lookup(f, e)))
  *                         alignment = self.phrases_al[f][e]
  *                         yield Rule(self.category, f, e, scores, alignment)             # <<<<<<<<<<<<<<
  * 
  *         stop_time = monitor_cpu()
  */
-          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->category); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
-          __pyx_t_14 = PyTuple_New(5); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_14 = PyTuple_New(5); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_14);
           PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_10);
           __Pyx_GIVEREF(__pyx_t_10);
@@ -51395,165 +51225,165 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
           PyTuple_SET_ITEM(__pyx_t_14, 4, __pyx_cur_scope->__pyx_v_alignment);
           __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_alignment);
           __pyx_t_10 = 0;
-          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Rule)), ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
           __pyx_r = __pyx_t_10;
           __pyx_t_10 = 0;
           __pyx_cur_scope->__pyx_t_0 = __pyx_t_2;
-          __Pyx_XGIVEREF(__pyx_t_8);
-          __pyx_cur_scope->__pyx_t_3 = __pyx_t_8;
+          __pyx_cur_scope->__pyx_t_1 = __pyx_t_6;
+          __Pyx_XGIVEREF(__pyx_t_12);
+          __pyx_cur_scope->__pyx_t_2 = __pyx_t_12;
           __Pyx_XGIVEREF(__pyx_t_15);
-          __pyx_cur_scope->__pyx_t_4 = __pyx_t_15;
-          __pyx_cur_scope->__pyx_t_10 = __pyx_t_22;
-          __pyx_cur_scope->__pyx_t_1 = __pyx_t_24;
-          __pyx_cur_scope->__pyx_t_11 = __pyx_t_30;
+          __pyx_cur_scope->__pyx_t_3 = __pyx_t_15;
+          __pyx_cur_scope->__pyx_t_5 = __pyx_t_22;
+          __pyx_cur_scope->__pyx_t_7 = __pyx_t_24;
           __Pyx_XGIVEREF(__pyx_r);
           __Pyx_RefNannyFinishContext();
           /* return from generator, yielding value */
           __pyx_generator->resume_label = 2;
           return __pyx_r;
-          __pyx_L87_resume_from_yield:;
+          __pyx_L86_resume_from_yield:;
           __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
-          __pyx_t_8 = __pyx_cur_scope->__pyx_t_3;
+          __pyx_t_6 = __pyx_cur_scope->__pyx_t_1;
+          __pyx_t_12 = __pyx_cur_scope->__pyx_t_2;
+          __pyx_cur_scope->__pyx_t_2 = 0;
+          __Pyx_XGOTREF(__pyx_t_12);
+          __pyx_t_15 = __pyx_cur_scope->__pyx_t_3;
           __pyx_cur_scope->__pyx_t_3 = 0;
-          __Pyx_XGOTREF(__pyx_t_8);
-          __pyx_t_15 = __pyx_cur_scope->__pyx_t_4;
-          __pyx_cur_scope->__pyx_t_4 = 0;
           __Pyx_XGOTREF(__pyx_t_15);
-          __pyx_t_22 = __pyx_cur_scope->__pyx_t_10;
-          __pyx_t_24 = __pyx_cur_scope->__pyx_t_1;
-          __pyx_t_30 = __pyx_cur_scope->__pyx_t_11;
-          if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          goto __pyx_L86;
+          __pyx_t_22 = __pyx_cur_scope->__pyx_t_5;
+          __pyx_t_24 = __pyx_cur_scope->__pyx_t_7;
+          if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          goto __pyx_L85;
         }
-        __pyx_L86:;
+        __pyx_L85:;
       }
-      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
     }
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-    goto __pyx_L77;
+    goto __pyx_L76;
   }
-  __pyx_L77:;
+  __pyx_L76:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1210
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1207
  *                         yield Rule(self.category, f, e, scores, alignment)
  * 
  *         stop_time = monitor_cpu()             # <<<<<<<<<<<<<<
  *         logger.info("Total time for rule lookup, extraction, and scoring = %f seconds", (stop_time - start_time))
  *         gc.collect()
  */
-  __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__monitor_cpu); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_15);
-  __pyx_t_8 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_12 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-  __Pyx_GIVEREF(__pyx_t_8);
-  __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_8;
-  __pyx_t_8 = 0;
+  __Pyx_GIVEREF(__pyx_t_12);
+  __pyx_cur_scope->__pyx_v_stop_time = __pyx_t_12;
+  __pyx_t_12 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1211
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1208
  * 
  *         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_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_15 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __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 = 1208; __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 = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_15);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_start_time); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_8); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
+  __pyx_t_10 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_stop_time, __pyx_t_12); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_125));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_125));
-  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __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 = 1208; __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_10);
   __Pyx_GIVEREF(__pyx_t_10);
   __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1212
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1209
  *         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)
  *         logger.info("    Intersect time = %f seconds", self.intersect_time)
  */
-  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__gc); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__collect); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__collect); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1213
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1210
  *         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)             # <<<<<<<<<<<<<<
  *         logger.info("    Intersect time = %f seconds", self.intersect_time)
  * 
  */
-  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __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[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_12 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __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 = 1213; __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 = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = PyTuple_New(2); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __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));
+  __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_10);
   __Pyx_GIVEREF(__pyx_t_10);
   __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_12, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1214
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1211
  *         gc.collect()
  *         logger.info("    Extract time = %f seconds", self.extract_time)
  *         logger.info("    Intersect time = %f seconds", self.intersect_time)             # <<<<<<<<<<<<<<
  * 
  * 
  */
-  __pyx_t_10 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1214; __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[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_15 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_15 = PyObject_GetAttr(__pyx_t_10, __pyx_n_s__info); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_15);
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
-  __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->intersect_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyFloat_FromDouble(__pyx_cur_scope->__pyx_v_self->intersect_time); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
-  __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_8);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_127));
-  PyTuple_SET_ITEM(__pyx_t_8, 0, ((PyObject *)__pyx_kp_s_127));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_127));
-  PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_10);
+  __pyx_t_12 = PyTuple_New(2); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_12);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_126));
+  PyTuple_SET_ITEM(__pyx_t_12, 0, ((PyObject *)__pyx_kp_s_126));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_126));
+  PyTuple_SET_ITEM(__pyx_t_12, 1, __pyx_t_10);
   __Pyx_GIVEREF(__pyx_t_10);
   __pyx_t_10 = 0;
-  __pyx_t_10 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_10);
   __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
+  __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
   __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
   PyErr_SetNone(PyExc_StopIteration);
   goto __pyx_L0;
@@ -51573,12 +51403,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_24generator4(__pyx_Gene
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1217
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1214
  * 
  * 
  *     cdef int find_fixpoint(self,             # <<<<<<<<<<<<<<
@@ -51608,7 +51437,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("find_fixpoint", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1232
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1229
  *         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             # <<<<<<<<<<<<<<
@@ -51617,7 +51446,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_low[0]) = __pyx_v_e_in_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1233
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1230
  * 
  *         e_low[0] = e_in_low
  *         e_high[0] = e_in_high             # <<<<<<<<<<<<<<
@@ -51626,19 +51455,19 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_e_high[0]) = __pyx_v_e_in_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1234
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1231
  *         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 = 1234; __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 = 1234; __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 = 1231; __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 = 1231; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1235
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1232
  *         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:             # <<<<<<<<<<<<<<
@@ -51648,7 +51477,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1241
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1238
  *             # rule X -> X_1 w X_2 / X_1 X_2.    This is probably
  *             # not worth the bother, though.
  *             return 0             # <<<<<<<<<<<<<<
@@ -51660,7 +51489,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L3;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1242
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1239
  *             # not worth the bother, though.
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:             # <<<<<<<<<<<<<<
@@ -51676,7 +51505,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_5) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1243
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1240
  *             return 0
  *         elif e_in_low != -1 and e_low[0] != e_in_low:
  *             if e_in_low - e_low[0] < min_ex_size:             # <<<<<<<<<<<<<<
@@ -51686,7 +51515,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1244
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1241
  *         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             # <<<<<<<<<<<<<<
@@ -51695,7 +51524,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1245
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1242
  *             if e_in_low - e_low[0] < min_ex_size:
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -51705,7 +51534,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1246
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1243
  *                 e_low[0] = e_in_low - min_ex_size
  *                 if e_low[0] < 0:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -51724,7 +51553,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1248
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1245
  *                     return 0
  * 
  *         if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -51734,7 +51563,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1249
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1246
  * 
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0             # <<<<<<<<<<<<<<
@@ -51746,7 +51575,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     goto __pyx_L6;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1250
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1247
  *         if e_high[0] - e_low[0] > max_e_len:
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:             # <<<<<<<<<<<<<<
@@ -51762,7 +51591,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   if (__pyx_t_4) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1251
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1248
  *             return 0
  *         elif e_in_high != -1 and e_high[0] != e_in_high:
  *             if e_high[0] - e_in_high < min_ex_size:             # <<<<<<<<<<<<<<
@@ -51772,7 +51601,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1252
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1249
  *         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             # <<<<<<<<<<<<<<
@@ -51781,7 +51610,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1253
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1250
  *             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:             # <<<<<<<<<<<<<<
@@ -51791,7 +51620,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1254
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1251
  *                 e_high[0] = e_in_high + min_ex_size
  *                 if e_high[0] > e_sent_len:
  *                     return 0             # <<<<<<<<<<<<<<
@@ -51810,7 +51639,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   }
   __pyx_L6:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1256
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1253
  *                     return 0
  * 
  *         f_back_low[0] = -1             # <<<<<<<<<<<<<<
@@ -51819,7 +51648,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_low[0]) = -1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1257
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1254
  * 
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1             # <<<<<<<<<<<<<<
@@ -51828,7 +51657,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   (__pyx_v_f_back_high[0]) = -1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1258
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1255
  *         f_back_low[0] = -1
  *         f_back_high[0] = -1
  *         f_low_prev = f_low             # <<<<<<<<<<<<<<
@@ -51837,17 +51666,17 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_f_low_prev = __pyx_v_f_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1259
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1256
  *         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 = 1259; __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 = 1256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_v_f_high_prev = __pyx_t_1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1260
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1257
  *         f_low_prev = f_low
  *         f_high_prev = f_high
  *         new_x = 0             # <<<<<<<<<<<<<<
@@ -51856,7 +51685,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_x = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1261
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1258
  *         f_high_prev = f_high
  *         new_x = 0
  *         new_low_x = 0             # <<<<<<<<<<<<<<
@@ -51865,7 +51694,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_low_x = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1262
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1259
  *         new_x = 0
  *         new_low_x = 0
  *         new_high_x = 0             # <<<<<<<<<<<<<<
@@ -51874,7 +51703,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
   __pyx_v_new_high_x = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1264
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1261
  *         new_high_x = 0
  * 
  *         while True:             # <<<<<<<<<<<<<<
@@ -51884,7 +51713,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   while (1) {
     if (!1) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1266
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1263
  *         while True:
  * 
  *             if f_back_low[0] == -1:             # <<<<<<<<<<<<<<
@@ -51894,45 +51723,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1267
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1264
  * 
  *             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 = 1267; __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 = 1264; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1269
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1266
  *                 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 = 1269; __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 = 1266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1270
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1267
  *             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 = 1270; __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 = 1267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     }
     __pyx_L11:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1272
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1269
  *                 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:             # <<<<<<<<<<<<<<
@@ -51942,7 +51771,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1273
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1270
  * 
  *             if f_back_low[0] > f_low:
  *                 f_back_low[0] = f_low             # <<<<<<<<<<<<<<
@@ -51954,35 +51783,36 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L12:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1275
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1272
  *                 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 = 1275; __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 = 1272; __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 = 1275; __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 = 1272; __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 = 1275; __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 = 1272; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1276
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1273
  * 
  *             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 = 1276; __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 = 1273; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       (__pyx_v_f_back_high[0]) = __pyx_t_1;
       goto __pyx_L13;
     }
     __pyx_L13:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1278
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1275
  *                 f_back_high[0] = f_high
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:             # <<<<<<<<<<<<<<
@@ -51998,12 +51828,12 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1279
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1276
  * 
  *             if f_back_low[0] == f_low_prev and f_back_high[0] == f_high_prev:
  *                 return 1             # <<<<<<<<<<<<<<
  * 
- *             # print >> sys.stderr, "continue 1", f_back_low[0], f_back_high[0], f_low, f_high
+ *             if allow_low_x == 0 and f_back_low[0] < f_low:
  */
       __pyx_r = 1;
       goto __pyx_L0;
@@ -52011,8 +51841,8 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1283
- *             # print >> sys.stderr, "continue 1", f_back_low[0], f_back_high[0], f_low, f_high
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1278
+ *                 return 1
  * 
  *             if allow_low_x == 0 and f_back_low[0] < f_low:             # <<<<<<<<<<<<<<
  *                 # FAIL: f phrase is not tight
@@ -52027,7 +51857,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1285
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1280
  *             if allow_low_x == 0 and f_back_low[0] < f_low:
  *                 # FAIL: f phrase is not tight
  *                 return 0             # <<<<<<<<<<<<<<
@@ -52040,18 +51870,18 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1287
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1282
  *                 return 0
  * 
  *             if f_back_high[0] - f_back_low[0] > max_f_len:             # <<<<<<<<<<<<<<
- *                 # print >> sys.stderr, "iese aici"
  *                 # FAIL: f back projection is too wide
+ *                 return 0
  */
     __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1290
- *                 # print >> sys.stderr, "iese aici"
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1284
+ *             if f_back_high[0] - f_back_low[0] > max_f_len:
  *                 # FAIL: f back projection is too wide
  *                 return 0             # <<<<<<<<<<<<<<
  * 
@@ -52063,7 +51893,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1292
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1286
  *                 return 0
  * 
  *             if allow_high_x == 0 and f_back_high[0] > f_high:             # <<<<<<<<<<<<<<
@@ -52072,11 +51902,12 @@ 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 = 1292; __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 = 1286; __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 = 1292; __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 = 1286; __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 = 1292; __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 = 1286; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __pyx_t_4 = __pyx_t_3;
     } else {
@@ -52084,7 +51915,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1294
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1288
  *             if allow_high_x == 0 and f_back_high[0] > f_high:
  *                 # FAIL: extension on high side not allowed
  *                 return 0             # <<<<<<<<<<<<<<
@@ -52097,7 +51928,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1296
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1290
  *                 return 0
  * 
  *             if f_low != f_back_low[0]:             # <<<<<<<<<<<<<<
@@ -52107,7 +51938,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1297
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1291
  * 
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:             # <<<<<<<<<<<<<<
@@ -52117,7 +51948,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1298
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1292
  *             if f_low != f_back_low[0]:
  *                 if new_low_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -52127,7 +51958,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1300
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1294
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on low side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52140,7 +51971,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1302
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1296
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -52149,7 +51980,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1303
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1297
  *                     else:
  *                         new_x = new_x + 1
  *                         new_low_x = 1             # <<<<<<<<<<<<<<
@@ -52163,7 +51994,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L19:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1304
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1298
  *                         new_x = new_x + 1
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:             # <<<<<<<<<<<<<<
@@ -52173,7 +52004,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1305
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1299
  *                         new_low_x = 1
  *                 if f_low - f_back_low[0] < min_fx_size:
  *                     f_back_low[0] = f_low - min_fx_size             # <<<<<<<<<<<<<<
@@ -52182,7 +52013,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1306
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1300
  *                 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:             # <<<<<<<<<<<<<<
@@ -52192,7 +52023,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1308
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1302
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52205,7 +52036,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L22:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1309
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1303
  *                         # FAIL: extension required on low side violates max initial length
  *                         return 0
  *                     if f_back_low[0] < 0:             # <<<<<<<<<<<<<<
@@ -52215,7 +52046,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1311
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1305
  *                     if f_back_low[0] < 0:
  *                         # FAIL: extension required on low side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52234,22 +52065,23 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L18:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1313
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1307
  *                         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 = 1313; __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 = 1307; __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 = 1313; __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 = 1307; __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 = 1313; __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 = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1314
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1308
  * 
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:             # <<<<<<<<<<<<<<
@@ -52259,7 +52091,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1315
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1309
  *             if f_high != f_back_high[0]:
  *                 if new_high_x == 0:
  *                     if new_x >= max_new_x:             # <<<<<<<<<<<<<<
@@ -52269,7 +52101,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1317
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1311
  *                     if new_x >= max_new_x:
  *                         # FAIL: extension required on high side violates max # of gaps
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52282,7 +52114,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         /*else*/ {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1319
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1313
  *                         return 0
  *                     else:
  *                         new_x = new_x + 1             # <<<<<<<<<<<<<<
@@ -52291,7 +52123,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
           __pyx_v_new_x = (__pyx_v_new_x + 1);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1320
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1314
  *                     else:
  *                         new_x = new_x + 1
  *                         new_high_x = 1             # <<<<<<<<<<<<<<
@@ -52305,44 +52137,45 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
       }
       __pyx_L25:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1321
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1315
  *                         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 = 1321; __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 = 1315; __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 = 1321; __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 = 1315; __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 = 1321; __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 = 1315; __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 = 1321; __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 = 1315; __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 = 1321; __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 = 1315; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1322
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1316
  *                         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 = 1322; __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 = 1316; __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 = 1322; __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 = 1316; __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 = 1322; __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 = 1316; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1323
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1317
  *                 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:             # <<<<<<<<<<<<<<
@@ -52352,7 +52185,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1325
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1319
  *                     if f_back_high[0] - f_back_low[0] > max_f_len:
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52365,7 +52198,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
         }
         __pyx_L28:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1326
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1320
  *                         # FAIL: extension required on high side violates max initial length
  *                         return 0
  *                     if f_back_high[0] > f_sent_len:             # <<<<<<<<<<<<<<
@@ -52375,7 +52208,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1328
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1322
  *                     if f_back_high[0] > f_sent_len:
  *                         # FAIL: extension required on high side violates sentence boundary
  *                         return 0             # <<<<<<<<<<<<<<
@@ -52394,7 +52227,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L24:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1330
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1324
  *                         return 0
  * 
  *             e_low_prev = e_low[0]             # <<<<<<<<<<<<<<
@@ -52403,7 +52236,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_low_prev = (__pyx_v_e_low[0]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1331
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1325
  * 
  *             e_low_prev = e_low[0]
  *             e_high_prev = e_high[0]             # <<<<<<<<<<<<<<
@@ -52412,29 +52245,29 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
  */
     __pyx_v_e_high_prev = (__pyx_v_e_high[0]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1333
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1327
  *             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 = 1333; __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 = 1327; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1334
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1328
  * 
  *             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 = 1334; __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 = 1328; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1335
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1329
  *             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:             # <<<<<<<<<<<<<<
@@ -52450,7 +52283,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     if (__pyx_t_3) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1336
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1330
  *             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             # <<<<<<<<<<<<<<
@@ -52463,7 +52296,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L30:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1337
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1331
  *             if e_low[0] == e_low_prev and e_high[0] == e_high_prev:
  *                 return 1
  *             if allow_arbitrary_x == 0:             # <<<<<<<<<<<<<<
@@ -52473,7 +52306,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1339
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1333
  *             if allow_arbitrary_x == 0:
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0             # <<<<<<<<<<<<<<
@@ -52486,7 +52319,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L31:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1340
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1334
  *                 # FAIL: arbitrary expansion not permitted
  *                 return 0
  *             if e_high[0] - e_low[0] > max_e_len:             # <<<<<<<<<<<<<<
@@ -52496,7 +52329,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1342
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1336
  *             if e_high[0] - e_low[0] > max_e_len:
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0             # <<<<<<<<<<<<<<
@@ -52509,7 +52342,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
     }
     __pyx_L32:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1343
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1337
  *                 # FAIL: re-projection violates sentence max phrase length
  *                 return 0
  *             f_low_prev = f_back_low[0]             # <<<<<<<<<<<<<<
@@ -52518,7 +52351,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1344
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1338
  *                 return 0
  *             f_low_prev = f_back_low[0]
  *             f_high_prev = f_back_high[0]             # <<<<<<<<<<<<<<
@@ -52541,7 +52374,7 @@ static int __pyx_f_3_sa_23HieroCachingRuleFactory_find_fixpoint(struct __pyx_obj
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1347
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1341
  * 
  * 
  *     cdef find_projection(self, int in_low, int in_high, int* in_links_low, int* in_links_high,             # <<<<<<<<<<<<<<
@@ -52559,7 +52392,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   int __pyx_t_4;
   __Pyx_RefNannySetupContext("find_projection", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1350
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1344
  *                         int* out_low, int* out_high):
  *         cdef int i
  *         for i from in_low <= i < in_high:             # <<<<<<<<<<<<<<
@@ -52569,7 +52402,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++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1351
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1345
  *         cdef int i
  *         for i from in_low <= i < in_high:
  *             if in_links_low[i] != -1:             # <<<<<<<<<<<<<<
@@ -52579,7 +52412,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) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1352
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1346
  *         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]:             # <<<<<<<<<<<<<<
@@ -52595,7 +52428,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_4) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1353
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1347
  *             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]             # <<<<<<<<<<<<<<
@@ -52607,7 +52440,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       __pyx_L6:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1354
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1348
  *                 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]:             # <<<<<<<<<<<<<<
@@ -52623,7 +52456,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
       }
       if (__pyx_t_3) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1355
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1349
  *                     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]             # <<<<<<<<<<<<<<
@@ -52645,7 +52478,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_find_projection(CYTHON_U
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1358
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1352
  * 
  * 
  *     cdef int* int_arr_extend(self, int* arr, int* arr_len, int* data, int data_len):             # <<<<<<<<<<<<<<
@@ -52659,7 +52492,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("int_arr_extend", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1360
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1354
  *     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             # <<<<<<<<<<<<<<
@@ -52668,7 +52501,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1361
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1355
  *         cdef int new_len
  *         new_len = arr_len[0] + data_len
  *         arr = <int*> realloc(arr, new_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -52677,7 +52510,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)))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1362
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1356
  *         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))             # <<<<<<<<<<<<<<
@@ -52686,7 +52519,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))));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1363
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1357
  *         arr = <int*> realloc(arr, new_len*sizeof(int))
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len             # <<<<<<<<<<<<<<
@@ -52695,7 +52528,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
  */
   (__pyx_v_arr_len[0]) = __pyx_v_new_len;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1364
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1358
  *         memcpy(arr+arr_len[0], data, data_len*sizeof(int))
  *         arr_len[0] = new_len
  *         return arr             # <<<<<<<<<<<<<<
@@ -52711,7 +52544,7 @@ static int *__pyx_f_3_sa_23HieroCachingRuleFactory_int_arr_extend(CYTHON_UNUSED
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1367
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1361
  * 
  * 
  *     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,             # <<<<<<<<<<<<<<
@@ -52757,19 +52590,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract_phrases", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1375
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1369
  *         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 = 1375; __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 = 1369; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_result = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1376
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1370
  * 
  *         result = []
  *         len1 = 0             # <<<<<<<<<<<<<<
@@ -52778,7 +52611,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1377
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1371
  *         result = []
  *         len1 = 0
  *         e_gaps1 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -52787,19 +52620,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = ((int *)malloc(0));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1378
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1372
  *         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 = 1378; __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 = 1372; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1380
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1374
  *         ephr_arr = IntList()
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))             # <<<<<<<<<<<<<<
@@ -52808,7 +52641,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1381
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1375
  * 
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:             # <<<<<<<<<<<<<<
@@ -52818,7 +52651,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (__pyx_v_num_gaps > 0);
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1382
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1376
  *         e_gap_order = <int*> malloc(num_gaps*sizeof(int))
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0             # <<<<<<<<<<<<<<
@@ -52827,7 +52660,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     (__pyx_v_e_gap_order[0]) = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1383
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1377
  *         if num_gaps > 0:
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -52837,7 +52670,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1384
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1378
  *             e_gap_order[0] = 0
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:             # <<<<<<<<<<<<<<
@@ -52847,7 +52680,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1385
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1379
  *             for i from 1 <= i < num_gaps:
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -52857,7 +52690,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1386
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1380
  *                 for j from 0 <= j < i:
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:             # <<<<<<<<<<<<<<
@@ -52867,7 +52700,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1387
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1381
  *                     if e_gap_low[i] < e_gap_low[j]:
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]             # <<<<<<<<<<<<<<
@@ -52877,7 +52710,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1388
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1382
  *                         for k from j <= k < i:
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i             # <<<<<<<<<<<<<<
@@ -52886,7 +52719,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
           (__pyx_v_e_gap_order[__pyx_v_j]) = __pyx_v_i;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1389
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1383
  *                             e_gap_order[k+1] = e_gap_order[k]
  *                         e_gap_order[j] = i
  *                         break             # <<<<<<<<<<<<<<
@@ -52900,7 +52733,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1391
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1385
  *                         break
  *                 else:
  *                     e_gap_order[i] = i             # <<<<<<<<<<<<<<
@@ -52915,7 +52748,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1393
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1387
  *                     e_gap_order[i] = i
  * 
  *         e_x_low = e_low             # <<<<<<<<<<<<<<
@@ -52924,7 +52757,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_low = __pyx_v_e_low;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1394
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1388
  * 
  *         e_x_low = e_low
  *         e_x_high = e_high             # <<<<<<<<<<<<<<
@@ -52933,7 +52766,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_x_high = __pyx_v_e_high;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1395
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1389
  *         e_x_low = e_low
  *         e_x_high = e_high
  *         if not self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -52943,7 +52776,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   __pyx_t_2 = (!__pyx_v_self->tight_phrases);
   if (__pyx_t_2) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1396
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1390
  *         e_x_high = e_high
  *         if not self.tight_phrases:
  *             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:             # <<<<<<<<<<<<<<
@@ -52966,7 +52799,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_6) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1397
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1391
  *         if not self.tight_phrases:
  *             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             # <<<<<<<<<<<<<<
@@ -52976,7 +52809,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_e_x_low = (__pyx_v_e_x_low - 1);
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1398
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1392
  *             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:             # <<<<<<<<<<<<<<
@@ -52999,7 +52832,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (!__pyx_t_2) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1399
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1393
  *                 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             # <<<<<<<<<<<<<<
@@ -53012,7 +52845,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   }
   __pyx_L11:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1401
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1395
  *                 e_x_high = e_x_high + 1
  * 
  *         for i from e_x_low <= i <= e_low:             # <<<<<<<<<<<<<<
@@ -53022,7 +52855,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1402
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1396
  * 
  *         for i from e_x_low <= i <= e_low:
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)             # <<<<<<<<<<<<<<
@@ -53032,7 +52865,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1404
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1398
  *             e_gaps1 = self.int_arr_extend(e_gaps1, &len1, &i, 1)
  * 
  *         for i from 0 <= i < num_gaps:             # <<<<<<<<<<<<<<
@@ -53042,7 +52875,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1405
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1399
  * 
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -53051,7 +52884,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1406
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1400
  *         for i from 0 <= i < num_gaps:
  *             e_gaps2 = <int*> malloc(0)
  *             len2 = 0             # <<<<<<<<<<<<<<
@@ -53060,7 +52893,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_len2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1408
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1402
  *             len2 = 0
  * 
  *             j = e_gap_order[i]             # <<<<<<<<<<<<<<
@@ -53069,7 +52902,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = (__pyx_v_e_gap_order[__pyx_v_i]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1409
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1403
  * 
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]             # <<<<<<<<<<<<<<
@@ -53078,7 +52911,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1410
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1404
  *             j = e_gap_order[i]
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]             # <<<<<<<<<<<<<<
@@ -53087,7 +52920,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1411
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1405
  *             e_x_gap_low = e_gap_low[j]
  *             e_x_gap_high = e_gap_high[j]
  *             if not self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -53097,7 +52930,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_t_2 = (!__pyx_v_self->tight_phrases);
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1412
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1406
  *             e_x_gap_high = e_gap_high[j]
  *             if not self.tight_phrases:
  *                 while e_x_gap_low > e_x_low and e_links_low[e_x_gap_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -53114,7 +52947,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_7) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1413
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1407
  *             if not self.tight_phrases:
  *                 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             # <<<<<<<<<<<<<<
@@ -53124,7 +52957,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1414
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1408
  *                 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:             # <<<<<<<<<<<<<<
@@ -53141,7 +52974,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         }
         if (!__pyx_t_6) break;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1415
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1409
  *                     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             # <<<<<<<<<<<<<<
@@ -53154,7 +52987,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     __pyx_L20:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1417
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1411
  *                     e_x_gap_high = e_x_gap_high + 1
  * 
  *             k = 0             # <<<<<<<<<<<<<<
@@ -53163,7 +52996,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_k = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1418
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1412
  * 
  *             k = 0
  *             step = 1+(i*2)             # <<<<<<<<<<<<<<
@@ -53172,7 +53005,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_step = (1 + (__pyx_v_i * 2));
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1419
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1413
  *             k = 0
  *             step = 1+(i*2)
  *             while k < len1:             # <<<<<<<<<<<<<<
@@ -53183,7 +53016,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1420
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1414
  *             step = 1+(i*2)
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:             # <<<<<<<<<<<<<<
@@ -53193,7 +53026,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1421
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1415
  *             while k < len1:
  *                 for m from e_x_gap_low <= m <= e_gap_low[j]:
  *                     if m >= e_gaps1[k+step-1]:             # <<<<<<<<<<<<<<
@@ -53203,7 +53036,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1422
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1416
  *                 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:             # <<<<<<<<<<<<<<
@@ -53213,7 +53046,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1423
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1417
  *                     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             # <<<<<<<<<<<<<<
@@ -53223,7 +53056,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1424
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1418
  *                         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)             # <<<<<<<<<<<<<<
@@ -53232,7 +53065,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1425
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1419
  *                             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)             # <<<<<<<<<<<<<<
@@ -53241,7 +53074,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1426
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1420
  *                                 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)             # <<<<<<<<<<<<<<
@@ -53258,7 +53091,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
         __pyx_L29:;
       }
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1427
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1421
  *                                 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             # <<<<<<<<<<<<<<
@@ -53268,7 +53101,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_v_k = (__pyx_v_k + __pyx_v_step);
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1428
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1422
  *                                 e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &n, 1)
  *                 k = k + step
  *             free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -53277,7 +53110,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     free(__pyx_v_e_gaps1);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1429
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1423
  *                 k = k + step
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -53286,7 +53119,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1430
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1424
  *             free(e_gaps1)
  *             e_gaps1 = e_gaps2
  *             len1 = len2             # <<<<<<<<<<<<<<
@@ -53296,7 +53129,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_v_len1 = __pyx_v_len2;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1432
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1426
  *             len1 = len2
  * 
  *         step = 1+(num_gaps*2)             # <<<<<<<<<<<<<<
@@ -53305,7 +53138,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = (1 + (__pyx_v_num_gaps * 2));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1433
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1427
  * 
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)             # <<<<<<<<<<<<<<
@@ -53314,7 +53147,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps2 = ((int *)malloc(0));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1434
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1428
  *         step = 1+(num_gaps*2)
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0             # <<<<<<<<<<<<<<
@@ -53323,7 +53156,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1435
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1429
  *         e_gaps2 = <int*> malloc(0)
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:             # <<<<<<<<<<<<<<
@@ -53333,7 +53166,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1436
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1430
  *         len2 = 0
  *         for i from e_high <= i <= e_x_high:
  *             j = 0             # <<<<<<<<<<<<<<
@@ -53342,7 +53175,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_j = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1437
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1431
  *         for i from e_high <= i <= e_x_high:
  *             j = 0
  *             while j < len1:             # <<<<<<<<<<<<<<
@@ -53353,7 +53186,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1438
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1432
  *             j = 0
  *             while j < len1:
  *                 if i - e_gaps1[j] <= self.train_max_initial_size and i >= e_gaps1[j+step-1]:             # <<<<<<<<<<<<<<
@@ -53369,7 +53202,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       if (__pyx_t_2) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1439
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1433
  *             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)             # <<<<<<<<<<<<<<
@@ -53378,7 +53211,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1440
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1434
  *                 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)             # <<<<<<<<<<<<<<
@@ -53390,7 +53223,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L37:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1441
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1435
  *                     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             # <<<<<<<<<<<<<<
@@ -53401,7 +53234,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1442
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1436
  *                     e_gaps2 = self.int_arr_extend(e_gaps2, &len2, &i, 1)
  *                 j = j + step
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -53410,7 +53243,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1443
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1437
  *                 j = j + step
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2             # <<<<<<<<<<<<<<
@@ -53419,7 +53252,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_e_gaps1 = __pyx_v_e_gaps2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1444
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1438
  *         free(e_gaps1)
  *         e_gaps1 = e_gaps2
  *         len1 = len2             # <<<<<<<<<<<<<<
@@ -53428,7 +53261,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_len1 = __pyx_v_len2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1446
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1440
  *         len1 = len2
  * 
  *         step = (num_gaps+1)*2             # <<<<<<<<<<<<<<
@@ -53437,7 +53270,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_step = ((__pyx_v_num_gaps + 1) * 2);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1447
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1441
  * 
  *         step = (num_gaps+1)*2
  *         i = 0             # <<<<<<<<<<<<<<
@@ -53446,7 +53279,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   __pyx_v_i = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1449
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1443
  *         i = 0
  * 
  *         while i < len1:             # <<<<<<<<<<<<<<
@@ -53457,7 +53290,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1450
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1444
  * 
  *         while i < len1:
  *             ephr_arr._clear()             # <<<<<<<<<<<<<<
@@ -53466,7 +53299,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1451
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1445
  *         while i < len1:
  *             ephr_arr._clear()
  *             num_chunks = 0             # <<<<<<<<<<<<<<
@@ -53475,20 +53308,20 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_num_chunks = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1452
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1446
  *             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 = 1452; __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 = 1446; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1453
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1447
  *             num_chunks = 0
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:             # <<<<<<<<<<<<<<
@@ -53498,7 +53331,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1454
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1448
  *             indexes = []
  *             for j from 0 <= j < num_gaps+1:
  *                 if e_gaps1[i+2*j] < e_gaps1[i+(2*j)+1]:             # <<<<<<<<<<<<<<
@@ -53508,7 +53341,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1455
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1449
  *             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             # <<<<<<<<<<<<<<
@@ -53520,7 +53353,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       }
       __pyx_L42:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1456
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1450
  *                 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]:             # <<<<<<<<<<<<<<
@@ -53530,19 +53363,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1457
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1451
  *                     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 = 1457; __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 = 1451; __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 = 1457; __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 = 1451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1458
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1452
  *                 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]])             # <<<<<<<<<<<<<<
@@ -53550,14 +53383,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 = 1458; __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 = 1452; __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 = 1458; __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 = 1452; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1459
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1453
  *                     indexes.append(k)
  *                     ephr_arr._append(self.eid2symid[self.eda.data.arr[e_sent_start+k]])
  *                 if j < num_gaps:             # <<<<<<<<<<<<<<
@@ -53567,19 +53400,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1460
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1454
  *                     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 = 1460; __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 = 1454; __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 = 1460; __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 = 1454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1461
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1455
  *                 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))             # <<<<<<<<<<<<<<
@@ -53592,7 +53425,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
       __pyx_L45:;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1462
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1456
  *                     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             # <<<<<<<<<<<<<<
@@ -53601,7 +53434,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
     __pyx_v_i = (__pyx_v_i + __pyx_v_step);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1463
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1457
  *                     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:             # <<<<<<<<<<<<<<
@@ -53617,22 +53450,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     }
     if (__pyx_t_7) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1464
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1458
  *             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 = 1464; __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 = 1458; __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 = 1464; __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 = 1458; __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 = 1464; __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 = 1458; __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);
@@ -53640,7 +53473,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 = 1464; __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 = 1458; __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;
@@ -53649,7 +53482,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
     __pyx_L46:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1466
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1460
  *                 result.append((Phrase(ephr_arr),indexes))
  * 
  *         free(e_gaps1)             # <<<<<<<<<<<<<<
@@ -53658,7 +53491,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gaps1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1467
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1461
  * 
  *         free(e_gaps1)
  *         free(e_gap_order)             # <<<<<<<<<<<<<<
@@ -53667,7 +53500,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
  */
   free(__pyx_v_e_gap_order);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1468
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1462
  *         free(e_gaps1)
  *         free(e_gap_order)
  *         return result             # <<<<<<<<<<<<<<
@@ -53695,7 +53528,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract_phrases(struct _
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1470
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1464
  *         return result
  * 
  *     cdef IntList create_alignments(self, int* sent_links, int num_links, findexes, eindexes):             # <<<<<<<<<<<<<<
@@ -53723,55 +53556,56 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("create_alignments", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1472
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1466
  *     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 = 1472; __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 = 1466; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1473
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1467
  *         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 = 1473; __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 = 1467; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1474
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1468
  *         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 = 1474; __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 = 1468; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1475
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1469
  *         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 = 1475; __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 = 1475; __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 = 1469; __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 = 1469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_4) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1476
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1470
  *             s = findexes[i]
  *             if (s<0):
  *                 continue             # <<<<<<<<<<<<<<
@@ -53783,7 +53617,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1477
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1471
  *             if (s<0):
  *                 continue
  *             idx = 0             # <<<<<<<<<<<<<<
@@ -53794,7 +53628,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1478
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1472
  *                 continue
  *             idx = 0
  *             while (idx < num_links*2):             # <<<<<<<<<<<<<<
@@ -53802,51 +53636,53 @@ 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 = 1478; __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 = 1472; __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 = 1478; __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 = 1472; __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 = 1478; __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 = 1472; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       if (!__pyx_t_4) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1479
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1473
  *             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 = 1479; __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 = 1479; __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 = 1473; __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 = 1473; __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 = 1479; __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 = 1473; __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 = 1479; __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 = 1473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_4) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1480
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1474
  *             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 = 1480; __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 = 1474; __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 = 1480; __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 = 1474; __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 = 1480; __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 = 1474; __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 = 1480; __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 = 1474; __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 = 1480; __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 = 1474; __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 = 1480; __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 = 1474; __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;
@@ -53854,19 +53690,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1481
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1475
  *                 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 = 1481; __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 = 1475; __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 = 1481; __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 = 1475; __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 = 1481; __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 = 1475; __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;
@@ -53874,14 +53710,14 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
       }
       __pyx_L8:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1482
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1476
  *                     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 = 1482; __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 = 1476; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_v_idx);
       __pyx_v_idx = __pyx_t_5;
@@ -53890,7 +53726,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
     __pyx_L3_continue:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1483
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1477
  *                     ret.append(i*65536+j)
  *                 idx += 2
  *         return ret             # <<<<<<<<<<<<<<
@@ -53920,7 +53756,7 @@ static struct __pyx_obj_3_sa_IntList *__pyx_f_3_sa_23HieroCachingRuleFactory_cre
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1485
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1479
  *         return ret
  * 
  *     cdef extract(self, Phrase phrase, Matching* matching, int* chunklen, int num_chunks):             # <<<<<<<<<<<<<<
@@ -54014,19 +53850,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("extract", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1498
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1492
  *         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 = 1498; __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 = 1492; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1499
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1493
  * 
  *         fphr_arr = IntList()
  *         phrase_len = phrase.n             # <<<<<<<<<<<<<<
@@ -54035,19 +53871,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_phrase_len = __pyx_v_phrase->n;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1500
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1494
  *         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 = 1500; __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 = 1494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_extracts = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1501
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1495
  *         phrase_len = phrase.n
  *         extracts = []
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)             # <<<<<<<<<<<<<<
@@ -54056,7 +53892,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1503
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1497
  *         sent_links = self.alignment._get_sent_links(matching.sent_id, &num_links)
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]             # <<<<<<<<<<<<<<
@@ -54065,7 +53901,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1504
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1498
  * 
  *         e_sent_start = self.eda.sent_index.arr[matching.sent_id]
  *         e_sent_end = self.eda.sent_index.arr[matching.sent_id+1]             # <<<<<<<<<<<<<<
@@ -54074,7 +53910,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1505
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1499
  *         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             # <<<<<<<<<<<<<<
@@ -54083,7 +53919,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1506
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1500
  *         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]             # <<<<<<<<<<<<<<
@@ -54092,7 +53928,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1507
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1501
  *         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]             # <<<<<<<<<<<<<<
@@ -54101,7 +53937,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1508
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1502
  *         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             # <<<<<<<<<<<<<<
@@ -54110,21 +53946,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1510
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1504
  *         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 = 1510; __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 = 1504; __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 = 1510; __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 = 1504; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1511
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1505
  * 
  *         self.findexes1.reset()
  *         sofar = 0             # <<<<<<<<<<<<<<
@@ -54134,7 +53970,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_sofar = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1512
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1506
  *         self.findexes1.reset()
  *         sofar = 0
  *         for i in range(num_chunks):             # <<<<<<<<<<<<<<
@@ -54145,7 +53981,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1513
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1507
  *         sofar = 0
  *         for i in range(num_chunks):
  *             for j in range(chunklen[i]):             # <<<<<<<<<<<<<<
@@ -54156,35 +53992,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1514
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1508
  *         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 = 1514; __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 = 1508; __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 = 1514; __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 = 1508; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1515
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1509
  *             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 = 1515; __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 = 1509; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1516
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1510
  *                 self.findexes1.append(matching.arr[matching.start+i]+j-f_sent_start);
  *                 sofar += 1
  *             if (i+1<num_chunks):             # <<<<<<<<<<<<<<
@@ -54194,28 +54030,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1517
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1511
  *                 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 = 1517; __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 = 1511; __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 = 1517; __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 = 1511; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1518
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1512
  *             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 = 1518; __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 = 1512; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_sofar);
       __pyx_v_sofar = __pyx_t_2;
@@ -54225,7 +54061,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_L7:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1521
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1515
  * 
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -54234,7 +54070,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1522
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1516
  * 
  *         e_links_low = <int*> malloc(e_sent_len*sizeof(int))
  *         e_links_high = <int*> malloc(e_sent_len*sizeof(int))             # <<<<<<<<<<<<<<
@@ -54243,7 +54079,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1523
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1517
  *         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))             # <<<<<<<<<<<<<<
@@ -54252,7 +54088,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1524
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1518
  *         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))             # <<<<<<<<<<<<<<
@@ -54261,7 +54097,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1525
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1519
  *         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))             # <<<<<<<<<<<<<<
@@ -54270,7 +54106,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1526
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1520
  *         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))             # <<<<<<<<<<<<<<
@@ -54279,7 +54115,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1527
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1521
  *         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))             # <<<<<<<<<<<<<<
@@ -54288,7 +54124,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1528
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1522
  *         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))             # <<<<<<<<<<<<<<
@@ -54297,7 +54133,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1529
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1523
  *         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))             # <<<<<<<<<<<<<<
@@ -54306,7 +54142,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1530
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1524
  *         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))             # <<<<<<<<<<<<<<
@@ -54315,7 +54151,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1531
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1525
  *         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))             # <<<<<<<<<<<<<<
@@ -54324,7 +54160,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1532
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1526
  *         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))             # <<<<<<<<<<<<<<
@@ -54333,7 +54169,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1534
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1528
  *         memset(e_gap_high, 0, (num_chunks+1)*sizeof(int))
  * 
  *         reason_for_failure = ""             # <<<<<<<<<<<<<<
@@ -54343,7 +54179,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1536
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1530
  *         reason_for_failure = ""
  * 
  *         for i from 0 <= i < e_sent_len:             # <<<<<<<<<<<<<<
@@ -54353,7 +54189,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1537
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1531
  * 
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -54362,7 +54198,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_e_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1538
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1532
  *         for i from 0 <= i < e_sent_len:
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -54372,7 +54208,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_e_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1539
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1533
  *             e_links_low[i] = -1
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:             # <<<<<<<<<<<<<<
@@ -54382,7 +54218,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1540
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1534
  *             e_links_high[i] = -1
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1             # <<<<<<<<<<<<<<
@@ -54391,7 +54227,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     (__pyx_v_f_links_low[__pyx_v_i]) = -1;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1541
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1535
  *         for i from 0 <= i < f_sent_len:
  *             f_links_low[i] = -1
  *             f_links_high[i] = -1             # <<<<<<<<<<<<<<
@@ -54401,7 +54237,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     (__pyx_v_f_links_high[__pyx_v_i]) = -1;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1547
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1541
  *         # links that we care about (but then how to look up
  *         # when we want to check something on the e side?)
  *         i = 0             # <<<<<<<<<<<<<<
@@ -54410,7 +54246,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_i = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1548
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1542
  *         # when we want to check something on the e side?)
  *         i = 0
  *         while i < num_links*2:             # <<<<<<<<<<<<<<
@@ -54421,7 +54257,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1549
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1543
  *         i = 0
  *         while i < num_links*2:
  *             f_i = sent_links[i]             # <<<<<<<<<<<<<<
@@ -54430,7 +54266,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_f_i = (__pyx_v_sent_links[__pyx_v_i]);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1550
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1544
  *         while i < num_links*2:
  *             f_i = sent_links[i]
  *             e_i = sent_links[i+1]             # <<<<<<<<<<<<<<
@@ -54439,7 +54275,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1551
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1545
  *             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:             # <<<<<<<<<<<<<<
@@ -54455,7 +54291,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1552
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1546
  *             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             # <<<<<<<<<<<<<<
@@ -54467,7 +54303,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L14:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1553
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1547
  *             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:             # <<<<<<<<<<<<<<
@@ -54483,7 +54319,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_8) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1554
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1548
  *                 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             # <<<<<<<<<<<<<<
@@ -54495,7 +54331,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L15:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1555
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1549
  *             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:             # <<<<<<<<<<<<<<
@@ -54511,7 +54347,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1556
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1550
  *                 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             # <<<<<<<<<<<<<<
@@ -54523,7 +54359,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L16:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1557
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1551
  *             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:             # <<<<<<<<<<<<<<
@@ -54539,7 +54375,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_9) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1558
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1552
  *                 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             # <<<<<<<<<<<<<<
@@ -54551,7 +54387,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L17:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1559
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1553
  *             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             # <<<<<<<<<<<<<<
@@ -54561,19 +54397,19 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_i = (__pyx_v_i + 2);
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1561
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1555
  *             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 = 1561; __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 = 1555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __pyx_v_als = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1562
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1556
  * 
  *         als = []
  *         for x in range(matching.start,matching.end):             # <<<<<<<<<<<<<<
@@ -54584,18 +54420,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1563
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1557
  *         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 = 1563; __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 = 1557; __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 = 1563; __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 = 1557; __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 = 1563; __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 = 1557; __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);
@@ -54607,17 +54443,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     __pyx_v_al = __pyx_t_10;
     __pyx_t_10 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1564
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1558
  *         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 = 1564; __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 = 1558; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1566
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1560
  *             als.append(al)
  *         # check all source-side alignment constraints
  *         met_constraints = 1             # <<<<<<<<<<<<<<
@@ -54626,7 +54462,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   __pyx_v_met_constraints = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1567
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1561
  *         # check all source-side alignment constraints
  *         met_constraints = 1
  *         if self.require_aligned_terminal:             # <<<<<<<<<<<<<<
@@ -54635,7 +54471,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_self->require_aligned_terminal) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1568
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1562
  *         met_constraints = 1
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0             # <<<<<<<<<<<<<<
@@ -54644,7 +54480,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
     __pyx_v_num_aligned_chunks = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1569
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1563
  *         if self.require_aligned_terminal:
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:             # <<<<<<<<<<<<<<
@@ -54654,7 +54490,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1570
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1564
  *             num_aligned_chunks = 0
  *             for i from 0 <= i < num_chunks:
  *                 for j from 0 <= j < chunklen[i]:             # <<<<<<<<<<<<<<
@@ -54664,7 +54500,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1571
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1565
  *             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:             # <<<<<<<<<<<<<<
@@ -54674,7 +54510,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1572
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1566
  *                 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             # <<<<<<<<<<<<<<
@@ -54683,7 +54519,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_num_aligned_chunks = (__pyx_v_num_aligned_chunks + 1);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1573
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1567
  *                     if f_links_low[matching.arr[matching.start+i]+j-f_sent_start] > -1:
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break             # <<<<<<<<<<<<<<
@@ -54698,7 +54534,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_L24_break:;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1574
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1568
  *                         num_aligned_chunks = num_aligned_chunks + 1
  *                         break
  *             if num_aligned_chunks == 0:             # <<<<<<<<<<<<<<
@@ -54708,18 +54544,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1575
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1569
  *                         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_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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1576
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1570
  *             if num_aligned_chunks == 0:
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54731,7 +54567,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     __pyx_L26:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1577
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1571
  *                 reason_for_failure = "No aligned terminals"
  *                 met_constraints = 0
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:             # <<<<<<<<<<<<<<
@@ -54746,18 +54582,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     if (__pyx_t_7) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1578
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1572
  *                 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_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);
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1579
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1573
  *             if self.require_aligned_chunks and num_aligned_chunks < num_chunks:
  *                 reason_for_failure = "Unaligned chunk"
  *                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -54772,7 +54608,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L20:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1581
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1575
  *                 met_constraints = 0
  * 
  *         if met_constraints and self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -54787,7 +54623,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   if (__pyx_t_9) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1583
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1577
  *         if met_constraints and self.tight_phrases:
  *             # outside edge constraints are checked later
  *             for i from 0 <= i < num_chunks-1:             # <<<<<<<<<<<<<<
@@ -54797,7 +54633,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1584
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1578
  *             # 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:             # <<<<<<<<<<<<<<
@@ -54807,18 +54643,18 @@ 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_chunklen[__pyx_v_i])) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1585
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1579
  *             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_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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1586
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1580
  *                 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             # <<<<<<<<<<<<<<
@@ -54827,7 +54663,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1587
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1581
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -54839,7 +54675,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L31:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1588
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1582
  *                     met_constraints = 0
  *                     break
  *                 if f_links_low[matching.arr[matching.start+i+1]-1-f_sent_start] == -1:             # <<<<<<<<<<<<<<
@@ -54849,18 +54685,18 @@ 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) + 1)]) - 1) - __pyx_v_f_sent_start)]) == -1);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1589
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1583
  *                     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_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);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1590
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1584
  *                 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             # <<<<<<<<<<<<<<
@@ -54869,7 +54705,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_met_constraints = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1591
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1585
  *                     reason_for_failure = "Gaps are not tight phrases"
  *                     met_constraints = 0
  *                     break             # <<<<<<<<<<<<<<
@@ -54886,7 +54722,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
   }
   __pyx_L28:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1593
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1587
  *                     break
  * 
  *         f_low = matching.arr[matching.start] - f_sent_start             # <<<<<<<<<<<<<<
@@ -54895,7 +54731,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1594
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1588
  * 
  *         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             # <<<<<<<<<<<<<<
@@ -54904,7 +54740,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1595
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1589
  *         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:             # <<<<<<<<<<<<<<
@@ -54913,17 +54749,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   if (__pyx_v_met_constraints) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1597
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1591
  *         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 = 1597; __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 = 1591; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_10);
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1601
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1595
  *                                 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):             # <<<<<<<<<<<<<<
@@ -54934,7 +54770,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1602
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1596
  *                                 self.train_min_gap_size, 0,
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0             # <<<<<<<<<<<<<<
@@ -54943,7 +54779,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_gap_error = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1603
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1597
  *                                 self.max_nonterminals - num_chunks + 1, 1, 1, 0, 0):
  *                 gap_error = 0
  *                 num_gaps = 0             # <<<<<<<<<<<<<<
@@ -54952,7 +54788,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
       __pyx_v_num_gaps = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1605
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1599
  *                 num_gaps = 0
  * 
  *                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -54962,7 +54798,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1606
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1600
  * 
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low             # <<<<<<<<<<<<<<
@@ -54971,7 +54807,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_low[0]) = __pyx_v_f_back_low;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1607
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1601
  *                 if f_back_low < f_low:
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low             # <<<<<<<<<<<<<<
@@ -54980,7 +54816,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         (__pyx_v_f_gap_high[0]) = __pyx_v_f_low;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1608
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1602
  *                     f_gap_low[0] = f_back_low
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1             # <<<<<<<<<<<<<<
@@ -54989,7 +54825,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1609
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1603
  *                     f_gap_high[0] = f_low
  *                     num_gaps = 1
  *                     gap_start = 0             # <<<<<<<<<<<<<<
@@ -54998,7 +54834,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1610
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1604
  *                     num_gaps = 1
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -55007,7 +54843,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1611
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1605
  *                     gap_start = 0
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -55017,7 +54853,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1612
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1606
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -55029,7 +54865,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L36:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1613
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1607
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -55038,7 +54874,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1614
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1608
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:             # <<<<<<<<<<<<<<
@@ -55054,7 +54890,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1615
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1609
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_low] == -1 or f_links_low[f_low-1] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -55063,16 +54899,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1616
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1610
  *                         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_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_L38;
           }
           __pyx_L38:;
@@ -55083,7 +54919,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1618
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1612
  *                             reason_for_failure = "Inside edges of preceding subphrase are not tight"
  *                 else:
  *                     gap_start = 1             # <<<<<<<<<<<<<<
@@ -55092,7 +54928,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_gap_start = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1619
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1613
  *                 else:
  *                     gap_start = 1
  *                     if self.tight_phrases and f_links_low[f_low] == -1:             # <<<<<<<<<<<<<<
@@ -55107,7 +54943,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1622
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1616
  *                         # 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             # <<<<<<<<<<<<<<
@@ -55121,7 +54957,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L35:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1624
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1618
  *                         met_constraints = 0
  * 
  *                 for i from 0 <= i < matching.size - 1:             # <<<<<<<<<<<<<<
@@ -55131,7 +54967,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1625
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1619
  * 
  *                 for i from 0 <= i < matching.size - 1:
  *                     f_gap_low[1+i] = matching.arr[matching.start+i] + chunklen[i] - f_sent_start             # <<<<<<<<<<<<<<
@@ -55140,7 +54976,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1626
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1620
  *                 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             # <<<<<<<<<<<<<<
@@ -55149,7 +54985,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1627
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1621
  *                     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             # <<<<<<<<<<<<<<
@@ -55159,7 +54995,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
       }
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1629
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1623
  *                     num_gaps = num_gaps + 1
  * 
  *                 if f_high < f_back_high:             # <<<<<<<<<<<<<<
@@ -55169,7 +55005,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_9 = (__pyx_v_f_high < __pyx_v_f_back_high);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1630
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1624
  * 
  *                 if f_high < f_back_high:
  *                     f_gap_low[gap_start+num_gaps] = f_high             # <<<<<<<<<<<<<<
@@ -55178,7 +55014,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1631
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1625
  *                 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             # <<<<<<<<<<<<<<
@@ -55187,7 +55023,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1632
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1626
  *                     f_gap_low[gap_start+num_gaps] = f_high
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1             # <<<<<<<<<<<<<<
@@ -55196,7 +55032,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_num_gaps = (__pyx_v_num_gaps + 1);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1633
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1627
  *                     f_gap_high[gap_start+num_gaps] = f_back_high
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1             # <<<<<<<<<<<<<<
@@ -55205,7 +55041,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_phrase_len = (__pyx_v_phrase_len + 1);
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1634
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1628
  *                     num_gaps = num_gaps + 1
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:             # <<<<<<<<<<<<<<
@@ -55215,7 +55051,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1635
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1629
  *                     phrase_len = phrase_len+1
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1             # <<<<<<<<<<<<<<
@@ -55227,7 +55063,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L43:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1636
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1630
  *                     if phrase_len > self.max_length:
  *                         gap_error = 1
  *                     if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -55236,7 +55072,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_self->tight_phrases) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1637
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1631
  *                         gap_error = 1
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:             # <<<<<<<<<<<<<<
@@ -55252,7 +55088,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_7) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1638
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1632
  *                     if self.tight_phrases:
  *                         if f_links_low[f_back_high-1] == -1 or f_links_low[f_high] == -1:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -55261,16 +55097,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1639
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1633
  *                         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_132));
+            __Pyx_INCREF(((PyObject *)__pyx_kp_s_131));
             __Pyx_DECREF(__pyx_v_reason_for_failure);
-            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_132);
+            __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_131);
             goto __pyx_L45;
           }
           __pyx_L45:;
@@ -55281,7 +55117,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       /*else*/ {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1641
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1635
  *                             reason_for_failure = "Inside edges of following subphrase are not tight"
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -55296,7 +55132,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1642
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1636
  *                 else:
  *                     if self.tight_phrases and f_links_low[f_high-1] == -1:
  *                         met_constraints = 0             # <<<<<<<<<<<<<<
@@ -55310,7 +55146,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L42:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1644
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1638
  *                         met_constraints = 0
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -55320,7 +55156,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_9 = (__pyx_v_gap_error == 0);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1645
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1639
  * 
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low             # <<<<<<<<<<<<<<
@@ -55329,7 +55165,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1646
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1640
  *                 if gap_error == 0:
  *                     e_word_count = e_high - e_low
  *                     for i from 0 <= i < num_gaps: # check integrity of subphrases             # <<<<<<<<<<<<<<
@@ -55339,17 +55175,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1647
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1641
  *                     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 = 1647; __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 = 1641; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1652
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1646
  *                                             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,             # <<<<<<<<<<<<<<
@@ -55360,7 +55196,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1654
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1648
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0) == 0:
  *                             gap_error = 1             # <<<<<<<<<<<<<<
@@ -55369,18 +55205,18 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_gap_error = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1655
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1649
  *                                             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 = 1655; __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 = 1649; __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 = 1655; __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 = 1649; __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 = 1655; __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 = 1649; __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);
@@ -55388,14 +55224,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_133), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1655; __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 = 1649; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1656
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1650
  *                             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             # <<<<<<<<<<<<<<
@@ -55412,7 +55248,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       }
       __pyx_L47:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1658
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1652
  *                             break
  * 
  *                 if gap_error == 0:             # <<<<<<<<<<<<<<
@@ -55422,7 +55258,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
       __pyx_t_9 = (__pyx_v_gap_error == 0);
       if (__pyx_t_9) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1659
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1653
  * 
  *                 if gap_error == 0:
  *                     i = 1             # <<<<<<<<<<<<<<
@@ -55431,21 +55267,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         __pyx_v_i = 1;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1660
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1654
  *                 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 = 1660; __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 = 1654; __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 = 1660; __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 = 1654; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1661
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1655
  *                     i = 1
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -55455,7 +55291,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1662
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1656
  *                     self.findexes.reset()
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55464,7 +55300,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1663
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1657
  *                     if f_back_low < f_low:
  *                         fphr_arr._append(sym_setindex(self.category, i))
  *                         i = i+1             # <<<<<<<<<<<<<<
@@ -55473,16 +55309,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
           __pyx_v_i = (__pyx_v_i + 1);
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1664
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1658
  *                         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 = 1664; __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 = 1658; __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 = 1664; __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 = 1658; __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;
@@ -55490,27 +55326,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L52:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1665
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1659
  *                         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 = 1665; __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 = 1659; __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 = 1665; __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 = 1659; __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 = 1665; __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 = 1659; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1666
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1660
  *                         self.findexes.append(sym_setindex(self.category, i))
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -55520,7 +55356,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1667
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1661
  *                     self.findexes.extend(self.findexes1)
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -55530,7 +55366,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1668
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1662
  *                     for j from 0 <= j < phrase.n:
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55539,7 +55375,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1669
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1663
  *                         if sym_isvar(phrase.syms[j]):
  *                             fphr_arr._append(sym_setindex(self.category, i))
  *                             i = i + 1             # <<<<<<<<<<<<<<
@@ -55551,7 +55387,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           /*else*/ {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1671
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1665
  *                             i = i + 1
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -55563,7 +55399,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_L55:;
         }
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1672
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1666
  *                         else:
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -55573,7 +55409,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1673
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1667
  *                             fphr_arr._append(phrase.syms[j])
  *                     if f_back_high > f_high:
  *                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -55582,16 +55418,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1674
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1668
  *                     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 = 1674; __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 = 1668; __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 = 1674; __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 = 1668; __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;
@@ -55599,25 +55435,25 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L56:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1676
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1670
  *                         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 = 1676; __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 = 1670; __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 = 1676; __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 = 1670; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1677
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1671
  * 
  *                     fphr = Phrase(fphr_arr)
  *                     if met_constraints:             # <<<<<<<<<<<<<<
@@ -55626,47 +55462,47 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
         if (__pyx_v_met_constraints) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1680
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1674
  *                         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 = 1678; __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 = 1672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __Pyx_GOTREF(__pyx_t_10);
           __pyx_v_phrase_list = __pyx_t_10;
           __pyx_t_10 = 0;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1681
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1675
  *                                             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 = 1681; __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 = 1675; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           __pyx_t_9 = (__pyx_t_13 > 0);
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1682
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1676
  *                                             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 = 1682; __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 = 1676; __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 = 1682; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             __pyx_v_pair_count = (1.0 / __pyx_t_13);
             goto __pyx_L58;
           }
           /*else*/ {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1684
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1678
  *                             pair_count = 1.0 / len(phrase_list)
  *                         else:
  *                             pair_count = 0             # <<<<<<<<<<<<<<
@@ -55675,22 +55511,22 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_pair_count = 0.0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1685
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1679
  *                         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 = 1685; __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 = 1679; __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 = 1685; __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 = 1679; __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 = 1685; __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 = 1679; __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 = 1685; __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 = 1679; __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 = 1685; __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 = 1679; __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);
@@ -55704,7 +55540,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_134), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1685; __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 = 1679; __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);
@@ -55713,7 +55549,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L58:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1686
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1680
  *                             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:             # <<<<<<<<<<<<<<
@@ -55724,31 +55560,23 @@ 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 = 1686; __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 = 1680; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             __Pyx_GOTREF(__pyx_t_14);
             __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
           }
           for (;;) {
             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 = 1686; __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 = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              #endif
+              __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
             } 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 = 1686; __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 = 1686; __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)) {
                 if (PyErr_Occurred()) {
                   if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1680; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 break;
               }
@@ -55756,35 +55584,29 @@ 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 = 1686; __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 = 1680; __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 = 1680; __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 = 1686; __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 = 1686; __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 = 1686; __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 = 1680; __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;
@@ -55792,15 +55614,14 @@ 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 = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-              __pyx_t_17 = NULL;
+              if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1680; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __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);
-              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+              if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+              {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1680; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_L62_unpacking_done:;
             }
             __Pyx_XDECREF(__pyx_v_phrase2);
@@ -55810,7 +55631,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_v_eindexes = __pyx_t_2;
             __pyx_t_2 = 0;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1687
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1681
  *                             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)             # <<<<<<<<<<<<<<
@@ -55819,31 +55640,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 = 1687; __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 = 1681; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1688
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1682
  *                         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
  *                         phrase_len < 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 = 1688; __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 = 1682; __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 = 1688; __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 = 1682; __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 = 1688; __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 = 1682; __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 = 1688; __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 = 1682; __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));
@@ -55857,7 +55678,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 = 1688; __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 = 1682; __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;
@@ -55867,7 +55688,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         __pyx_L57:;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1689
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1683
  *                             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             # <<<<<<<<<<<<<<
@@ -55877,7 +55698,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         __pyx_t_9 = (__pyx_v_num_gaps < __pyx_v_self->max_nonterminals);
         if (__pyx_t_9) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1690
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1684
  *                             extracts.append((fphr, phrase2, pair_count, tuple(als1)))
  *                     if (num_gaps < self.max_nonterminals and
  *                         phrase_len < self.max_length and             # <<<<<<<<<<<<<<
@@ -55887,7 +55708,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1691
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1685
  *                     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):             # <<<<<<<<<<<<<<
@@ -55905,7 +55726,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
         }
         if (__pyx_t_7) {
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1692
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1686
  *                         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             # <<<<<<<<<<<<<<
@@ -55915,7 +55736,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1693
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1687
  *                         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             # <<<<<<<<<<<<<<
@@ -55925,7 +55746,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_9 = (__pyx_v_f_low >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_9) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1694
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1688
  *                         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))):             # <<<<<<<<<<<<<<
@@ -55955,7 +55776,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_9) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1695
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1689
  *                                 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             # <<<<<<<<<<<<<<
@@ -55964,7 +55785,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1696
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1690
  *                                 ((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             # <<<<<<<<<<<<<<
@@ -55973,7 +55794,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1697
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1691
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -55982,7 +55803,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1698
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1692
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:             # <<<<<<<<<<<<<<
@@ -55999,7 +55820,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1699
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1693
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -56012,7 +55833,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L65:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1700
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1694
  *                                 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:             # <<<<<<<<<<<<<<
@@ -56028,7 +55849,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1701
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1695
  *                                     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             # <<<<<<<<<<<<<<
@@ -56040,7 +55861,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L68:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1703
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1697
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -56049,17 +55870,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1704
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1698
  * 
  *                             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 = 1704; __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 = 1698; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_14);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1708
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1702
  *                                             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,             # <<<<<<<<<<<<<<
@@ -56070,7 +55891,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
               if (__pyx_t_7) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1710
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1704
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             1, 1, 1, 1, 0, 1, 0) == 1) and
  *                                 ((not self.tight_phrases) or f_links_low[f_x_low] != -1) and             # <<<<<<<<<<<<<<
@@ -56086,17 +55907,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_8) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1711
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1705
  *                                             1, 1, 1, 1, 0, 1, 0) == 1) 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_14 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  __pyx_t_14 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1705; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1715
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1709
  *                                             -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,             # <<<<<<<<<<<<<<
@@ -56118,7 +55939,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1717
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1711
  *                                             self.train_max_initial_size, self.train_max_initial_size,
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -56127,7 +55948,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1718
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1712
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -56136,35 +55957,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1719
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1713
  *                                 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 = 1719; __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 = 1713; __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 = 1719; __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 = 1713; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1720
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1714
  *                                 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 = 1720; __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 = 1714; __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 = 1720; __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 = 1714; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1721
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1715
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56173,7 +55994,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1722
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1716
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -56182,27 +56003,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1723
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1717
  *                                 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 = 1723; __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 = 1717; __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 = 1723; __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 = 1717; __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 = 1723; __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 = 1717; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1724
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1718
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -56212,7 +56033,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1725
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1719
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -56222,7 +56043,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1726
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1720
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56231,7 +56052,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1727
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1721
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -56243,7 +56064,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1729
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1723
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -56255,7 +56076,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L72:;
               }
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1730
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1724
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:             # <<<<<<<<<<<<<<
@@ -56265,7 +56086,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1731
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1725
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 if f_back_high > f_high:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56274,16 +56095,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1732
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1726
  *                                 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 = 1732; __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 = 1726; __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 = 1732; __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 = 1726; __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;
@@ -56291,67 +56112,67 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L73:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1733
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1727
  *                                     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 = 1733; __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 = 1727; __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 = 1733; __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 = 1727; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1736
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1730
  *                                 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 = 1734; __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 = 1728; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1737
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1731
  *                                                     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 = 1737; __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 = 1731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_7 = (__pyx_t_13 > 0);
               if (__pyx_t_7) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1738
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1732
  *                                                     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 = 1738; __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 = 1732; __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 = 1738; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L74;
               }
               /*else*/ {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1740
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1734
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -56362,7 +56183,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L74:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1741
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1735
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -56373,31 +56194,23 @@ 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 = 1741; __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 = 1735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_15);
                 __pyx_t_16 = Py_TYPE(__pyx_t_15)->tp_iternext;
               }
               for (;;) {
                 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 = 1741; __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 = 1741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_1 = PyList_GET_ITEM(__pyx_t_15, __pyx_t_13); __Pyx_INCREF(__pyx_t_1); __pyx_t_13++;
                 } 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 = 1741; __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 = 1741; __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)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -56405,35 +56218,29 @@ 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 = 1741; __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 = 1735; __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 = 1735; __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 = 1741; __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 = 1741; __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 = 1741; __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 = 1735; __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;
@@ -56441,15 +56248,14 @@ 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 = 1741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __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);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1741; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1735; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L78_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -56459,7 +56265,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1742
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1736
  *                                     pair_count = 0
  *                                 for phrase2,eindexes in phrase_list:
  *                                     als2 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -56468,31 +56274,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 = 1742; __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 = 1736; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1743
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1737
  *                                 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 = 1743; __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 = 1737; __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 = 1743; __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 = 1737; __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 = 1743; __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 = 1737; __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 = 1743; __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 = 1737; __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));
@@ -56506,7 +56312,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 = 1743; __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 = 1737; __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;
@@ -56519,7 +56325,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L64:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1745
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1739
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als2)))
  * 
  *                         if (f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -56529,7 +56335,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1746
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1740
  * 
  *                         if (f_back_high == f_high and
  *                             f_sent_len - f_high >= self.train_min_gap_size and             # <<<<<<<<<<<<<<
@@ -56539,7 +56345,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_8 = ((__pyx_v_f_sent_len - __pyx_v_f_high) >= __pyx_v_self->train_min_gap_size);
             if (__pyx_t_8) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1747
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1741
  *                         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))):             # <<<<<<<<<<<<<<
@@ -56569,7 +56375,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1748
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1742
  *                             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             # <<<<<<<<<<<<<<
@@ -56578,7 +56384,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1749
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1743
  *                             ((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             # <<<<<<<<<<<<<<
@@ -56587,7 +56393,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1750
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1744
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             met_constraints = 1
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -56596,7 +56402,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1751
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1745
  *                             met_constraints = 1
  *                             if self.tight_phrases:
  *                                 while f_x_high <= f_sent_len and f_links_low[f_x_high-1] == -1:             # <<<<<<<<<<<<<<
@@ -56613,7 +56419,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1752
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1746
  *                             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             # <<<<<<<<<<<<<<
@@ -56626,7 +56432,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L80:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1753
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1747
  *                                 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:             # <<<<<<<<<<<<<<
@@ -56642,7 +56448,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1754
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1748
  *                                     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             # <<<<<<<<<<<<<<
@@ -56654,7 +56460,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L83:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1756
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1750
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -56663,17 +56469,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1757
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1751
  * 
  *                             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 = 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 = 1751; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_15);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1761
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1755
  *                                             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,             # <<<<<<<<<<<<<<
@@ -56683,7 +56489,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1763
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1757
  *                                             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             # <<<<<<<<<<<<<<
@@ -56699,17 +56505,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_8) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1764
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1758
  *                                             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 = 1764; __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 = 1758; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_14);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1769
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1763
  *                                             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,             # <<<<<<<<<<<<<<
@@ -56732,7 +56538,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_7) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1771
+              /* "/home/paulb/workspace/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()             # <<<<<<<<<<<<<<
@@ -56741,7 +56547,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1772
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1766
  *                                             0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -56750,21 +56556,21 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1773
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1767
  *                                 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 = 1773; __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 = 1767; __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 = 1773; __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 = 1767; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1774
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1768
  *                                 i = 1
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:             # <<<<<<<<<<<<<<
@@ -56774,7 +56580,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1775
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1769
  *                                 self.findexes.reset()
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56783,7 +56589,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1776
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1770
  *                                 if f_back_low < f_low:
  *                                     fphr_arr._append(sym_setindex(self.category, i))
  *                                     i = i+1             # <<<<<<<<<<<<<<
@@ -56792,16 +56598,16 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
                 __pyx_v_i = (__pyx_v_i + 1);
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1777
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1771
  *                                     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 = 1777; __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 = 1771; __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 = 1777; __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 = 1771; __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;
@@ -56809,27 +56615,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L85:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1778
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1772
  *                                     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 = 1778; __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 = 1772; __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 = 1778; __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 = 1772; __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 = 1778; __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 = 1772; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1779
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1773
  *                                     self.findexes.append(sym_setindex(self.category, i))
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -56839,7 +56645,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1780
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1774
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -56849,7 +56655,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1781
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1775
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56858,7 +56664,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1782
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1776
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -56870,7 +56676,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1784
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1778
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -56882,7 +56688,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L88:;
               }
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1785
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1779
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -56891,81 +56697,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1786
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1780
  *                                         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 = 1786; __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 = 1780; __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 = 1786; __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 = 1780; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1787
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1781
  *                                 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 = 1787; __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 = 1781; __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 = 1787; __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 = 1781; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1790
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1784
  *                                 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 = 1788; __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 = 1782; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1791
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1785
  *                                                     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 = 1791; __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;}
               __pyx_t_7 = (__pyx_t_13 > 0);
               if (__pyx_t_7) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1792
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1786
  *                                                     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 = 1792; __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;}
                 if (unlikely(__pyx_t_13 == 0)) {
                   PyErr_Format(PyExc_ZeroDivisionError, "float division");
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1792; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L89;
               }
               /*else*/ {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1794
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1788
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -56976,7 +56782,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L89:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1795
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1789
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -56987,31 +56793,23 @@ 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 = 1795; __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 = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_1);
                 __pyx_t_16 = Py_TYPE(__pyx_t_1)->tp_iternext;
               }
               for (;;) {
                 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 = 1795; __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 = 1795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_14 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_13); __Pyx_INCREF(__pyx_t_14); __pyx_t_13++;
                 } 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 = 1795; __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 = 1795; __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)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -57019,35 +56817,29 @@ 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 = 1795; __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 = 1789; __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 = 1789; __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 = 1795; __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 = 1795; __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 = 1795; __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 = 1789; __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;
@@ -57055,15 +56847,14 @@ 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 = 1795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __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);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1795; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1789; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L93_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -57073,7 +56864,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1796
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1790
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als3 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -57082,31 +56873,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 = 1796; __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 = 1790; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1797
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1791
  *                                 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 = 1797; __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 = 1791; __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 = 1797; __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 = 1791; __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 = 1797; __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 = 1791; __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 = 1797; __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 = 1791; __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));
@@ -57120,7 +56911,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 = 1797; __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 = 1791; __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;
@@ -57133,7 +56924,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           __pyx_L79:;
 
-          /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1798
+          /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1792
  *                                     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             # <<<<<<<<<<<<<<
@@ -57143,7 +56934,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           __pyx_t_7 = (__pyx_v_num_gaps < (__pyx_v_self->max_nonterminals - 1));
           if (__pyx_t_7) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1799
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1793
  *                                     extracts.append((fphr, phrase2, pair_count, tuple(als3)))
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and             # <<<<<<<<<<<<<<
@@ -57153,7 +56944,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             __pyx_t_8 = ((__pyx_v_phrase_len + 1) < __pyx_v_self->max_length);
             if (__pyx_t_8) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1800
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1794
  *                         if (num_gaps < self.max_nonterminals - 1 and
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and             # <<<<<<<<<<<<<<
@@ -57163,7 +56954,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1801
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1795
  *                             phrase_len+1 < self.max_length and
  *                             f_back_high == f_high and
  *                             f_back_low == f_low and             # <<<<<<<<<<<<<<
@@ -57173,7 +56964,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1802
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1796
  *                             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             # <<<<<<<<<<<<<<
@@ -57183,7 +56974,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1803
+                    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1797
  *                             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             # <<<<<<<<<<<<<<
@@ -57193,7 +56984,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1804
+                      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1798
  *                             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             # <<<<<<<<<<<<<<
@@ -57203,7 +56994,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1805
+                        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1799
  *                             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))):             # <<<<<<<<<<<<<<
@@ -57253,7 +57044,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
           }
           if (__pyx_t_8) {
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1807
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1801
  *                             ((not self.tight_phrases) or (f_links_low[f_low-1] != -1 and f_links_low[f_high] != -1))):
  * 
  *                             met_constraints = 1             # <<<<<<<<<<<<<<
@@ -57262,7 +57053,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             __pyx_v_met_constraints = 1;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1808
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1802
  * 
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -57271,7 +57062,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1809
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1803
  *                             met_constraints = 1
  *                             f_x_low = f_low-self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -57280,7 +57071,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1810
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1804
  *                             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:             # <<<<<<<<<<<<<<
@@ -57297,7 +57088,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_18) break;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1811
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1805
  *                             if self.tight_phrases:
  *                                 while f_x_low >= 0 and f_links_low[f_x_low] == -1:
  *                                     f_x_low = f_x_low - 1             # <<<<<<<<<<<<<<
@@ -57310,7 +57101,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L95:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1812
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1806
  *                                 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:             # <<<<<<<<<<<<<<
@@ -57320,7 +57111,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1813
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1807
  *                                     f_x_low = f_x_low - 1
  *                             if f_x_low < 0:
  *                                 met_constraints = 0             # <<<<<<<<<<<<<<
@@ -57332,7 +57123,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L98:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1815
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1809
  *                                 met_constraints = 0
  * 
  *                             f_x_high = f_high+self.train_min_gap_size             # <<<<<<<<<<<<<<
@@ -57341,7 +57132,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1816
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1810
  * 
  *                             f_x_high = f_high+self.train_min_gap_size
  *                             if self.tight_phrases:             # <<<<<<<<<<<<<<
@@ -57350,7 +57141,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_self->tight_phrases) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1817
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1811
  *                             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:             # <<<<<<<<<<<<<<
@@ -57367,7 +57158,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (!__pyx_t_7) break;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1818
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1812
  *                             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             # <<<<<<<<<<<<<<
@@ -57380,7 +57171,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L99:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1819
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1813
  *                                 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:             # <<<<<<<<<<<<<<
@@ -57396,7 +57187,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1820
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1814
  *                                     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             # <<<<<<<<<<<<<<
@@ -57408,7 +57199,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             __pyx_L102:;
 
-            /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1822
+            /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1816
  *                                 met_constraints = 0
  * 
  *                             if (met_constraints and             # <<<<<<<<<<<<<<
@@ -57417,17 +57208,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
             if (__pyx_v_met_constraints) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1823
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1817
  * 
  *                             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 = 1823; __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 = 1817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __Pyx_GOTREF(__pyx_t_1);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1827
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1821
  *                                                 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,             # <<<<<<<<<<<<<<
@@ -57438,7 +57229,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
               if (__pyx_t_8) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1829
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1823
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 1, 1, 2, 1, 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             # <<<<<<<<<<<<<<
@@ -57460,17 +57251,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 if (__pyx_t_18) {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1830
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1824
  *                                                 1, 1, 2, 1, 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_1 = PyInt_FromLong(__pyx_v_f_low); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1830; __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 = 1824; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __Pyx_GOTREF(__pyx_t_1);
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1834
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1828
  *                                                 -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,             # <<<<<<<<<<<<<<
@@ -57481,17 +57272,17 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
                   if (__pyx_t_3) {
 
-                    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1836
+                    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1830
  *                                                 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_1 = PyInt_FromLong(__pyx_v_f_x_high); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1836; __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 = 1830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     __Pyx_GOTREF(__pyx_t_1);
 
-                    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1841
+                    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1835
  *                                                 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,             # <<<<<<<<<<<<<<
@@ -57518,7 +57309,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
             }
             if (__pyx_t_8) {
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1843
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1837
  *                                                 self.train_max_initial_size, self.train_max_initial_size,
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()             # <<<<<<<<<<<<<<
@@ -57527,7 +57318,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1844
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1838
  *                                                 0, 0, 0, 0, 0, 0, 0)):
  *                                 fphr_arr._clear()
  *                                 i = 1             # <<<<<<<<<<<<<<
@@ -57536,35 +57327,35 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = 1;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1845
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1839
  *                                 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 = 1845; __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 = 1839; __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 = 1845; __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 = 1839; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1846
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1840
  *                                 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 = 1846; __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 = 1840; __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 = 1846; __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 = 1840; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1847
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1841
  *                                 self.findexes.reset()
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -57573,7 +57364,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1848
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1842
  *                                 self.findexes.append(sym_setindex(self.category, i))
  *                                 fphr_arr._append(sym_setindex(self.category, i))
  *                                 i = i+1             # <<<<<<<<<<<<<<
@@ -57582,27 +57373,27 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
               __pyx_v_i = (__pyx_v_i + 1);
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1849
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1843
  *                                 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 = 1849; __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 = 1843; __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 = 1849; __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 = 1843; __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 = 1849; __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 = 1843; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1850
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1844
  *                                 i = i+1
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:             # <<<<<<<<<<<<<<
@@ -57612,7 +57403,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1851
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1845
  *                                 self.findexes.extend(self.findexes1)
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):             # <<<<<<<<<<<<<<
@@ -57622,7 +57413,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1852
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1846
  *                                 for j from 0 <= j < phrase.n:
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -57631,7 +57422,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1853
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1847
  *                                     if sym_isvar(phrase.syms[j]):
  *                                         fphr_arr._append(sym_setindex(self.category, i))
  *                                         i = i + 1             # <<<<<<<<<<<<<<
@@ -57643,7 +57434,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 }
                 /*else*/ {
 
-                  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1855
+                  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1849
  *                                         i = i + 1
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])             # <<<<<<<<<<<<<<
@@ -57655,7 +57446,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_L106:;
               }
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1856
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1850
  *                                     else:
  *                                         fphr_arr._append(phrase.syms[j])
  *                                 fphr_arr._append(sym_setindex(self.category, i))             # <<<<<<<<<<<<<<
@@ -57664,81 +57455,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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1857
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1851
  *                                         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 = 1857; __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 = 1851; __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 = 1857; __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 = 1851; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1858
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1852
  *                                 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 = 1858; __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 = 1852; __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 = 1858; __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 = 1852; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1861
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1855
  *                                 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 = 1859; __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 = 1853; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1862
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1856
  *                                                     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 = 1862; __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 = 1856; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
               __pyx_t_8 = (__pyx_t_13 > 0);
               if (__pyx_t_8) {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1863
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1857
  *                                                     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 = 1863; __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 = 1857; __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 = 1863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 }
                 __pyx_v_pair_count = (1.0 / __pyx_t_13);
                 goto __pyx_L107;
               }
               /*else*/ {
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1865
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1859
  *                                     pair_count = 1.0 / len(phrase_list)
  *                                 else:
  *                                     pair_count = 0             # <<<<<<<<<<<<<<
@@ -57749,7 +57540,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
               }
               __pyx_L107:;
 
-              /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1866
+              /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1860
  *                                 else:
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:             # <<<<<<<<<<<<<<
@@ -57760,31 +57551,23 @@ 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 = 1866; __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 = 1860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                 __Pyx_GOTREF(__pyx_t_14);
                 __pyx_t_16 = Py_TYPE(__pyx_t_14)->tp_iternext;
               }
               for (;;) {
                 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 = 1866; __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 = 1866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  #endif
+                  __pyx_t_15 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_13); __Pyx_INCREF(__pyx_t_15); __pyx_t_13++;
                 } 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 = 1866; __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 = 1866; __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)) {
                     if (PyErr_Occurred()) {
                       if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                      else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                     }
                     break;
                   }
@@ -57792,35 +57575,29 @@ 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 = 1866; __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 = 1860; __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 = 1860; __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 = 1866; __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 = 1866; __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 = 1866; __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 = 1860; __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;
@@ -57828,15 +57605,14 @@ 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 = 1866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-                  __pyx_t_17 = NULL;
+                  if (__Pyx_IternextUnpackEndCheck(__pyx_t_17(__pyx_t_10), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __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);
-                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+                  if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+                  if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+                  {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
                   __pyx_L111_unpacking_done:;
                 }
                 __Pyx_XDECREF(__pyx_v_phrase2);
@@ -57846,7 +57622,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
                 __pyx_v_eindexes = __pyx_t_2;
                 __pyx_t_2 = 0;
 
-                /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1867
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1861
  *                                     pair_count = 0
  *                                 for phrase2, eindexes in phrase_list:
  *                                     als4 = self.create_alignments(sent_links,num_links,self.findexes,eindexes)             # <<<<<<<<<<<<<<
@@ -57855,31 +57631,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 = 1867; __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 = 1861; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1868
+                /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1862
  *                                 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 = 1868; __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 = 1862; __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 = 1868; __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 = 1862; __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 = 1868; __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 = 1862; __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 = 1868; __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 = 1862; __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));
@@ -57893,7 +57669,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 = 1868; __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 = 1862; __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;
@@ -57915,23 +57691,23 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
     }
     /*else*/ {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1870
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1864
  *                                     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_135));
+      __Pyx_INCREF(((PyObject *)__pyx_kp_s_134));
       __Pyx_DECREF(__pyx_v_reason_for_failure);
-      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_135);
+      __pyx_v_reason_for_failure = ((PyObject *)__pyx_kp_s_134);
     }
     __pyx_L34:;
     goto __pyx_L33;
   }
   __pyx_L33:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1872
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1866
  *                 reason_for_failure = "Unable to extract basic phrase"
  * 
  *         free(sent_links)             # <<<<<<<<<<<<<<
@@ -57940,7 +57716,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_sent_links);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1873
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1867
  * 
  *         free(sent_links)
  *         free(f_links_low)             # <<<<<<<<<<<<<<
@@ -57949,7 +57725,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_low);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1874
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1868
  *         free(sent_links)
  *         free(f_links_low)
  *         free(f_links_high)             # <<<<<<<<<<<<<<
@@ -57958,7 +57734,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_links_high);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1875
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1869
  *         free(f_links_low)
  *         free(f_links_high)
  *         free(e_links_low)             # <<<<<<<<<<<<<<
@@ -57967,7 +57743,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_low);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1876
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1870
  *         free(f_links_high)
  *         free(e_links_low)
  *         free(e_links_high)             # <<<<<<<<<<<<<<
@@ -57976,7 +57752,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_links_high);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1877
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1871
  *         free(e_links_low)
  *         free(e_links_high)
  *         free(f_gap_low)             # <<<<<<<<<<<<<<
@@ -57985,7 +57761,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_low);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1878
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1872
  *         free(e_links_high)
  *         free(f_gap_low)
  *         free(f_gap_high)             # <<<<<<<<<<<<<<
@@ -57994,7 +57770,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_f_gap_high);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1879
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1873
  *         free(f_gap_low)
  *         free(f_gap_high)
  *         free(e_gap_low)             # <<<<<<<<<<<<<<
@@ -58003,7 +57779,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_low);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1880
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1874
  *         free(f_gap_high)
  *         free(e_gap_low)
  *         free(e_gap_high)             # <<<<<<<<<<<<<<
@@ -58012,7 +57788,7 @@ static PyObject *__pyx_f_3_sa_23HieroCachingRuleFactory_extract(struct __pyx_obj
  */
   free(__pyx_v_e_gap_high);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1882
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1876
  *         free(e_gap_high)
  * 
  *         return extracts             # <<<<<<<<<<<<<<
@@ -58060,11 +57836,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_26add_instance(PyObject
   PyObject *__pyx_v_f_words = 0;
   PyObject *__pyx_v_e_words = 0;
   PyObject *__pyx_v_alignment = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_words,&__pyx_n_s__e_words,&__pyx_n_s__alignment,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("add_instance (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_words,&__pyx_n_s__e_words,&__pyx_n_s__alignment,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -58079,21 +57855,24 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_26add_instance(PyObject
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_words)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_words);
+        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__e_words)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_words);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1890; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alignment);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1890; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_instance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1890; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "add_instance") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -58108,7 +57887,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_26add_instance(PyObject
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1890; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("add_instance", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1884; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.add_instance", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -58132,11 +57911,12 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_12add_instance_1extract
   PyObject *__pyx_v_links = 0;
   PyObject *__pyx_v_nt = 0;
   PyObject *__pyx_v_nt_open = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__f_j,&__pyx_n_s__e_i,&__pyx_n_s__e_j,&__pyx_n_s__min_bound,&__pyx_n_s__wc,&__pyx_n_s__links,&__pyx_n_s__nt,&__pyx_n_s__nt_open,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("extract (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__f_j,&__pyx_n_s__e_i,&__pyx_n_s__e_j,&__pyx_n_s__min_bound,&__pyx_n_s__wc,&__pyx_n_s__links,&__pyx_n_s__nt,&__pyx_n_s__nt_open,0};
     PyObject* values[9] = {0,0,0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -58157,51 +57937,60 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_12add_instance_1extract
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_i)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_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__f_j)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_j);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_i)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_i);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_j)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_j);
+        if (likely(values[3])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_bound)) != 0)) kw_args--;
+        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__min_bound);
+        if (likely(values[4])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__wc)) != 0)) kw_args--;
+        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__wc);
+        if (likely(values[5])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__links)) != 0)) kw_args--;
+        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__links);
+        if (likely(values[6])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  7:
-        if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt)) != 0)) kw_args--;
+        values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt);
+        if (likely(values[7])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 7); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 7); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  8:
-        if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt_open)) != 0)) kw_args--;
+        values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt_open);
+        if (likely(values[8])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 8); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, 8); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "extract") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "extract") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 9) {
       goto __pyx_L5_argtuple_error;
@@ -58228,7 +58017,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_12add_instance_1extract
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("extract", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.add_instance.extract", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -58239,7 +58028,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_12add_instance_1extract
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1924
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1918
  *         # f_ i and j are current, e_ i and j are previous
  *         # We care _considering_ f_j, so it is not yet in counts
  *         def extract(f_i, f_j, e_i, e_j, min_bound, wc, links, nt, nt_open):             # <<<<<<<<<<<<<<
@@ -58285,33 +58074,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_21_add_instance *) __Pyx_CyFunction_GetClosure(__pyx_self);
   __pyx_cur_scope = __pyx_outer_scope;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1926
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1920
  *         def extract(f_i, f_j, e_i, e_j, min_bound, wc, links, nt, nt_open):
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:             # <<<<<<<<<<<<<<
  *                 return
  *             # Unaligned word
  */
-  if (unlikely(!__pyx_cur_scope->__pyx_v_f_len)) { __Pyx_RaiseClosureNameError("f_len"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_1 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_v_f_len)) { __Pyx_RaiseClosureNameError("f_len"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_t_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __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 = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!__pyx_t_3) {
-    __pyx_t_2 = PyNumber_Subtract(__pyx_v_f_j, __pyx_v_f_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Subtract(__pyx_v_f_j, __pyx_v_f_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_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_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __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 = 1920; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_6 = __pyx_t_5;
   } else {
@@ -58319,7 +58110,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   if (__pyx_t_6) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1927
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1921
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  *                 return             # <<<<<<<<<<<<<<
@@ -58333,41 +58124,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1929
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1923
  *                 return
  *             # Unaligned word
  *             if not al[f_j]:             # <<<<<<<<<<<<<<
  *                 # Adjacent to non-terminal: extend (non-terminal now open)
  *                 if nt and nt[-1][2] == f_j - 1:
  */
-  if (unlikely(!__pyx_cur_scope->__pyx_v_al)) { __Pyx_RaiseClosureNameError("al"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1929; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_v_al)) { __Pyx_RaiseClosureNameError("al"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1923; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1929; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1923; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_t_3 = (!__pyx_t_6);
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1931
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1925
  *             if not al[f_j]:
  *                 # Adjacent to non-terminal: extend (non-terminal now open)
  *                 if nt and nt[-1][2] == f_j - 1:             # <<<<<<<<<<<<<<
  *                     nt[-1][2] += 1
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc, links, nt, True)
  */
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_3) {
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1925; __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_4); __pyx_t_4 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __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 = 1925; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_5 = __pyx_t_6;
     } else {
@@ -58375,38 +58167,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1932
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1926
  *                 # Adjacent to non-terminal: extend (non-terminal now open)
  *                 if nt and nt[-1][2] == f_j - 1:
  *                     nt[-1][2] += 1             # <<<<<<<<<<<<<<
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc, links, nt, True)
  *                     nt[-1][2] -= 1
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_7 = 2;
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, __pyx_t_7, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, __pyx_t_7, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__Pyx_SetItemInt(__pyx_t_1, __pyx_t_7, __pyx_t_2, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_SetItemInt(__pyx_t_1, __pyx_t_7, __pyx_t_2, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1926; __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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1933
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1927
  *                 if nt and nt[-1][2] == f_j - 1:
  *                     nt[-1][2] += 1
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc, links, nt, True)             # <<<<<<<<<<<<<<
  *                     nt[-1][2] -= 1
  *                 # Unless non-terminal already open, always extend with word
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1933; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1927; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1927; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_f_i);
@@ -58435,48 +58227,49 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1933; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1927; __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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1934
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1928
  *                     nt[-1][2] += 1
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc, links, nt, True)
  *                     nt[-1][2] -= 1             # <<<<<<<<<<<<<<
  *                 # Unless non-terminal already open, always extend with word
  *                 # Make sure adding a word doesn't exceed length
  */
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_7 = 2;
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, __pyx_t_7, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, __pyx_t_7, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1928; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      if (__Pyx_SetItemInt(__pyx_t_2, __pyx_t_7, __pyx_t_1, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1934; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_SetItemInt(__pyx_t_2, __pyx_t_7, __pyx_t_1, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1928; __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;
       goto __pyx_L5;
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1937
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1931
  *                 # Unless non-terminal already open, always extend with word
  *                 # Make sure adding a word doesn't exceed length
  *                 if not nt_open and wc < self.max_length:             # <<<<<<<<<<<<<<
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc + 1, links, nt, False)
  *                 return
  */
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_nt_open); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_nt_open); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_3 = (!__pyx_t_5);
     if (__pyx_t_3) {
-      __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1931; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_6 = __pyx_t_5;
     } else {
@@ -58484,21 +58277,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     if (__pyx_t_6) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1938
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1932
  *                 # Make sure adding a word doesn't exceed length
  *                 if not nt_open and wc < self.max_length:
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc + 1, links, nt, False)             # <<<<<<<<<<<<<<
  *                 return
  *             # Aligned word
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __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 = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_8 = PyTuple_New(9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyTuple_New(9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_f_i);
@@ -58527,7 +58320,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __pyx_t_1 = 0;
       __pyx_t_2 = 0;
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1932; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
@@ -58535,7 +58328,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __pyx_L6:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1939
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1933
  *                 if not nt_open and wc < self.max_length:
  *                     extract(f_i, f_j + 1, e_i, e_j, min_bound, wc + 1, links, nt, False)
  *                 return             # <<<<<<<<<<<<<<
@@ -58549,38 +58342,38 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1941
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1935
  *                 return
  *             # Aligned word
  *             link_i = fe_span[f_j][0]             # <<<<<<<<<<<<<<
  *             link_j = fe_span[f_j][1]
  *             new_e_i = min(link_i, e_i)
  */
-  if (unlikely(!__pyx_cur_scope->__pyx_v_fe_span)) { __Pyx_RaiseClosureNameError("fe_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1941; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_v_fe_span)) { __Pyx_RaiseClosureNameError("fe_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1935; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1941; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_v_link_i = __pyx_t_8;
   __pyx_t_8 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1942
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1936
  *             # Aligned word
  *             link_i = fe_span[f_j][0]
  *             link_j = fe_span[f_j][1]             # <<<<<<<<<<<<<<
  *             new_e_i = min(link_i, e_i)
  *             new_e_j = max(link_j, e_j)
  */
-  __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f_j); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f_j); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
-  __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1942; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1936; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __pyx_v_link_j = __pyx_t_4;
   __pyx_t_4 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1943
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1937
  *             link_i = fe_span[f_j][0]
  *             link_j = fe_span[f_j][1]
  *             new_e_i = min(link_i, e_i)             # <<<<<<<<<<<<<<
@@ -58591,8 +58384,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __pyx_t_4 = __pyx_v_e_i;
   __Pyx_INCREF(__pyx_v_link_i);
   __pyx_t_8 = __pyx_v_link_i;
-  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_8, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1943; __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 = 1943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_8, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_6) {
     __Pyx_INCREF(__pyx_t_4);
@@ -58607,7 +58401,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __pyx_v_new_e_i = __pyx_t_2;
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1944
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1938
  *             link_j = fe_span[f_j][1]
  *             new_e_i = min(link_i, e_i)
  *             new_e_j = max(link_j, e_j)             # <<<<<<<<<<<<<<
@@ -58618,8 +58412,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __pyx_t_2 = __pyx_v_e_j;
   __Pyx_INCREF(__pyx_v_link_j);
   __pyx_t_4 = __pyx_v_link_j;
-  __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __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 = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_1);
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1938; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_6) {
     __Pyx_INCREF(__pyx_t_2);
@@ -58634,7 +58429,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __pyx_v_new_e_j = __pyx_t_8;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1947
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1941
  *             # Check reverse links of newly covered words to see if they violate left
  *             # bound (return) or extend minimum right bound for chunk
  *             new_min_bound = min_bound             # <<<<<<<<<<<<<<
@@ -58644,54 +58439,56 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   __Pyx_INCREF(__pyx_v_min_bound);
   __pyx_v_new_min_bound = __pyx_v_min_bound;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1949
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1943
  *             new_min_bound = min_bound
  *             # First aligned word creates span
  *             if e_j == -1:             # <<<<<<<<<<<<<<
  *                 for i from new_e_i <= i <= new_e_j:
  *                     if ef_span[i][0] < f_i:
  */
-  __pyx_t_8 = PyObject_RichCompare(__pyx_v_e_j, __pyx_int_neg_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_RichCompare(__pyx_v_e_j, __pyx_int_neg_1, Py_EQ); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_8);
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1943; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   if (__pyx_t_6) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1950
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1944
  *             # First aligned word creates span
  *             if e_j == -1:
  *                 for i from new_e_i <= i <= new_e_j:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_new_e_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_new_e_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_new_e_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_new_e_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     for (__pyx_t_11 = __pyx_t_9; __pyx_t_11 <= __pyx_t_10; __pyx_t_11++) {
-      __pyx_t_8 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_XDECREF(__pyx_v_i);
       __pyx_v_i = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1951
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1945
  *             if e_j == -1:
  *                 for i from new_e_i <= i <= new_e_j:
  *                     if ef_span[i][0] < f_i:             # <<<<<<<<<<<<<<
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1945; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1945; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1952
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1946
  *                 for i from new_e_i <= i <= new_e_j:
  *                     if ef_span[i][0] < f_i:
  *                         return             # <<<<<<<<<<<<<<
@@ -58705,22 +58502,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L10:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1953
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1947
  *                     if ef_span[i][0] < f_i:
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])             # <<<<<<<<<<<<<<
  *             # Other aligned words extend span
  *             else:
  */
-      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_INCREF(__pyx_v_new_min_bound);
       __pyx_t_8 = __pyx_v_new_min_bound;
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __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 = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_8, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_6) {
         __Pyx_INCREF(__pyx_t_2);
@@ -58735,17 +58533,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_DECREF(__pyx_v_new_min_bound);
       __pyx_v_new_min_bound = __pyx_t_4;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1950
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1944
  *             # First aligned word creates span
  *             if e_j == -1:
  *                 for i from new_e_i <= i <= new_e_j:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1944; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_4;
@@ -58754,42 +58552,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   /*else*/ {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1956
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1950
  *             # Other aligned words extend span
  *             else:
  *                 for i from new_e_i <= i < e_i:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_new_e_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_e_i); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_new_e_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_e_i); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     for (__pyx_t_9 = __pyx_t_11; __pyx_t_9 < __pyx_t_10; __pyx_t_9++) {
-      __pyx_t_4 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_XDECREF(__pyx_v_i);
       __pyx_v_i = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1957
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1951
  *             else:
  *                 for i from new_e_i <= i < e_i:
  *                     if ef_span[i][0] < f_i:             # <<<<<<<<<<<<<<
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1958
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1952
  *                 for i from new_e_i <= i < e_i:
  *                     if ef_span[i][0] < f_i:
  *                         return             # <<<<<<<<<<<<<<
@@ -58803,22 +58602,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L13:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1959
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1953
  *                     if ef_span[i][0] < f_i:
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])             # <<<<<<<<<<<<<<
  *                 for i from e_j < i <= new_e_j:
  *                     if ef_span[i][0] < f_i:
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_INCREF(__pyx_v_new_min_bound);
       __pyx_t_4 = __pyx_v_new_min_bound;
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1959; __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 = 1959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1953; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_6) {
         __Pyx_INCREF(__pyx_t_2);
@@ -58833,58 +58633,59 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_DECREF(__pyx_v_new_min_bound);
       __pyx_v_new_min_bound = __pyx_t_8;
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1956
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1950
  *             # Other aligned words extend span
  *             else:
  *                 for i from new_e_i <= i < e_i:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_8 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1956; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyInt_FromLong(__pyx_t_9); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_8;
     __pyx_t_8 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1960
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1954
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  *                 for i from e_j < i <= new_e_j:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_e_j); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_new_e_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_v_e_j); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_v_new_e_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     for (__pyx_t_11 = __pyx_t_9+1; __pyx_t_11 <= __pyx_t_10; __pyx_t_11++) {
-      __pyx_t_8 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_XDECREF(__pyx_v_i);
       __pyx_v_i = __pyx_t_8;
       __pyx_t_8 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1961
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1955
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  *                 for i from e_j < i <= new_e_j:
  *                     if ef_span[i][0] < f_i:             # <<<<<<<<<<<<<<
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_ef_span)) { __Pyx_RaiseClosureNameError("ef_span"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1955; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_v_f_i, Py_LT); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1955; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1962
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1956
  *                 for i from e_j < i <= new_e_j:
  *                     if ef_span[i][0] < f_i:
  *                         return             # <<<<<<<<<<<<<<
@@ -58898,22 +58699,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L16:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1963
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1957
  *                     if ef_span[i][0] < f_i:
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])             # <<<<<<<<<<<<<<
  *             # Extract, extend with word (unless non-terminal open)
  *             if not nt_open:
  */
-      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_i); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_INCREF(__pyx_v_new_min_bound);
       __pyx_t_8 = __pyx_v_new_min_bound;
-      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1963; __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 = 1963; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_8, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1957; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_6) {
         __Pyx_INCREF(__pyx_t_2);
@@ -58928,17 +58730,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_DECREF(__pyx_v_new_min_bound);
       __pyx_v_new_min_bound = __pyx_t_4;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = __Pyx_PyInt_AsInt(__pyx_v_i); if (unlikely((__pyx_t_11 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1960
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1954
  *                         return
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  *                 for i from e_j < i <= new_e_j:             # <<<<<<<<<<<<<<
  *                     if ef_span[i][0] < f_i:
  *                         return
  */
-    __pyx_t_4 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_t_11); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1954; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_4;
@@ -58946,18 +58748,18 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   __pyx_L7:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1965
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1959
  *                     new_min_bound = max(new_min_bound, ef_span[i][1])
  *             # Extract, extend with word (unless non-terminal open)
  *             if not nt_open:             # <<<<<<<<<<<<<<
  *                 nt_collision = False
  *                 for link in al[f_j]:
  */
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt_open); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1965; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt_open); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_3 = (!__pyx_t_6);
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1966
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1960
  *             # Extract, extend with word (unless non-terminal open)
  *             if not nt_open:
  *                 nt_collision = False             # <<<<<<<<<<<<<<
@@ -58966,20 +58768,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
  */
     __pyx_v_nt_collision = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1967
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1961
  *             if not nt_open:
  *                 nt_collision = False
  *                 for link in al[f_j]:             # <<<<<<<<<<<<<<
  *                     if e_nt_cover[link]:
  *                         nt_collision = True
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __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_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
       __pyx_t_12 = NULL;
     } else {
-      __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __pyx_t_12 = Py_TYPE(__pyx_t_2)->tp_iternext;
     }
@@ -58987,24 +58789,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     for (;;) {
       if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_2)) {
         if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
       } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_2)) {
         if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
       } else {
         __pyx_t_4 = __pyx_t_12(__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 = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1961; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -59014,21 +58808,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __pyx_v_link = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1968
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1962
  *                 nt_collision = False
  *                 for link in al[f_j]:
  *                     if e_nt_cover[link]:             # <<<<<<<<<<<<<<
  *                         nt_collision = True
  *                 # Non-terminal collisions block word extraction and extension, but
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1968; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_e_nt_cover, __pyx_v_link); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1962; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_e_nt_cover, __pyx_v_link); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1962; __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[8]; __pyx_lineno = 1968; __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[8]; __pyx_lineno = 1962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1969
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1963
  *                 for link in al[f_j]:
  *                     if e_nt_cover[link]:
  *                         nt_collision = True             # <<<<<<<<<<<<<<
@@ -59042,7 +58836,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1972
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1966
  *                 # Non-terminal collisions block word extraction and extension, but
  *                 # may be okay for continuing non-terminals
  *                 if not nt_collision and wc < self.max_length:             # <<<<<<<<<<<<<<
@@ -59051,11 +58845,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
  */
     __pyx_t_3 = (!__pyx_v_nt_collision);
     if (__pyx_t_3) {
-      __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1966; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_5 = __pyx_t_6;
     } else {
@@ -59063,32 +58858,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1973
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1967
  *                 # may be okay for continuing non-terminals
  *                 if not nt_collision and wc < self.max_length:
  *                     plus_links = []             # <<<<<<<<<<<<<<
  *                     for link in al[f_j]:
  *                         plus_links.append((f_j, link))
  */
-      __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1967; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __pyx_v_plus_links = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1974
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1968
  *                 if not nt_collision and wc < self.max_length:
  *                     plus_links = []
  *                     for link in al[f_j]:             # <<<<<<<<<<<<<<
  *                         plus_links.append((f_j, link))
  *                         cover[link] += 1
  */
-      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1968; __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_2 = __pyx_t_4; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
         __pyx_t_12 = NULL;
       } else {
-        __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
         __pyx_t_12 = Py_TYPE(__pyx_t_2)->tp_iternext;
       }
@@ -59096,24 +58891,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       for (;;) {
         if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_2)) {
           if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_4 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
         } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_2)) {
           if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_4 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_4); __pyx_t_7++;
         } else {
           __pyx_t_4 = __pyx_t_12(__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 = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
@@ -59123,14 +58910,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
         __pyx_v_link = __pyx_t_4;
         __pyx_t_4 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1975
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1969
  *                     plus_links = []
  *                     for link in al[f_j]:
  *                         plus_links.append((f_j, link))             # <<<<<<<<<<<<<<
  *                         cover[link] += 1
  *                     links.append(plus_links)
  */
-        __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1975; __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 = 1969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_INCREF(__pyx_v_f_j);
         PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_f_j);
@@ -59138,10 +58925,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
         __Pyx_INCREF(__pyx_v_link);
         PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_link);
         __Pyx_GIVEREF(__pyx_v_link);
-        __pyx_t_13 = PyList_Append(__pyx_v_plus_links, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_13 = PyList_Append(__pyx_v_plus_links, ((PyObject *)__pyx_t_4)); if (unlikely(__pyx_t_13 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1976
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1970
  *                     for link in al[f_j]:
  *                         plus_links.append((f_j, link))
  *                         cover[link] += 1             # <<<<<<<<<<<<<<
@@ -59150,41 +58937,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
  */
         __Pyx_INCREF(__pyx_v_link);
         __pyx_t_4 = __pyx_v_link;
-        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_4); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1970; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_8 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_4); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_4, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1970; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_4, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1970; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       }
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1977
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1971
  *                         plus_links.append((f_j, link))
  *                         cover[link] += 1
  *                     links.append(plus_links)             # <<<<<<<<<<<<<<
  *                     if links and f_j >= new_min_bound:
  *                         rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  */
-      __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_links, ((PyObject *)__pyx_v_plus_links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_links, ((PyObject *)__pyx_v_plus_links)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1971; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1978
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1972
  *                         cover[link] += 1
  *                     links.append(plus_links)
  *                     if links and f_j >= new_min_bound:             # <<<<<<<<<<<<<<
  *                         rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                     extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  */
-      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_5) {
-        __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1978; __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 = 1978; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1972; __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[8]; __pyx_lineno = 1972; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_6 = __pyx_t_3;
       } else {
@@ -59192,35 +58980,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1979
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1973
  *                     links.append(plus_links)
  *                     if links and f_j >= new_min_bound:
  *                         rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))             # <<<<<<<<<<<<<<
  *                     extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                     links.pop()
  */
-        if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __pyx_t_8 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-        __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
-        __pyx_t_15 = PyTuple_New(6); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_15 = PyTuple_New(6); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         __Pyx_INCREF(__pyx_v_f_i);
         PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_v_f_i);
@@ -59240,16 +59028,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
         __Pyx_GIVEREF(__pyx_v_links);
         __pyx_t_1 = 0;
         __pyx_t_8 = 0;
-        __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __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_15)); __pyx_t_15 = 0;
-        __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __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 = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
         PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_8);
         __Pyx_GIVEREF(__pyx_t_8);
         __pyx_t_8 = 0;
-        __pyx_t_8 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -59258,21 +59046,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L24:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1980
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1974
  *                     if links and f_j >= new_min_bound:
  *                         rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                     extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)             # <<<<<<<<<<<<<<
  *                     links.pop()
  *                     for link in al[f_j]:
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_8 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_8 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_15 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_f_i);
@@ -59301,36 +59089,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __pyx_t_8 = 0;
       __pyx_t_15 = 0;
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1980; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1974; __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;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1981
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1975
  *                         rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                     extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                     links.pop()             # <<<<<<<<<<<<<<
  *                     for link in al[f_j]:
  *                         cover[link] -= 1
  */
-      __pyx_t_2 = __Pyx_PyObject_Pop(__pyx_v_links); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PyObject_Pop(__pyx_v_links); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1975; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1982
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1976
  *                     extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                     links.pop()
  *                     for link in al[f_j]:             # <<<<<<<<<<<<<<
  *                         cover[link] -= 1
  *             # Try to add a word to current non-terminal (if any), extract, extend
  */
-      __pyx_t_2 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_j); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       if (PyList_CheckExact(__pyx_t_2) || PyTuple_CheckExact(__pyx_t_2)) {
         __pyx_t_4 = __pyx_t_2; __Pyx_INCREF(__pyx_t_4); __pyx_t_7 = 0;
         __pyx_t_12 = NULL;
       } else {
-        __pyx_t_7 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __pyx_t_12 = Py_TYPE(__pyx_t_4)->tp_iternext;
       }
@@ -59338,24 +59126,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       for (;;) {
         if (!__pyx_t_12 && PyList_CheckExact(__pyx_t_4)) {
           if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_4)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
         } else if (!__pyx_t_12 && PyTuple_CheckExact(__pyx_t_4)) {
           if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
-          #if CYTHON_COMPILING_IN_CPYTHON
-          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #else
-          __pyx_t_2 = PySequence_ITEM(__pyx_t_4, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-          #endif
+          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_7); __Pyx_INCREF(__pyx_t_2); __pyx_t_7++;
         } else {
           __pyx_t_2 = __pyx_t_12(__pyx_t_4);
           if (unlikely(!__pyx_t_2)) {
             if (PyErr_Occurred()) {
               if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+              else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1976; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
             }
             break;
           }
@@ -59365,7 +59145,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
         __pyx_v_link = __pyx_t_2;
         __pyx_t_2 = 0;
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1983
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1977
  *                     links.pop()
  *                     for link in al[f_j]:
  *                         cover[link] -= 1             # <<<<<<<<<<<<<<
@@ -59374,14 +59154,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
  */
         __Pyx_INCREF(__pyx_v_link);
         __pyx_t_2 = __pyx_v_link;
-        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_15 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_2); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_15 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_2); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_15);
-        __pyx_t_8 = PyNumber_InPlaceSubtract(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = PyNumber_InPlaceSubtract(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_8);
         __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_2, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        if (PyObject_SetItem(__pyx_cur_scope->__pyx_v_cover, __pyx_t_2, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       }
@@ -59393,26 +59173,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   __pyx_L17:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1985
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1979
  *                         cover[link] -= 1
  *             # Try to add a word to current non-terminal (if any), extract, extend
  *             if nt and nt[-1][2] == f_j - 1:             # <<<<<<<<<<<<<<
  *                 # Add to non-terminal, checking for collisions
  *                 old_last_nt = nt[-1][:]
  */
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_6) {
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_EQ); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1979; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     __pyx_t_3 = __pyx_t_5;
   } else {
@@ -59420,70 +59201,71 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1987
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1981
  *             if nt and nt[-1][2] == f_j - 1:
  *                 # Add to non-terminal, checking for collisions
  *                 old_last_nt = nt[-1][:]             # <<<<<<<<<<<<<<
  *                 nt[-1][2] = f_j
  *                 if link_i < nt[-1][3]:
  */
-    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_t_8, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_t_8, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1981; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     __pyx_v_old_last_nt = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1988
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1982
  *                 # Add to non-terminal, checking for collisions
  *                 old_last_nt = nt[-1][:]
  *                 nt[-1][2] = f_j             # <<<<<<<<<<<<<<
  *                 if link_i < nt[-1][3]:
  *                     if not span_check(cover, link_i, nt[-1][3] - 1):
  */
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (__Pyx_SetItemInt(__pyx_t_4, 2, __pyx_v_f_j, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_4, 2, __pyx_v_f_j, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1982; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1989
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1983
  *                 old_last_nt = nt[-1][:]
  *                 nt[-1][2] = f_j
  *                 if link_i < nt[-1][3]:             # <<<<<<<<<<<<<<
  *                     if not span_check(cover, link_i, nt[-1][3] - 1):
  *                         nt[-1] = old_last_nt
  */
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_link_i, __pyx_t_8, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_link_i, __pyx_t_8, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __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[8]; __pyx_lineno = 1983; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_3) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1990
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1984
  *                 nt[-1][2] = f_j
  *                 if link_i < nt[-1][3]:
  *                     if not span_check(cover, link_i, nt[-1][3] - 1):             # <<<<<<<<<<<<<<
  *                         nt[-1] = old_last_nt
  *                         return
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Subtract(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyNumber_Subtract(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __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 = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -59494,25 +59276,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __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_2)); __pyx_t_2 = 0;
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_t_6 = (!__pyx_t_3);
       if (__pyx_t_6) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1991
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1985
  *                 if link_i < nt[-1][3]:
  *                     if not span_check(cover, link_i, nt[-1][3] - 1):
  *                         nt[-1] = old_last_nt             # <<<<<<<<<<<<<<
  *                         return
  *                     span_inc(cover, link_i, nt[-1][3] - 1)
  */
-        if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1992
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1986
  *                     if not span_check(cover, link_i, nt[-1][3] - 1):
  *                         nt[-1] = old_last_nt
  *                         return             # <<<<<<<<<<<<<<
@@ -59526,24 +59308,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L29:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1993
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1987
  *                         nt[-1] = old_last_nt
  *                         return
  *                     span_inc(cover, link_i, nt[-1][3] - 1)             # <<<<<<<<<<<<<<
  *                     span_inc(e_nt_cover, link_i, nt[-1][3] - 1)
  *                     nt[-1][3] = link_i
  */
-      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __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 = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -59554,31 +59336,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1993; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1987; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1994
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1988
  *                         return
  *                     span_inc(cover, link_i, nt[-1][3] - 1)
  *                     span_inc(e_nt_cover, link_i, nt[-1][3] - 1)             # <<<<<<<<<<<<<<
  *                     nt[-1][3] = link_i
  *                 if link_j > nt[-1][4]:
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyNumber_Subtract(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Subtract(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
       PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -59589,64 +59371,65 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1988; __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_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1995
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1989
  *                     span_inc(cover, link_i, nt[-1][3] - 1)
  *                     span_inc(e_nt_cover, link_i, nt[-1][3] - 1)
  *                     nt[-1][3] = link_i             # <<<<<<<<<<<<<<
  *                 if link_j > nt[-1][4]:
  *                     if not span_check(cover, nt[-1][4] + 1, link_j):
  */
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (__Pyx_SetItemInt(__pyx_t_4, 3, __pyx_v_link_i, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_SetItemInt(__pyx_t_4, 3, __pyx_v_link_i, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L28;
     }
     __pyx_L28:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1996
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1990
  *                     span_inc(e_nt_cover, link_i, nt[-1][3] - 1)
  *                     nt[-1][3] = link_i
  *                 if link_j > nt[-1][4]:             # <<<<<<<<<<<<<<
  *                     if not span_check(cover, nt[-1][4] + 1, link_j):
  *                         nt[-1] = old_last_nt
  */
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_link_j, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_link_j, __pyx_t_8, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1990; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_6) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1997
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1991
  *                     nt[-1][3] = link_i
  *                 if link_j > nt[-1][4]:
  *                     if not span_check(cover, nt[-1][4] + 1, link_j):             # <<<<<<<<<<<<<<
  *                         nt[-1] = old_last_nt
  *                         return
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_8, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __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 = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -59657,25 +59440,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_link_j);
       __Pyx_GIVEREF(__pyx_v_link_j);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __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_2)); __pyx_t_2 = 0;
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1991; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __pyx_t_3 = (!__pyx_t_6);
       if (__pyx_t_3) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1998
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1992
  *                 if link_j > nt[-1][4]:
  *                     if not span_check(cover, nt[-1][4] + 1, link_j):
  *                         nt[-1] = old_last_nt             # <<<<<<<<<<<<<<
  *                         return
  *                     span_inc(cover, nt[-1][4] + 1, link_j)
  */
-        if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1992; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1999
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1993
  *                     if not span_check(cover, nt[-1][4] + 1, link_j):
  *                         nt[-1] = old_last_nt
  *                         return             # <<<<<<<<<<<<<<
@@ -59689,24 +59472,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       }
       __pyx_L31:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2000
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1994
  *                         nt[-1] = old_last_nt
  *                         return
  *                     span_inc(cover, nt[-1][4] + 1, link_j)             # <<<<<<<<<<<<<<
  *                     span_inc(e_nt_cover, nt[-1][4] + 1, link_j)
  *                     nt[-1][4] = link_j
  */
-      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_2, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __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 = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -59717,31 +59500,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_link_j);
       __Pyx_GIVEREF(__pyx_v_link_j);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1994; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2001
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1995
  *                         return
  *                     span_inc(cover, nt[-1][4] + 1, link_j)
  *                     span_inc(e_nt_cover, nt[-1][4] + 1, link_j)             # <<<<<<<<<<<<<<
  *                     nt[-1][4] = link_j
  *                 if links and f_j >= new_min_bound:
  */
-      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyNumber_Add(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_t_8, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyTuple_New(3); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
       PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -59752,38 +59535,39 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_8, 2, __pyx_v_link_j);
       __Pyx_GIVEREF(__pyx_v_link_j);
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1995; __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_8)); __pyx_t_8 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2002
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1996
  *                     span_inc(cover, nt[-1][4] + 1, link_j)
  *                     span_inc(e_nt_cover, nt[-1][4] + 1, link_j)
  *                     nt[-1][4] = link_j             # <<<<<<<<<<<<<<
  *                 if links and f_j >= new_min_bound:
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  */
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (__Pyx_SetItemInt(__pyx_t_4, 4, __pyx_v_link_j, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__Pyx_SetItemInt(__pyx_t_4, 4, __pyx_v_link_j, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1996; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       goto __pyx_L30;
     }
     __pyx_L30:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2003
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1997
  *                     span_inc(e_nt_cover, nt[-1][4] + 1, link_j)
  *                     nt[-1][4] = link_j
  *                 if links and f_j >= new_min_bound:             # <<<<<<<<<<<<<<
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc, links, nt, False)
  */
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_3) {
-      __pyx_t_4 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_4);
+      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1997; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_5 = __pyx_t_6;
     } else {
@@ -59791,35 +59575,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2004
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1998
  *                     nt[-1][4] = link_j
  *                 if links and f_j >= new_min_bound:
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))             # <<<<<<<<<<<<<<
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc, links, nt, False)
  *                 nt[-1] = old_last_nt
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_2 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_2); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_15 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_15); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_15); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_15 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f_i);
@@ -59839,16 +59623,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_GIVEREF(__pyx_v_links);
       __pyx_t_2 = 0;
       __pyx_t_15 = 0;
-      __pyx_t_15 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __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 = 2004; __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 = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_15);
       __Pyx_GIVEREF(__pyx_t_15);
       __pyx_t_15 = 0;
-      __pyx_t_15 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1998; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -59857,19 +59641,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __pyx_L32:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2005
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1999
  *                 if links and f_j >= new_min_bound:
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc, links, nt, False)             # <<<<<<<<<<<<<<
  *                 nt[-1] = old_last_nt
  *                 if link_i < nt[-1][3]:
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_15 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1999; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_15 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
-    __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __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 = 1999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyTuple_New(9); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(__pyx_v_f_i);
     PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_f_i);
@@ -59898,57 +59682,58 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_GIVEREF(__pyx_t_1);
     __pyx_t_15 = 0;
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2006
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2000
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc, links, nt, False)
  *                 nt[-1] = old_last_nt             # <<<<<<<<<<<<<<
  *                 if link_i < nt[-1][3]:
  *                     span_dec(cover, link_i, nt[-1][3] - 1)
  */
-    if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_v_nt, -1, __pyx_v_old_last_nt, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2007
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2001
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc, links, nt, False)
  *                 nt[-1] = old_last_nt
  *                 if link_i < nt[-1][3]:             # <<<<<<<<<<<<<<
  *                     span_dec(cover, link_i, nt[-1][3] - 1)
  *                     span_dec(e_nt_cover, link_i, nt[-1][3] - 1)
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_link_i, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_link_i, __pyx_t_4, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2007; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2001; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2008
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2002
  *                 nt[-1] = old_last_nt
  *                 if link_i < nt[-1][3]:
  *                     span_dec(cover, link_i, nt[-1][3] - 1)             # <<<<<<<<<<<<<<
  *                     span_dec(e_nt_cover, link_i, nt[-1][3] - 1)
  *                 if link_j > nt[-1][4]:
  */
-      __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyNumber_Subtract(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Subtract(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -59959,31 +59744,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2009
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2003
  *                 if link_i < nt[-1][3]:
  *                     span_dec(cover, link_i, nt[-1][3] - 1)
  *                     span_dec(e_nt_cover, link_i, nt[-1][3] - 1)             # <<<<<<<<<<<<<<
  *                 if link_j > nt[-1][4]:
  *                     span_dec(cover, nt[-1][4] + 1, link_j)
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_15, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_15, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_15 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Subtract(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -59994,7 +59779,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_15);
       __Pyx_GIVEREF(__pyx_t_15);
       __pyx_t_15 = 0;
-      __pyx_t_15 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2009; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -60003,43 +59788,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __pyx_L33:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2010
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2004
  *                     span_dec(cover, link_i, nt[-1][3] - 1)
  *                     span_dec(e_nt_cover, link_i, nt[-1][3] - 1)
  *                 if link_j > nt[-1][4]:             # <<<<<<<<<<<<<<
  *                     span_dec(cover, nt[-1][4] + 1, link_j)
  *                     span_dec(e_nt_cover, nt[-1][4] + 1, link_j)
  */
-    __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_15, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_15, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-    __pyx_t_15 = PyObject_RichCompare(__pyx_v_link_j, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyObject_RichCompare(__pyx_v_link_j, __pyx_t_1, Py_GT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_15);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2004; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
     if (__pyx_t_5) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2011
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2005
  *                     span_dec(e_nt_cover, link_i, nt[-1][3] - 1)
  *                 if link_j > nt[-1][4]:
  *                     span_dec(cover, nt[-1][4] + 1, link_j)             # <<<<<<<<<<<<<<
  *                     span_dec(e_nt_cover, nt[-1][4] + 1, link_j)
  *             # Try to start a new non-terminal, extract, extend
  */
-      __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_1, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __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 = 2005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -60050,31 +59836,31 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_link_j);
       __Pyx_GIVEREF(__pyx_v_link_j);
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2005; __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_4)); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2012
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2006
  *                 if link_j > nt[-1][4]:
  *                     span_dec(cover, nt[-1][4] + 1, link_j)
  *                     span_dec(e_nt_cover, nt[-1][4] + 1, link_j)             # <<<<<<<<<<<<<<
  *             # Try to start a new non-terminal, extract, extend
  *             if (not nt or f_j - nt[-1][2] > 1) and wc < self.max_length and len(nt) < self.max_nonterminals:
  */
-      __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyNumber_Add(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_t_15, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
       PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -60085,7 +59871,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
       __Pyx_GIVEREF(__pyx_v_link_j);
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -60097,41 +59883,43 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   __pyx_L27:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2014
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2008
  *                     span_dec(e_nt_cover, nt[-1][4] + 1, link_j)
  *             # Try to start a new non-terminal, extract, extend
  *             if (not nt or f_j - nt[-1][2] > 1) and wc < self.max_length and len(nt) < self.max_nonterminals:             # <<<<<<<<<<<<<<
  *                 # Check for collisions
  *                 if not span_check(cover, link_i, link_j):
  */
-  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_t_3 = (!__pyx_t_5);
   if (!__pyx_t_3) {
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = __Pyx_GetItemInt(__pyx_t_4, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_t_15); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Subtract(__pyx_v_f_j, __pyx_t_15); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-    __pyx_t_15 = PyObject_RichCompare(__pyx_t_4, __pyx_int_1, Py_GT); __Pyx_XGOTREF(__pyx_t_15); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyObject_RichCompare(__pyx_t_4, __pyx_int_1, Py_GT); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_15);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_15); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
     __pyx_t_6 = __pyx_t_5;
   } else {
     __pyx_t_6 = __pyx_t_3;
   }
   if (__pyx_t_6) {
-    __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_15, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_v_wc, __pyx_t_15, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __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[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     if (__pyx_t_3) {
-      __pyx_t_7 = PyObject_Length(__pyx_v_nt); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_Length(__pyx_v_nt); if (unlikely(__pyx_t_7 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_t_5 = (__pyx_t_7 < __pyx_cur_scope->__pyx_v_self->max_nonterminals);
       __pyx_t_16 = __pyx_t_5;
     } else {
@@ -60143,17 +59931,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2016
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2010
  *             if (not nt or f_j - nt[-1][2] > 1) and wc < self.max_length and len(nt) < self.max_nonterminals:
  *                 # Check for collisions
  *                 if not span_check(cover, link_i, link_j):             # <<<<<<<<<<<<<<
  *                     return
  *                 span_inc(cover, link_i, link_j)
  */
-    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_check); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_cover)) { __Pyx_RaiseClosureNameError("cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -60164,16 +59952,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_INCREF(__pyx_v_link_j);
     PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
-    __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_6 = (!__pyx_t_3);
     if (__pyx_t_6) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2017
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2011
  *                 # Check for collisions
  *                 if not span_check(cover, link_i, link_j):
  *                     return             # <<<<<<<<<<<<<<
@@ -60187,16 +59975,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __pyx_L36:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2018
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2012
  *                 if not span_check(cover, link_i, link_j):
  *                     return
  *                 span_inc(cover, link_i, link_j)             # <<<<<<<<<<<<<<
  *                 span_inc(e_nt_cover, link_i, link_j)
  *                 nt.append([(nt[-1][0] + 1) if nt else 1, f_j, f_j, link_i, link_j])
  */
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -60207,23 +59995,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_INCREF(__pyx_v_link_j);
     PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
-    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2012; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2019
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2013
  *                     return
  *                 span_inc(cover, link_i, link_j)
  *                 span_inc(e_nt_cover, link_i, link_j)             # <<<<<<<<<<<<<<
  *                 nt.append([(nt[-1][0] + 1) if nt else 1, f_j, f_j, link_i, link_j])
  *                 # Require at least one word in phrase
  */
-    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_inc); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2019; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_e_nt_cover)) { __Pyx_RaiseClosureNameError("e_nt_cover"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2013; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -60234,27 +60022,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_INCREF(__pyx_v_link_j);
     PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
-    __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2020
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2014
  *                 span_inc(cover, link_i, link_j)
  *                 span_inc(e_nt_cover, link_i, link_j)
  *                 nt.append([(nt[-1][0] + 1) if nt else 1, f_j, f_j, link_i, link_j])             # <<<<<<<<<<<<<<
  *                 # Require at least one word in phrase
  *                 if links and f_j >= new_min_bound:
  */
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_6) {
-      __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_15) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_15, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
-      __pyx_t_15 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __pyx_t_1 = __pyx_t_15;
@@ -60263,7 +60051,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_INCREF(__pyx_int_1);
       __pyx_t_1 = __pyx_int_1;
     }
-    __pyx_t_15 = PyList_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyList_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     PyList_SET_ITEM(__pyx_t_15, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
@@ -60280,22 +60068,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     PyList_SET_ITEM(__pyx_t_15, 4, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
     __pyx_t_1 = 0;
-    __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_nt, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Append(__pyx_v_nt, ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2014; __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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2022
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2016
  *                 nt.append([(nt[-1][0] + 1) if nt else 1, f_j, f_j, link_i, link_j])
  *                 # Require at least one word in phrase
  *                 if links and f_j >= new_min_bound:             # <<<<<<<<<<<<<<
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  */
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_links); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_6) {
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_f_j, __pyx_v_new_min_bound, Py_GE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __pyx_t_16 = __pyx_t_3;
     } else {
@@ -60303,35 +60092,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     if (__pyx_t_16) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2023
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2017
  *                 # Require at least one word in phrase
  *                 if links and f_j >= new_min_bound:
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))             # <<<<<<<<<<<<<<
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                 nt.pop()
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_rules)) { __Pyx_RaiseClosureNameError("rules"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_1 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_rules, __pyx_n_s__add); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__form_rule); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_15);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_v_f_i); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_f_words, __pyx_t_7, __pyx_t_14); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_e_words)) { __Pyx_RaiseClosureNameError("e_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_14 = __Pyx_PyIndex_AsSsize_t(__pyx_v_new_e_i); if (unlikely((__pyx_t_14 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyNumber_Add(__pyx_v_new_e_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_PyIndex_AsSsize_t(__pyx_t_8); if (unlikely((__pyx_t_7 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-      __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PySequence_GetSlice(__pyx_cur_scope->__pyx_v_e_words, __pyx_t_14, __pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
-      __pyx_t_2 = PyTuple_New(6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f_i);
@@ -60351,16 +60140,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
       __Pyx_GIVEREF(__pyx_v_links);
       __pyx_t_4 = 0;
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
       __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[8]; __pyx_lineno = 2023; __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 = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
       __Pyx_GIVEREF(__pyx_t_8);
       __pyx_t_8 = 0;
-      __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -60369,21 +60158,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     }
     __pyx_L37:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2024
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2018
  *                 if links and f_j >= new_min_bound:
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)             # <<<<<<<<<<<<<<
  *                 nt.pop()
  *                 span_dec(cover, link_i, link_j)
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_8 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_8 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_2 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __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 = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_15 = PyTuple_New(9); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyTuple_New(9); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_v_f_i);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_v_f_i);
@@ -60412,32 +60201,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __pyx_t_8 = 0;
     __pyx_t_2 = 0;
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2018; __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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2025
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2019
  *                     rules.add(self.form_rule(f_i, new_e_i, f_words[f_i:f_j + 1], e_words[new_e_i:new_e_j + 1], nt, links))
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                 nt.pop()             # <<<<<<<<<<<<<<
  *                 span_dec(cover, link_i, link_j)
  *                 span_dec(e_nt_cover, link_i, link_j)
  */
-    __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_nt); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2025; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_nt); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2019; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2026
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2020
  *                 extract(f_i, f_j + 1, new_e_i, new_e_j, new_min_bound, wc + 1, links, nt, False)
  *                 nt.pop()
  *                 span_dec(cover, link_i, link_j)             # <<<<<<<<<<<<<<
  *                 span_dec(e_nt_cover, link_i, link_j)
  * 
  */
-    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cover);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_cover);
@@ -60448,22 +60237,22 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_INCREF(__pyx_v_link_j);
     PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
-    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2020; __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_15)); __pyx_t_15 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2027
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2021
  *                 nt.pop()
  *                 span_dec(cover, link_i, link_j)
  *                 span_dec(e_nt_cover, link_i, link_j)             # <<<<<<<<<<<<<<
  * 
  *         # Try to extract phrases from every f index
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__span_dec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_15 = PyTuple_New(3); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_15);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_nt_cover);
     PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_cur_scope->__pyx_v_e_nt_cover);
@@ -60474,7 +60263,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
     __Pyx_INCREF(__pyx_v_link_j);
     PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_v_link_j);
     __Pyx_GIVEREF(__pyx_v_link_j);
-    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2021; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0;
@@ -60508,7 +60297,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_12add_instance_extract(
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1890
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1884
  *     # Aggregate stats from a training instance
  *     # (Extract rules, update counts)
  *     def add_instance(self, f_words, e_words, alignment):             # <<<<<<<<<<<<<<
@@ -60569,7 +60358,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_e_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_e_words);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1892
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1886
  *     def add_instance(self, f_words, e_words, alignment):
  * 
  *         self.online = True             # <<<<<<<<<<<<<<
@@ -60578,20 +60367,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
   __pyx_cur_scope->__pyx_v_self->online = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1899
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1893
  *         # span more than once.
  *         # (f, e, al, lex_f_i, lex_f_j)
  *         rules = set()             # <<<<<<<<<<<<<<
  * 
  *         f_len = len(f_words)
  */
-  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_rules = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1901
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1895
  *         rules = set()
  * 
  *         f_len = len(f_words)             # <<<<<<<<<<<<<<
@@ -60600,15 +60389,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_f_words;
   __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 = 1901; __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 = 1895; __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 = 1901; __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 = 1895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_f_len = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1902
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1896
  * 
  *         f_len = len(f_words)
  *         e_len = len(e_words)             # <<<<<<<<<<<<<<
@@ -60617,35 +60406,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_e_words;
   __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 = 1902; __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 = 1896; __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 = 1902; __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 = 1896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_e_len = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1905
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1899
  * 
  *         # Pre-compute alignment info
  *         al = [[] for i in range(f_len)]             # <<<<<<<<<<<<<<
  *         fe_span = [[e_len + 1, -1] for i in range(f_len)]
  *         ef_span = [[f_len + 1, -1] for i in range(e_len)]
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __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 = 1899; __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[8]; __pyx_lineno = 1905; __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 = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f_len);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_f_len);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f_len);
-  __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
     __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
@@ -60653,24 +60442,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_5(__pyx_t_3);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -60679,9 +60460,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __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[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -60690,28 +60471,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_cur_scope->__pyx_v_al = ((PyObject *)__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1906
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1900
  *         # Pre-compute alignment info
  *         al = [[] for i in range(f_len)]
  *         fe_span = [[e_len + 1, -1] for i in range(f_len)]             # <<<<<<<<<<<<<<
  *         ef_span = [[f_len + 1, -1] for i in range(e_len)]
  *         for (f, e) in alignment:
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __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 = 1900; __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[8]; __pyx_lineno = 1906; __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 = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f_len);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_f_len);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f_len);
-  __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   if (PyList_CheckExact(__pyx_t_4) || PyTuple_CheckExact(__pyx_t_4)) {
     __pyx_t_3 = __pyx_t_4; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
@@ -60719,24 +60500,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_4 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } else {
       __pyx_t_4 = __pyx_t_5(__pyx_t_3);
       if (unlikely(!__pyx_t_4)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -60745,9 +60518,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyNumber_Add(__pyx_v_e_len, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_Add(__pyx_v_e_len, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyList_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     PyList_SET_ITEM(__pyx_t_6, 0, __pyx_t_4);
     __Pyx_GIVEREF(__pyx_t_4);
@@ -60755,7 +60528,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     PyList_SET_ITEM(__pyx_t_6, 1, __pyx_int_neg_1);
     __Pyx_GIVEREF(__pyx_int_neg_1);
     __pyx_t_4 = 0;
-    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_6))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -60764,28 +60537,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_cur_scope->__pyx_v_fe_span = ((PyObject *)__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1907
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1901
  *         al = [[] for i in range(f_len)]
  *         fe_span = [[e_len + 1, -1] for i in range(f_len)]
  *         ef_span = [[f_len + 1, -1] for i in range(e_len)]             # <<<<<<<<<<<<<<
  *         for (f, e) in alignment:
  *             al[f].append(e)
  */
-  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __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 = 1901; __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[8]; __pyx_lineno = 1907; __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 = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_v_e_len);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_e_len);
   __Pyx_GIVEREF(__pyx_v_e_len);
-  __pyx_t_6 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = PyObject_Call(__pyx_builtin_range, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_6);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   if (PyList_CheckExact(__pyx_t_6) || PyTuple_CheckExact(__pyx_t_6)) {
     __pyx_t_3 = __pyx_t_6; __Pyx_INCREF(__pyx_t_3); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
@@ -60793,24 +60566,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_6 = PySequence_ITEM(__pyx_t_3, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++;
     } else {
       __pyx_t_6 = __pyx_t_5(__pyx_t_3);
       if (unlikely(!__pyx_t_6)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -60819,9 +60584,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_6;
     __pyx_t_6 = 0;
-    __pyx_t_6 = PyNumber_Add(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __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 = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_6);
     __Pyx_GIVEREF(__pyx_t_6);
@@ -60829,7 +60594,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     PyList_SET_ITEM(__pyx_t_4, 1, __pyx_int_neg_1);
     __Pyx_GIVEREF(__pyx_int_neg_1);
     __pyx_t_6 = 0;
-    if (unlikely(__Pyx_PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(PyList_Append(__pyx_t_1, (PyObject*)__pyx_t_4))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
@@ -60838,7 +60603,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_cur_scope->__pyx_v_ef_span = ((PyObject *)__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1908
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1902
  *         fe_span = [[e_len + 1, -1] for i in range(f_len)]
  *         ef_span = [[f_len + 1, -1] for i in range(e_len)]
  *         for (f, e) in alignment:             # <<<<<<<<<<<<<<
@@ -60849,31 +60614,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_1 = __pyx_v_alignment; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_alignment); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_alignment); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   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 = 1908; __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 = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
     } 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 = 1908; __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 = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++;
     } 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 = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -60881,35 +60638,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     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 = 1908; __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 = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_4 = 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 = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
       }
       __Pyx_INCREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_t_6);
-      #else
-      __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1908; __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 = 1908; __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_7 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1908; __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 = 1902; __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;
@@ -60917,15 +60668,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __Pyx_GOTREF(__pyx_t_4);
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L11_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 = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L12_unpacking_done;
       __pyx_L11_unpacking_failed:;
       __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 = 1908; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L12_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_f);
@@ -60935,21 +60685,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_v_e = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1909
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1903
  *         ef_span = [[f_len + 1, -1] for i in range(e_len)]
  *         for (f, e) in alignment:
  *             al[f].append(e)             # <<<<<<<<<<<<<<
  *             fe_span[f][0] = min(fe_span[f][0], e)
  *             fe_span[f][1] = max(fe_span[f][1], e)
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_al, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_6 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_v_e); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1909; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_v_e); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1910
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1904
  *         for (f, e) in alignment:
  *             al[f].append(e)
  *             fe_span[f][0] = min(fe_span[f][0], e)             # <<<<<<<<<<<<<<
@@ -60958,13 +60708,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
     __Pyx_INCREF(__pyx_v_e);
     __pyx_t_6 = __pyx_v_e;
-    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_4, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_9) {
       __Pyx_INCREF(__pyx_t_6);
@@ -60975,13 +60726,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    if (__Pyx_SetItemInt(__pyx_t_6, 0, __pyx_t_3, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_6, 0, __pyx_t_3, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1904; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1911
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1905
  *             al[f].append(e)
  *             fe_span[f][0] = min(fe_span[f][0], e)
  *             fe_span[f][1] = max(fe_span[f][1], e)             # <<<<<<<<<<<<<<
@@ -60990,13 +60741,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
     __Pyx_INCREF(__pyx_v_e);
     __pyx_t_3 = __pyx_v_e;
-    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_9) {
       __Pyx_INCREF(__pyx_t_3);
@@ -61007,13 +60759,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_fe_span, __pyx_v_f); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (__Pyx_SetItemInt(__pyx_t_3, 1, __pyx_t_6, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1911; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_3, 1, __pyx_t_6, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1905; __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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1912
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1906
  *             fe_span[f][0] = min(fe_span[f][0], e)
  *             fe_span[f][1] = max(fe_span[f][1], e)
  *             ef_span[e][0] = min(ef_span[e][0], f)             # <<<<<<<<<<<<<<
@@ -61022,13 +60774,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
     __Pyx_INCREF(__pyx_v_f);
     __pyx_t_6 = __pyx_v_f;
-    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_6, __pyx_t_4, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_9) {
       __Pyx_INCREF(__pyx_t_6);
@@ -61039,13 +60792,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    if (__Pyx_SetItemInt(__pyx_t_6, 0, __pyx_t_3, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_6, 0, __pyx_t_3, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1906; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1913
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1907
  *             fe_span[f][1] = max(fe_span[f][1], e)
  *             ef_span[e][0] = min(ef_span[e][0], f)
  *             ef_span[e][1] = max(ef_span[e][1], f)             # <<<<<<<<<<<<<<
@@ -61054,13 +60807,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
  */
     __Pyx_INCREF(__pyx_v_f);
     __pyx_t_3 = __pyx_v_f;
-    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_6, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_3, __pyx_t_4, Py_GT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_9) {
       __Pyx_INCREF(__pyx_t_3);
@@ -61071,27 +60825,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_ef_span, __pyx_v_e); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    if (__Pyx_SetItemInt(__pyx_t_3, 1, __pyx_t_6, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_3, 1, __pyx_t_6, sizeof(long), PyInt_FromLong) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1907; __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_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1916
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1910
  * 
  *         # Target side word coverage
  *         cover = [0] * e_len             # <<<<<<<<<<<<<<
  *         # Non-terminal coverage
  *         f_nt_cover = [0] * f_len
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_v_e_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1916; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_v_e_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1910; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_temp);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_temp;
@@ -61100,19 +60854,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_cur_scope->__pyx_v_cover = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1918
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1912
  *         cover = [0] * e_len
  *         # Non-terminal coverage
  *         f_nt_cover = [0] * f_len             # <<<<<<<<<<<<<<
  *         e_nt_cover = [0] * e_len
  * 
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_cur_scope->__pyx_v_f_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_cur_scope->__pyx_v_f_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1912; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_temp);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_temp;
@@ -61120,19 +60874,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_v_f_nt_cover = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1919
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1913
  *         # Non-terminal coverage
  *         f_nt_cover = [0] * f_len
  *         e_nt_cover = [0] * e_len             # <<<<<<<<<<<<<<
  * 
  *         # Extract all possible hierarchical phrases starting at a source index
  */
-  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_int_0);
   PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_0);
   __Pyx_GIVEREF(__pyx_int_0);
-  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_v_e_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  { PyObject* __pyx_temp = PyNumber_InPlaceMultiply(__pyx_t_1, __pyx_v_e_len); if (unlikely(!__pyx_temp)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1913; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_temp);
     __Pyx_DECREF(__pyx_t_1);
     __pyx_t_1 = __pyx_temp;
@@ -61141,44 +60895,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   __pyx_cur_scope->__pyx_v_e_nt_cover = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1924
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1918
  *         # f_ i and j are current, e_ i and j are previous
  *         # We care _considering_ f_j, so it is not yet in counts
  *         def extract(f_i, f_j, e_i, e_j, min_bound, wc, links, nt, nt_open):             # <<<<<<<<<<<<<<
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  */
-  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_12add_instance_1extract, 0, ((PyObject*)__pyx_cur_scope), __pyx_n_s___sa, ((PyObject *)__pyx_k_codeobj_137)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_12add_instance_1extract, 0, ((PyObject*)__pyx_cur_scope), __pyx_n_s___sa, ((PyObject *)__pyx_k_codeobj_136)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_extract = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2030
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2024
  * 
  *         # Try to extract phrases from every f index
  *         for f_i from 0 <= f_i < f_len:             # <<<<<<<<<<<<<<
  *             # Skip if phrases won't be tight on left side
  *             if not al[f_i]:
  */
-  __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_cur_scope->__pyx_v_f_len); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2030; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_10 = __Pyx_PyInt_AsLong(__pyx_cur_scope->__pyx_v_f_len); if (unlikely((__pyx_t_10 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_v_f_i = 0; __pyx_v_f_i < __pyx_t_10; __pyx_v_f_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2032
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2026
  *         for f_i from 0 <= f_i < f_len:
  *             # Skip if phrases won't be tight on left side
  *             if not al[f_i]:             # <<<<<<<<<<<<<<
  *                 continue
  *             extract(f_i, f_i, f_len + 1, -1, f_i, 0, [], [], False)
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_i, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_al, __pyx_v_f_i, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2032; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2026; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __pyx_t_11 = (!__pyx_t_9);
     if (__pyx_t_11) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2033
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2027
  *             # Skip if phrases won't be tight on left side
  *             if not al[f_i]:
  *                 continue             # <<<<<<<<<<<<<<
@@ -61190,28 +60944,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     __pyx_L15:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2034
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2028
  *             if not al[f_i]:
  *                 continue
  *             extract(f_i, f_i, f_len + 1, -1, f_i, 0, [], [], False)             # <<<<<<<<<<<<<<
  * 
  *         # Update possible phrases (samples)
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_7 = PyList_New(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyList_New(0); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_12 = PyList_New(0); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __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 = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
-    __pyx_t_13 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_14 = PyTuple_New(9); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_14 = PyTuple_New(9); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_1);
     __Pyx_GIVEREF(__pyx_t_1);
@@ -61240,28 +60994,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_7 = 0;
     __pyx_t_12 = 0;
     __pyx_t_13 = 0;
-    __pyx_t_13 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2028; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __Pyx_DECREF(((PyObject *)__pyx_t_14)); __pyx_t_14 = 0;
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __pyx_L13_continue:;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2039
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2033
  *         # This could be more efficiently integrated with extraction
  *         # at the cost of readability
  *         for (f, lex_i, lex_j) in self.get_f_phrases(f_words):             # <<<<<<<<<<<<<<
  *             self.samples_f[f] += 1
  * 
  */
-  __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_f_phrases); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_v_self), __pyx_n_s__get_f_phrases); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __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 = 2039; __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 = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_14);
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f_words);
   PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_cur_scope->__pyx_v_f_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f_words);
-  __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_12 = PyObject_Call(__pyx_t_13, ((PyObject *)__pyx_t_14), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __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_14)); __pyx_t_14 = 0;
@@ -61269,7 +61023,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_14 = __pyx_t_12; __Pyx_INCREF(__pyx_t_14); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __pyx_t_5 = Py_TYPE(__pyx_t_14)->tp_iternext;
   }
@@ -61277,24 +61031,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_12 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_12 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_12 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_12 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
     } else {
       __pyx_t_12 = __pyx_t_5(__pyx_t_14);
       if (unlikely(!__pyx_t_12)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -61302,22 +61048,21 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     }
     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 != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __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 = 2033; __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_4 = 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 = 2033; __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_4 = PyList_GET_ITEM(sequence, 2); 
@@ -61325,16 +61070,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __Pyx_INCREF(__pyx_t_13);
       __Pyx_INCREF(__pyx_t_7);
       __Pyx_INCREF(__pyx_t_4);
-      #else
-      __pyx_t_13 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_4 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
-      __pyx_t_3 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext;
@@ -61344,15 +61083,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __Pyx_GOTREF(__pyx_t_7);
       index = 2; __pyx_t_4 = __pyx_t_8(__pyx_t_3); if (unlikely(!__pyx_t_4)) goto __pyx_L18_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_4);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       goto __pyx_L19_unpacking_done;
       __pyx_L18_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2033; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L19_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_f);
@@ -61365,7 +61103,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_v_lex_j = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2040
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2034
  *         # at the cost of readability
  *         for (f, lex_i, lex_j) in self.get_f_phrases(f_words):
  *             self.samples_f[f] += 1             # <<<<<<<<<<<<<<
@@ -61376,19 +61114,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_12 = __pyx_cur_scope->__pyx_v_self->samples_f;
     __Pyx_INCREF(__pyx_v_f);
     __pyx_t_4 = __pyx_v_f;
-    __pyx_t_7 = PyObject_GetItem(__pyx_t_12, __pyx_t_4); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_GetItem(__pyx_t_12, __pyx_t_4); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
-    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_7, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_7, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-    if (PyObject_SetItem(__pyx_t_12, __pyx_t_4, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_12, __pyx_t_4, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2034; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
   }
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2043
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2037
  * 
  *         # Update phrase counts
  *         for rule in rules:             # <<<<<<<<<<<<<<
@@ -61399,31 +61137,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_14 = __pyx_cur_scope->__pyx_v_rules; __Pyx_INCREF(__pyx_t_14); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_rules); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_rules); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __pyx_t_5 = Py_TYPE(__pyx_t_14)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_12 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_12 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_12 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_12 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_12); __pyx_t_2++;
     } else {
       __pyx_t_12 = __pyx_t_5(__pyx_t_14);
       if (unlikely(!__pyx_t_12)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -61433,33 +61163,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_v_rule = __pyx_t_12;
     __pyx_t_12 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2044
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2038
  *         # Update phrase counts
  *         for rule in rules:
  *             (f_ph, e_ph, al) = rule[:3]             # <<<<<<<<<<<<<<
  *             self.phrases_f[f_ph] += 1
  *             self.phrases_e[e_ph] += 1
  */
-    __pyx_t_12 = __Pyx_PySequence_GetSlice(__pyx_v_rule, 0, 3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = __Pyx_PySequence_GetSlice(__pyx_v_rule, 0, 3); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     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 != 3)) {
-        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
-        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
-        {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __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 = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
         __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
         __pyx_t_7 = 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 = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        }
         __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
         __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
         __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
@@ -61467,16 +61196,10 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __Pyx_INCREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_t_13);
       __Pyx_INCREF(__pyx_t_7);
-      #else
-      __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-    } else
-    {
+    } else {
       Py_ssize_t index = -1;
-      __pyx_t_3 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyObject_GetIter(__pyx_t_12); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
       __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext;
@@ -61486,15 +61209,14 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __Pyx_GOTREF(__pyx_t_13);
       index = 2; __pyx_t_7 = __pyx_t_8(__pyx_t_3); if (unlikely(!__pyx_t_7)) goto __pyx_L22_unpacking_failed;
       __Pyx_GOTREF(__pyx_t_7);
-      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_3), 3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       goto __pyx_L23_unpacking_done;
       __pyx_L22_unpacking_failed:;
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-      __pyx_t_8 = NULL;
-      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
-      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L23_unpacking_done:;
     }
     __Pyx_XDECREF(__pyx_v_f_ph);
@@ -61509,7 +61231,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_cur_scope->__pyx_v_al = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2045
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2039
  *         for rule in rules:
  *             (f_ph, e_ph, al) = rule[:3]
  *             self.phrases_f[f_ph] += 1             # <<<<<<<<<<<<<<
@@ -61520,17 +61242,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_12 = __pyx_cur_scope->__pyx_v_self->phrases_f;
     __Pyx_INCREF(__pyx_v_f_ph);
     __pyx_t_7 = __pyx_v_f_ph;
-    __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2045; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2045; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2045; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2039; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2046
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2040
  *             (f_ph, e_ph, al) = rule[:3]
  *             self.phrases_f[f_ph] += 1
  *             self.phrases_e[e_ph] += 1             # <<<<<<<<<<<<<<
@@ -61541,64 +61263,64 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_12 = __pyx_cur_scope->__pyx_v_self->phrases_e;
     __Pyx_INCREF(__pyx_v_e_ph);
     __pyx_t_7 = __pyx_v_e_ph;
-    __pyx_t_4 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2047
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2041
  *             self.phrases_f[f_ph] += 1
  *             self.phrases_e[e_ph] += 1
  *             self.phrases_fe[f_ph][e_ph] += 1             # <<<<<<<<<<<<<<
  *             if not self.phrases_al[f_ph][e_ph]:
  *                 self.phrases_al[f_ph][e_ph] = al
  */
-    __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_fe, __pyx_v_f_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_fe, __pyx_v_f_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
     __Pyx_INCREF(__pyx_v_e_ph);
     __pyx_t_7 = __pyx_v_e_ph;
-    __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_7); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_12, __pyx_t_7, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2048
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2042
  *             self.phrases_e[e_ph] += 1
  *             self.phrases_fe[f_ph][e_ph] += 1
  *             if not self.phrases_al[f_ph][e_ph]:             # <<<<<<<<<<<<<<
  *                 self.phrases_al[f_ph][e_ph] = al
  * 
  */
-    __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_v_f_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_v_f_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_12);
-    __pyx_t_7 = PyObject_GetItem(__pyx_t_12, __pyx_v_e_ph); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_GetItem(__pyx_t_12, __pyx_v_e_ph); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-    __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_11 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2042; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __pyx_t_9 = (!__pyx_t_11);
     if (__pyx_t_9) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2049
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2043
  *             self.phrases_fe[f_ph][e_ph] += 1
  *             if not self.phrases_al[f_ph][e_ph]:
  *                 self.phrases_al[f_ph][e_ph] = al             # <<<<<<<<<<<<<<
  * 
  *         # Update Bilexical counts
  */
-      __pyx_t_7 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_v_f_ph); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->phrases_al, __pyx_v_f_ph); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      if (PyObject_SetItem(__pyx_t_7, __pyx_v_e_ph, __pyx_cur_scope->__pyx_v_al) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyObject_SetItem(__pyx_t_7, __pyx_v_e_ph, __pyx_cur_scope->__pyx_v_al) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L24;
     }
@@ -61606,7 +61328,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
   }
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2052
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2046
  * 
  *         # Update Bilexical counts
  *         for e_w in e_words:             # <<<<<<<<<<<<<<
@@ -61617,31 +61339,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_14 = __pyx_cur_scope->__pyx_v_e_words; __Pyx_INCREF(__pyx_t_14); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_e_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_e_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __pyx_t_5 = Py_TYPE(__pyx_t_14)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
     } else {
       __pyx_t_7 = __pyx_t_5(__pyx_t_14);
       if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -61651,7 +61365,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_v_e_w = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2053
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2047
  *         # Update Bilexical counts
  *         for e_w in e_words:
  *             self.bilex_e[e_w] += 1             # <<<<<<<<<<<<<<
@@ -61662,19 +61376,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_7 = __pyx_cur_scope->__pyx_v_self->bilex_e;
     __Pyx_INCREF(__pyx_v_e_w);
     __pyx_t_12 = __pyx_v_e_w;
-    __pyx_t_4 = PyObject_GetItem(__pyx_t_7, __pyx_t_12); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_t_7, __pyx_t_12); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyNumber_InPlaceAdd(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    if (PyObject_SetItem(__pyx_t_7, __pyx_t_12, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2053; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_7, __pyx_t_12, __pyx_t_13) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2047; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
   }
   __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2054
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2048
  *         for e_w in e_words:
  *             self.bilex_e[e_w] += 1
  *         for f_w in f_words:             # <<<<<<<<<<<<<<
@@ -61685,31 +61399,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_14 = __pyx_cur_scope->__pyx_v_f_words; __Pyx_INCREF(__pyx_t_14); __pyx_t_2 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_f_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_14 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_f_words); if (unlikely(!__pyx_t_14)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_14);
     __pyx_t_5 = Py_TYPE(__pyx_t_14)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_14)) {
       if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_14)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_14, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_14, __pyx_t_2); __Pyx_INCREF(__pyx_t_7); __pyx_t_2++;
     } else {
       __pyx_t_7 = __pyx_t_5(__pyx_t_14);
       if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -61719,7 +61425,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_v_f_w = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2055
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2049
  *             self.bilex_e[e_w] += 1
  *         for f_w in f_words:
  *             self.bilex_f[f_w] += 1             # <<<<<<<<<<<<<<
@@ -61730,17 +61436,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
     __pyx_t_7 = __pyx_cur_scope->__pyx_v_self->bilex_f;
     __Pyx_INCREF(__pyx_v_f_w);
     __pyx_t_12 = __pyx_v_f_w;
-    __pyx_t_13 = PyObject_GetItem(__pyx_t_7, __pyx_t_12); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = PyObject_GetItem(__pyx_t_7, __pyx_t_12); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_13);
-    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-    if (PyObject_SetItem(__pyx_t_7, __pyx_t_12, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_t_7, __pyx_t_12, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2056
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2050
  *         for f_w in f_words:
  *             self.bilex_f[f_w] += 1
  *             for e_w in e_words:             # <<<<<<<<<<<<<<
@@ -61751,31 +61457,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __pyx_t_7 = __pyx_cur_scope->__pyx_v_e_words; __Pyx_INCREF(__pyx_t_7); __pyx_t_15 = 0;
       __pyx_t_16 = NULL;
     } else {
-      __pyx_t_15 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_e_words); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_15 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_cur_scope->__pyx_v_e_words); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __pyx_t_16 = Py_TYPE(__pyx_t_7)->tp_iternext;
     }
     for (;;) {
       if (!__pyx_t_16 && PyList_CheckExact(__pyx_t_7)) {
         if (__pyx_t_15 >= PyList_GET_SIZE(__pyx_t_7)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_12 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_15); __Pyx_INCREF(__pyx_t_12); __pyx_t_15++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_12 = PySequence_ITEM(__pyx_t_7, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_12 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_15); __Pyx_INCREF(__pyx_t_12); __pyx_t_15++;
       } else if (!__pyx_t_16 && PyTuple_CheckExact(__pyx_t_7)) {
         if (__pyx_t_15 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_15); __Pyx_INCREF(__pyx_t_12); __pyx_t_15++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_12 = PySequence_ITEM(__pyx_t_7, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_12 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_15); __Pyx_INCREF(__pyx_t_12); __pyx_t_15++;
       } else {
         __pyx_t_12 = __pyx_t_16(__pyx_t_7);
         if (unlikely(!__pyx_t_12)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2050; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -61785,23 +61483,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_25add_instance(struct _
       __pyx_v_e_w = __pyx_t_12;
       __pyx_t_12 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2057
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2051
  *             self.bilex_f[f_w] += 1
  *             for e_w in e_words:
  *                 self.bilex_fe[f_w][e_w] += 1             # <<<<<<<<<<<<<<
  * 
  *     # Create a rule from source, target, non-terminals, and alignments
  */
-      __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->bilex_fe, __pyx_v_f_w); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_self->bilex_fe, __pyx_v_f_w); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_INCREF(__pyx_v_e_w);
       __pyx_t_4 = __pyx_v_e_w;
-      __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_4); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_13 = PyObject_GetItem(__pyx_t_12, __pyx_t_4); if (!__pyx_t_13) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_13);
-      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_t_13, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
-      if (PyObject_SetItem(__pyx_t_12, __pyx_t_4, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyObject_SetItem(__pyx_t_12, __pyx_t_4, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2051; __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_12); __pyx_t_12 = 0;
@@ -61851,11 +61549,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_28form_rule(PyObject *_
   PyObject *__pyx_v_e_span = 0;
   PyObject *__pyx_v_nt = 0;
   PyObject *__pyx_v_al = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__e_i,&__pyx_n_s__f_span,&__pyx_n_s__e_span,&__pyx_n_s__nt,&__pyx_n_s__al,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("form_rule (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__e_i,&__pyx_n_s__f_span,&__pyx_n_s__e_span,&__pyx_n_s__nt,&__pyx_n_s__al,0};
     PyObject* values[6] = {0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -61873,36 +61571,42 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_28form_rule(PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_i)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_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__e_i)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_i);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_span)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_span);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_span)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e_span);
+        if (likely(values[3])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt)) != 0)) kw_args--;
+        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__nt);
+        if (likely(values[4])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__al)) != 0)) kw_args--;
+        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__al);
+        if (likely(values[5])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "form_rule") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "form_rule") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
       goto __pyx_L5_argtuple_error;
@@ -61923,7 +61627,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_28form_rule(PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("form_rule", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.form_rule", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -61940,11 +61644,12 @@ static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7
 static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_x = 0;
   PyObject *__pyx_v_y = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda7 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -61958,16 +61663,18 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7(PyOb
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x);
+        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__y)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("lambda7", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("lambda7", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lambda7") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lambda7") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -61980,7 +61687,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7(PyOb
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("lambda7", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("lambda7", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.form_rule.lambda7", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -61991,7 +61698,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7(PyOb
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2063
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2057
  * 
  *         # Substitute in non-terminals
  *         nt_inv = sorted(nt, cmp=lambda x, y: cmp(x[3], y[3]))             # <<<<<<<<<<<<<<
@@ -62010,11 +61717,11 @@ static PyObject *__pyx_lambda_funcdef_lambda7(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda7", 0);
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_x, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_y, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_y, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __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 = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __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);
@@ -62022,7 +61729,7 @@ static PyObject *__pyx_lambda_funcdef_lambda7(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_1 = 0;
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_cmp, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_cmp, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_r = __pyx_t_2;
@@ -62049,11 +61756,12 @@ static PyMethodDef __pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8
 static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_x = 0;
   PyObject *__pyx_v_y = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("lambda8 (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -62067,16 +61775,18 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8(PyO
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x);
+        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__y)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("lambda8", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("lambda8", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lambda8") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lambda8") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -62089,7 +61799,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8(PyO
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("lambda8", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("lambda8", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.form_rule.lambda8", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -62100,7 +61810,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8(PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2087
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2081
  *         # Adjusting alignment links takes some doing
  *         links = [list(link) for sub in al for link in sub]
  *         links_inv = sorted(links, cmp=lambda x, y: cmp(x[1], y[1]))             # <<<<<<<<<<<<<<
@@ -62119,11 +61829,11 @@ static PyObject *__pyx_lambda_funcdef_lambda8(CYTHON_UNUSED PyObject *__pyx_self
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("lambda8", 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 = 2087; __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 = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_y, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_y, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __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 = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __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);
@@ -62131,7 +61841,7 @@ static PyObject *__pyx_lambda_funcdef_lambda8(CYTHON_UNUSED PyObject *__pyx_self
   __Pyx_GIVEREF(__pyx_t_2);
   __pyx_t_1 = 0;
   __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_builtin_cmp, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_Call(__pyx_builtin_cmp, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_r = __pyx_t_2;
@@ -62153,7 +61863,7 @@ static PyObject *__pyx_lambda_funcdef_lambda8(CYTHON_UNUSED PyObject *__pyx_self
 }
 static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2121
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2115
  *         f = Phrase(f_sym)
  *         e = Phrase(e_sym)
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)             # <<<<<<<<<<<<<<
@@ -62179,7 +61889,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_9form_rule_2genexpr(PyO
   __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_23HieroCachingRuleFactory_9form_rule_4generator15, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -62221,37 +61931,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_links)) { __Pyx_RaiseClosureNameError("links"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_links)) { __Pyx_RaiseClosureNameError("links"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
   if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_links) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_links)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_links; __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_links); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_links); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __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[8]; __pyx_lineno = 2121; __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 = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 2121; __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 = 2121; __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[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -62259,35 +61961,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
     }
     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 = 2121; __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 = 2115; __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 = 2115; __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 = 2121; __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 = 2121; __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 = 2121; __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 = 2115; __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;
@@ -62295,15 +61991,14 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
       __Pyx_GOTREF(__pyx_t_5);
       index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L6_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 = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_8 = NULL;
+      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L7_unpacking_done;
       __pyx_L6_unpacking_failed:;
       __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 = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_StopIteration)) PyErr_Clear();
+      if (!PyErr_Occurred()) __Pyx_RaiseNeedMoreValuesError(index);
+      {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __pyx_L7_unpacking_done:;
     }
     __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_i);
@@ -62316,10 +62011,10 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
     __Pyx_GIVEREF(__pyx_t_6);
     __pyx_cur_scope->__pyx_v_j = __pyx_t_6;
     __pyx_t_6 = 0;
-    if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment->__pyx_vtab)->link(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment, __pyx_t_9, __pyx_t_10)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __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[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_i); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = __Pyx_PyInt_AsInt(__pyx_cur_scope->__pyx_v_j); if (unlikely((__pyx_t_10 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(((struct __pyx_vtabstruct_3_sa_Alignment *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment->__pyx_vtab)->link(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment, __pyx_t_9, __pyx_t_10)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __pyx_r = __pyx_t_4;
     __pyx_t_4 = 0;
@@ -62338,7 +62033,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
     __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[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   PyErr_SetNone(PyExc_StopIteration);
@@ -62353,12 +62048,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_9form_rule_4generator15
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2060
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2054
  * 
  *     # Create a rule from source, target, non-terminals, and alignments
  *     def form_rule(self, f_i, e_i, f_span, e_span, nt, al):             # <<<<<<<<<<<<<<
@@ -62415,52 +62109,52 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
   __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2063
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2057
  * 
  *         # Substitute in non-terminals
  *         nt_inv = sorted(nt, cmp=lambda x, y: cmp(x[3], y[3]))             # <<<<<<<<<<<<<<
  *         f_sym = list(f_span[:])
  *         off = f_i
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __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 = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_nt);
   PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_nt);
   __Pyx_GIVEREF(__pyx_v_nt);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_lambda7, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__cmp), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__cmp), __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_3 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2057; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_nt_inv = __pyx_t_3;
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2064
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2058
  *         # Substitute in non-terminals
  *         nt_inv = sorted(nt, cmp=lambda x, y: cmp(x[3], y[3]))
  *         f_sym = list(f_span[:])             # <<<<<<<<<<<<<<
  *         off = f_i
  *         for next_nt in nt:
  */
-  __pyx_t_3 = __Pyx_PySequence_GetSlice(__pyx_v_f_span, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PySequence_GetSlice(__pyx_v_f_span, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2058; __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 = 2064; __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 = 2058; __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*)(&PyList_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2058; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_f_sym = ((PyObject*)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2065
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2059
  *         nt_inv = sorted(nt, cmp=lambda x, y: cmp(x[3], y[3]))
  *         f_sym = list(f_span[:])
  *         off = f_i             # <<<<<<<<<<<<<<
@@ -62470,7 +62164,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_INCREF(__pyx_v_f_i);
   __pyx_v_off = __pyx_v_f_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2066
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2060
  *         f_sym = list(f_span[:])
  *         off = f_i
  *         for next_nt in nt:             # <<<<<<<<<<<<<<
@@ -62481,31 +62175,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __pyx_t_3 = __pyx_v_nt; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_nt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_nt); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++;
     } else {
       __pyx_t_2 = __pyx_t_5(__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 = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -62515,29 +62201,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __pyx_v_next_nt = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2067
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2061
  *         off = f_i
  *         for next_nt in nt:
  *             nt_len = (next_nt[2] - next_nt[1]) + 1             # <<<<<<<<<<<<<<
  *             i = 0
  *             while i < nt_len:
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_6 = PyNumber_Subtract(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Subtract(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyNumber_Add(__pyx_t_6, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Add(__pyx_t_6, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_XDECREF(__pyx_v_nt_len);
     __pyx_v_nt_len = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2068
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2062
  *         for next_nt in nt:
  *             nt_len = (next_nt[2] - next_nt[1]) + 1
  *             i = 0             # <<<<<<<<<<<<<<
@@ -62548,7 +62234,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_int_0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2069
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2063
  *             nt_len = (next_nt[2] - next_nt[1]) + 1
  *             i = 0
  *             while i < nt_len:             # <<<<<<<<<<<<<<
@@ -62556,83 +62242,84 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 i += 1
  */
     while (1) {
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_v_nt_len, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2069; __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 = 2069; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_v_nt_len, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2063; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (!__pyx_t_7) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2070
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2064
  *             i = 0
  *             while i < nt_len:
  *                 f_sym.pop(next_nt[1] - off)             # <<<<<<<<<<<<<<
  *                 i += 1
  *             f_sym.insert(next_nt[1] - off, sym_setindex(self.category, next_nt[0]))
  */
-      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_f_sym), __pyx_n_s__pop); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_f_sym), __pyx_n_s__pop); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_off); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_6, __pyx_v_off); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2064; __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_6)); __pyx_t_6 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2071
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2065
  *             while i < nt_len:
  *                 f_sym.pop(next_nt[1] - off)
  *                 i += 1             # <<<<<<<<<<<<<<
  *             f_sym.insert(next_nt[1] - off, sym_setindex(self.category, next_nt[0]))
  *             off += (nt_len - 1)
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_i);
       __pyx_v_i = __pyx_t_2;
       __pyx_t_2 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2072
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2066
  *                 f_sym.pop(next_nt[1] - off)
  *                 i += 1
  *             f_sym.insert(next_nt[1] - off, sym_setindex(self.category, next_nt[0]))             # <<<<<<<<<<<<<<
  *             off += (nt_len - 1)
  *         e_sym = list(e_span[:])
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = PyNumber_Subtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Subtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyIndex_AsSsize_t(__pyx_t_6); if (unlikely((__pyx_t_8 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_6); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_9)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_9)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_10 = PyList_Insert(__pyx_v_f_sym, __pyx_t_8, __pyx_t_6); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyList_Insert(__pyx_v_f_sym, __pyx_t_8, __pyx_t_6); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2066; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2073
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2067
  *                 i += 1
  *             f_sym.insert(next_nt[1] - off, sym_setindex(self.category, next_nt[0]))
  *             off += (nt_len - 1)             # <<<<<<<<<<<<<<
  *         e_sym = list(e_span[:])
  *         off = e_i
  */
-    __pyx_t_6 = PyNumber_Subtract(__pyx_v_nt_len, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Subtract(__pyx_v_nt_len, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_6); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2067; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_v_off);
@@ -62641,27 +62328,27 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2074
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2068
  *             f_sym.insert(next_nt[1] - off, sym_setindex(self.category, next_nt[0]))
  *             off += (nt_len - 1)
  *         e_sym = list(e_span[:])             # <<<<<<<<<<<<<<
  *         off = e_i
  *         for next_nt in nt_inv:
  */
-  __pyx_t_3 = __Pyx_PySequence_GetSlice(__pyx_v_e_span, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PySequence_GetSlice(__pyx_v_e_span, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2068; __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 = 2074; __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 = 2068; __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*)(&PyList_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2068; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_e_sym = ((PyObject*)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2075
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2069
  *             off += (nt_len - 1)
  *         e_sym = list(e_span[:])
  *         off = e_i             # <<<<<<<<<<<<<<
@@ -62672,7 +62359,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_DECREF(__pyx_v_off);
   __pyx_v_off = __pyx_v_e_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2076
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2070
  *         e_sym = list(e_span[:])
  *         off = e_i
  *         for next_nt in nt_inv:             # <<<<<<<<<<<<<<
@@ -62683,31 +62370,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __pyx_t_3 = __pyx_v_nt_inv; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_nt_inv); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_nt_inv); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_3)) {
       if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_3)) {
       if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++;
     } else {
       __pyx_t_2 = __pyx_t_5(__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 = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2070; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -62717,29 +62396,29 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __pyx_v_next_nt = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2077
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2071
  *         off = e_i
  *         for next_nt in nt_inv:
  *             nt_len = (next_nt[4] - next_nt[3]) + 1             # <<<<<<<<<<<<<<
  *             i = 0
  *             while i < nt_len:
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
-    __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2071; __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_6); __pyx_t_6 = 0;
-    __pyx_t_6 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_XDECREF(__pyx_v_nt_len);
     __pyx_v_nt_len = __pyx_t_6;
     __pyx_t_6 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2078
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2072
  *         for next_nt in nt_inv:
  *             nt_len = (next_nt[4] - next_nt[3]) + 1
  *             i = 0             # <<<<<<<<<<<<<<
@@ -62750,7 +62429,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     __Pyx_XDECREF(__pyx_v_i);
     __pyx_v_i = __pyx_int_0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2079
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2073
  *             nt_len = (next_nt[4] - next_nt[3]) + 1
  *             i = 0
  *             while i < nt_len:             # <<<<<<<<<<<<<<
@@ -62758,83 +62437,84 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 i += 1
  */
     while (1) {
-      __pyx_t_6 = PyObject_RichCompare(__pyx_v_i, __pyx_v_nt_len, Py_LT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_RichCompare(__pyx_v_i, __pyx_v_nt_len, Py_LT); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_6);
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2073; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       if (!__pyx_t_7) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2080
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2074
  *             i = 0
  *             while i < nt_len:
  *                 e_sym.pop(next_nt[3] - off)             # <<<<<<<<<<<<<<
  *                 i += 1
  *             e_sym.insert(next_nt[3] - off, sym_setindex(self.category, next_nt[0]))
  */
-      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_e_sym), __pyx_n_s__pop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_e_sym), __pyx_n_s__pop); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_v_off); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_v_off); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__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 = 2080; __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 = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
       __Pyx_GIVEREF(__pyx_t_2);
       __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2074; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2081
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2075
  *             while i < nt_len:
  *                 e_sym.pop(next_nt[3] - off)
  *                 i += 1             # <<<<<<<<<<<<<<
  *             e_sym.insert(next_nt[3] - off, sym_setindex(self.category, next_nt[0]))
  *             off += (nt_len - 1)
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_i);
       __pyx_v_i = __pyx_t_2;
       __pyx_t_2 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2082
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2076
  *                 e_sym.pop(next_nt[3] - off)
  *                 i += 1
  *             e_sym.insert(next_nt[3] - off, sym_setindex(self.category, next_nt[0]))             # <<<<<<<<<<<<<<
  *             off += (nt_len - 1)
  * 
  */
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_next_nt, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __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[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __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[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_next_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_9 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_9)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_9)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_10 = PyList_Insert(__pyx_v_e_sym, __pyx_t_8, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_10 = PyList_Insert(__pyx_v_e_sym, __pyx_t_8, __pyx_t_1); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2083
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2077
  *                 i += 1
  *             e_sym.insert(next_nt[3] - off, sym_setindex(self.category, next_nt[0]))
  *             off += (nt_len - 1)             # <<<<<<<<<<<<<<
  * 
  *         # Adjusting alignment links takes some doing
  */
-    __pyx_t_1 = PyNumber_Subtract(__pyx_v_nt_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Subtract(__pyx_v_nt_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_v_off);
@@ -62843,44 +62523,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   }
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2086
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2080
  * 
  *         # Adjusting alignment links takes some doing
  *         links = [list(link) for sub in al for link in sub]             # <<<<<<<<<<<<<<
  *         links_inv = sorted(links, cmp=lambda x, y: cmp(x[1], y[1]))
  *         links_len = len(links)
  */
-  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __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 = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   if (PyList_CheckExact(__pyx_v_al) || PyTuple_CheckExact(__pyx_v_al)) {
     __pyx_t_2 = __pyx_v_al; __Pyx_INCREF(__pyx_t_2); __pyx_t_4 = 0;
     __pyx_t_5 = NULL;
   } else {
-    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_al); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_v_al); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_5 = Py_TYPE(__pyx_t_2)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_5 && PyList_CheckExact(__pyx_t_2)) {
       if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
     } else if (!__pyx_t_5 && PyTuple_CheckExact(__pyx_t_2)) {
       if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++;
     } else {
       __pyx_t_1 = __pyx_t_5(__pyx_t_2);
       if (unlikely(!__pyx_t_1)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -62893,31 +62565,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
       __pyx_t_1 = __pyx_v_sub; __Pyx_INCREF(__pyx_t_1); __pyx_t_8 = 0;
       __pyx_t_11 = NULL;
     } else {
-      __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sub); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sub); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_t_11 = Py_TYPE(__pyx_t_1)->tp_iternext;
     }
     for (;;) {
       if (!__pyx_t_11 && PyList_CheckExact(__pyx_t_1)) {
         if (__pyx_t_8 >= PyList_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_6); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_6); __pyx_t_8++;
       } else if (!__pyx_t_11 && PyTuple_CheckExact(__pyx_t_1)) {
         if (__pyx_t_8 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_6); __pyx_t_8++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_8); __pyx_t_8++; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_8); __Pyx_INCREF(__pyx_t_6); __pyx_t_8++;
       } else {
         __pyx_t_6 = __pyx_t_11(__pyx_t_1);
         if (unlikely(!__pyx_t_6)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -62926,15 +62590,15 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
       __Pyx_XDECREF(__pyx_v_link);
       __pyx_v_link = __pyx_t_6;
       __pyx_t_6 = 0;
-      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_6);
       __Pyx_INCREF(__pyx_v_link);
       PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_link);
       __Pyx_GIVEREF(__pyx_v_link);
-      __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_Call(((PyObject *)((PyObject*)(&PyList_Type))), ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-      if (unlikely(__Pyx_PyList_Append(__pyx_t_3, (PyObject*)__pyx_t_12))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2086; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(PyList_Append(__pyx_t_3, (PyObject*)__pyx_t_12))) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
     }
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -62945,32 +62609,32 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __pyx_cur_scope->__pyx_v_links = ((PyObject *)__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2087
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2081
  *         # Adjusting alignment links takes some doing
  *         links = [list(link) for sub in al for link in sub]
  *         links_inv = sorted(links, cmp=lambda x, y: cmp(x[1], y[1]))             # <<<<<<<<<<<<<<
  *         links_len = len(links)
  *         nt_len = len(nt)
  */
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __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 = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_links);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_cur_scope->__pyx_v_links);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_links);
-  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_9form_rule_1lambda8, 0, NULL, __pyx_n_s___sa, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__cmp), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_t_2, ((PyObject *)__pyx_n_s__cmp), __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_builtin_sorted, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_2)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2081; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
   __pyx_v_links_inv = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2088
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2082
  *         links = [list(link) for sub in al for link in sub]
  *         links_inv = sorted(links, cmp=lambda x, y: cmp(x[1], y[1]))
  *         links_len = len(links)             # <<<<<<<<<<<<<<
@@ -62979,28 +62643,28 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_links;
   __Pyx_INCREF(__pyx_t_1);
-  __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_v_links_len = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2089
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2083
  *         links_inv = sorted(links, cmp=lambda x, y: cmp(x[1], y[1]))
  *         links_len = len(links)
  *         nt_len = len(nt)             # <<<<<<<<<<<<<<
  *         nt_i = 0
  *         off = f_i
  */
-  __pyx_t_4 = PyObject_Length(__pyx_v_nt); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_v_nt); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_v_nt_len);
   __pyx_v_nt_len = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2090
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2084
  *         links_len = len(links)
  *         nt_len = len(nt)
  *         nt_i = 0             # <<<<<<<<<<<<<<
@@ -63010,7 +62674,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_INCREF(__pyx_int_0);
   __pyx_v_nt_i = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2091
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2085
  *         nt_len = len(nt)
  *         nt_i = 0
  *         off = f_i             # <<<<<<<<<<<<<<
@@ -63021,7 +62685,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_DECREF(__pyx_v_off);
   __pyx_v_off = __pyx_v_f_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2092
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2086
  *         nt_i = 0
  *         off = f_i
  *         i = 0             # <<<<<<<<<<<<<<
@@ -63032,7 +62696,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_XDECREF(__pyx_v_i);
   __pyx_v_i = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2093
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2087
  *         off = f_i
  *         i = 0
  *         while i < links_len:             # <<<<<<<<<<<<<<
@@ -63040,12 +62704,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 off += (nt[nt_i][2] - nt[nt_i][1])
  */
   while (1) {
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_v_links_len, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2093; __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 = 2093; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_i, __pyx_v_links_len, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2087; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (!__pyx_t_7) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2094
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2088
  *         i = 0
  *         while i < links_len:
  *             while nt_i < nt_len and links[i][0] > nt[nt_i][1]:             # <<<<<<<<<<<<<<
@@ -63053,24 +62718,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 nt_i += 1
  */
     while (1) {
-      __pyx_t_1 = PyObject_RichCompare(__pyx_v_nt_i, __pyx_v_nt_len, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __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 = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_RichCompare(__pyx_v_nt_i, __pyx_v_nt_len, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_1);
+      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       if (__pyx_t_7) {
-        __pyx_t_1 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_links, __pyx_v_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_links, __pyx_v_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __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_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-        __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_3, Py_GT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __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_3); __pyx_t_3 = 0;
-        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2094; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
         __pyx_t_14 = __pyx_t_13;
       } else {
@@ -63078,82 +62745,82 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
       }
       if (!__pyx_t_14) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2095
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2089
  *         while i < links_len:
  *             while nt_i < nt_len and links[i][0] > nt[nt_i][1]:
  *                 off += (nt[nt_i][2] - nt[nt_i][1])             # <<<<<<<<<<<<<<
  *                 nt_i += 1
  *             links[i][0] -= off
  */
-      __pyx_t_1 = PyObject_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_GetItem(__pyx_v_nt, __pyx_v_nt_i); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __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_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2095; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       __Pyx_DECREF(__pyx_v_off);
       __pyx_v_off = __pyx_t_2;
       __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2096
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2090
  *             while nt_i < nt_len and links[i][0] > nt[nt_i][1]:
  *                 off += (nt[nt_i][2] - nt[nt_i][1])
  *                 nt_i += 1             # <<<<<<<<<<<<<<
  *             links[i][0] -= off
  *             i += 1
  */
-      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_nt_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_nt_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2090; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_v_nt_i);
       __pyx_v_nt_i = __pyx_t_2;
       __pyx_t_2 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2097
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2091
  *                 off += (nt[nt_i][2] - nt[nt_i][1])
  *                 nt_i += 1
  *             links[i][0] -= off             # <<<<<<<<<<<<<<
  *             i += 1
  *         nt_i = 0
  */
-    __pyx_t_2 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_links, __pyx_v_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_links, __pyx_v_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __pyx_t_4 = 0;
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, __pyx_t_4, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, __pyx_t_4, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = PyNumber_InPlaceSubtract(__pyx_t_1, __pyx_v_off); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_InPlaceSubtract(__pyx_t_1, __pyx_v_off); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2091; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    if (__Pyx_SetItemInt(__pyx_t_2, __pyx_t_4, __pyx_t_3, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_2, __pyx_t_4, __pyx_t_3, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2091; __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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2098
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2092
  *                 nt_i += 1
  *             links[i][0] -= off
  *             i += 1             # <<<<<<<<<<<<<<
  *         nt_i = 0
  *         off = e_i
  */
-    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_2;
     __pyx_t_2 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2099
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2093
  *             links[i][0] -= off
  *             i += 1
  *         nt_i = 0             # <<<<<<<<<<<<<<
@@ -63164,7 +62831,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_DECREF(__pyx_v_nt_i);
   __pyx_v_nt_i = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2100
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2094
  *             i += 1
  *         nt_i = 0
  *         off = e_i             # <<<<<<<<<<<<<<
@@ -63175,7 +62842,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_DECREF(__pyx_v_off);
   __pyx_v_off = __pyx_v_e_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2101
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2095
  *         nt_i = 0
  *         off = e_i
  *         i = 0             # <<<<<<<<<<<<<<
@@ -63186,7 +62853,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_DECREF(__pyx_v_i);
   __pyx_v_i = __pyx_int_0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2102
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2096
  *         off = e_i
  *         i = 0
  *         while i < links_len:             # <<<<<<<<<<<<<<
@@ -63194,12 +62861,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 off += (nt_inv[nt_i][4] - nt_inv[nt_i][3])
  */
   while (1) {
-    __pyx_t_2 = PyObject_RichCompare(__pyx_v_i, __pyx_v_links_len, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2102; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_RichCompare(__pyx_v_i, __pyx_v_links_len, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_2);
+    __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2096; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     if (!__pyx_t_14) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2103
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2097
  *         i = 0
  *         while i < links_len:
  *             while nt_i < nt_len and links_inv[i][1] > nt_inv[nt_i][3]:             # <<<<<<<<<<<<<<
@@ -63207,24 +62875,26 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *                 nt_i += 1
  */
     while (1) {
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_nt_i, __pyx_v_nt_len, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_nt_i, __pyx_v_nt_len, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_2);
+      __pyx_t_14 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_14 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_14) {
-        __pyx_t_2 = PyObject_GetItem(__pyx_v_links_inv, __pyx_v_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetItem(__pyx_v_links_inv, __pyx_v_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __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_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_GetItem(__pyx_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_1);
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-        __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = PyObject_RichCompare(__pyx_t_3, __pyx_t_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __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_1); __pyx_t_1 = 0;
-        __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2097; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_13 = __pyx_t_7;
       } else {
@@ -63232,82 +62902,82 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
       }
       if (!__pyx_t_13) break;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2104
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2098
  *         while i < links_len:
  *             while nt_i < nt_len and links_inv[i][1] > nt_inv[nt_i][3]:
  *                 off += (nt_inv[nt_i][4] - nt_inv[nt_i][3])             # <<<<<<<<<<<<<<
  *                 nt_i += 1
  *             links_inv[i][1] -= off
  */
-      __pyx_t_2 = PyObject_GetItem(__pyx_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetItem(__pyx_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_t_2, 4, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyObject_GetItem(__pyx_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetItem(__pyx_v_nt_inv, __pyx_v_nt_i); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_2, 3, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __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_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_off, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2098; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_v_off);
       __pyx_v_off = __pyx_t_3;
       __pyx_t_3 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2105
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2099
  *             while nt_i < nt_len and links_inv[i][1] > nt_inv[nt_i][3]:
  *                 off += (nt_inv[nt_i][4] - nt_inv[nt_i][3])
  *                 nt_i += 1             # <<<<<<<<<<<<<<
  *             links_inv[i][1] -= off
  *             i += 1
  */
-      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_nt_i, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_nt_i, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2099; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_v_nt_i);
       __pyx_v_nt_i = __pyx_t_3;
       __pyx_t_3 = 0;
     }
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2106
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2100
  *                 off += (nt_inv[nt_i][4] - nt_inv[nt_i][3])
  *                 nt_i += 1
  *             links_inv[i][1] -= off             # <<<<<<<<<<<<<<
  *             i += 1
  * 
  */
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_links_inv, __pyx_v_i); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_links_inv, __pyx_v_i); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __pyx_t_4 = 1;
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_t_4, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, __pyx_t_4, sizeof(Py_ssize_t), PyInt_FromSsize_t); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_t_2, __pyx_v_off); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (__Pyx_SetItemInt(__pyx_t_3, __pyx_t_4, __pyx_t_1, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__Pyx_SetItemInt(__pyx_t_3, __pyx_t_4, __pyx_t_1, sizeof(Py_ssize_t), PyInt_FromSsize_t) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2107
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2101
  *                 nt_i += 1
  *             links_inv[i][1] -= off
  *             i += 1             # <<<<<<<<<<<<<<
  * 
  *         # Find lexical span
  */
-    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_v_i);
     __pyx_v_i = __pyx_t_3;
     __pyx_t_3 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2110
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2104
  * 
  *         # Find lexical span
  *         lex_f_i = f_i             # <<<<<<<<<<<<<<
@@ -63317,75 +62987,76 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   __Pyx_INCREF(__pyx_v_f_i);
   __pyx_v_lex_f_i = __pyx_v_f_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2111
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2105
  *         # Find lexical span
  *         lex_f_i = f_i
  *         lex_f_j = f_i + (len(f_span) - 1)             # <<<<<<<<<<<<<<
  *         if nt:
  *             if nt[0][1] == lex_f_i:
  */
-  __pyx_t_4 = PyObject_Length(__pyx_v_f_span); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_3 = PyInt_FromSsize_t((__pyx_t_4 - 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_Length(__pyx_v_f_span); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t((__pyx_t_4 - 1)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_1 = PyNumber_Add(__pyx_v_f_i, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2111; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_f_i, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __pyx_v_lex_f_j = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2112
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2106
  *         lex_f_i = f_i
  *         lex_f_j = f_i + (len(f_span) - 1)
  *         if nt:             # <<<<<<<<<<<<<<
  *             if nt[0][1] == lex_f_i:
  *                 lex_f_i += (nt[0][2] - nt[0][1]) + 1
  */
-  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2112; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_v_nt); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_13) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2113
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2107
  *         lex_f_j = f_i + (len(f_span) - 1)
  *         if nt:
  *             if nt[0][1] == lex_f_i:             # <<<<<<<<<<<<<<
  *                 lex_f_i += (nt[0][2] - nt[0][1]) + 1
  *             if nt[-1][2] == lex_f_j:
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_v_lex_f_i, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_3, __pyx_v_lex_f_i, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_13) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2114
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2108
  *         if nt:
  *             if nt[0][1] == lex_f_i:
  *                 lex_f_i += (nt[0][2] - nt[0][1]) + 1             # <<<<<<<<<<<<<<
  *             if nt[-1][2] == lex_f_j:
  *                 lex_f_j -= (nt[-1][2] - nt[-1][1]) + 1
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_Subtract(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __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_t_2 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_lex_f_i, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_lex_f_i, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_v_lex_f_i);
@@ -63395,49 +63066,50 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
     }
     __pyx_L24:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2115
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2109
  *             if nt[0][1] == lex_f_i:
  *                 lex_f_i += (nt[0][2] - nt[0][1]) + 1
  *             if nt[-1][2] == lex_f_j:             # <<<<<<<<<<<<<<
  *                 lex_f_j -= (nt[-1][2] - nt[-1][1]) + 1
  * 
  */
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2109; __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_t_2, __pyx_v_lex_f_j, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_v_lex_f_j, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_13 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_13 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_13) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2116
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2110
  *                 lex_f_i += (nt[0][2] - nt[0][1]) + 1
  *             if nt[-1][2] == lex_f_j:
  *                 lex_f_j -= (nt[-1][2] - nt[-1][1]) + 1             # <<<<<<<<<<<<<<
  * 
  *         # Create rule (f_phrase, e_phrase, links, f_link_min, f_link_max)
  */
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_1, 2, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_nt, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = __Pyx_GetItemInt(__pyx_t_1, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_Subtract(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __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_3); __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyNumber_Add(__pyx_t_1, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-      __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_lex_f_j, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_lex_f_j, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
       __Pyx_DECREF(__pyx_v_lex_f_j);
@@ -63450,63 +63122,63 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
   }
   __pyx_L23:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2119
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2113
  * 
  *         # Create rule (f_phrase, e_phrase, links, f_link_min, f_link_max)
  *         f = Phrase(f_sym)             # <<<<<<<<<<<<<<
  *         e = Phrase(e_sym)
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)
  */
-  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __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 = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_f_sym));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_f_sym));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_f_sym));
-  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2113; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   __pyx_v_f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2120
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2114
  *         # Create rule (f_phrase, e_phrase, links, f_link_min, f_link_max)
  *         f = Phrase(f_sym)
  *         e = Phrase(e_sym)             # <<<<<<<<<<<<<<
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)
  *         return (f, e, a, lex_f_i, lex_f_j)
  */
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __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 = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_v_e_sym));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_e_sym));
   __Pyx_GIVEREF(((PyObject *)__pyx_v_e_sym));
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_e = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2121
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2115
  *         f = Phrase(f_sym)
  *         e = Phrase(e_sym)
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)             # <<<<<<<<<<<<<<
  *         return (f, e, a, lex_f_i, lex_f_j)
  * 
  */
-  __pyx_t_1 = __pyx_pf_3_sa_23HieroCachingRuleFactory_9form_rule_2genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __pyx_pf_3_sa_23HieroCachingRuleFactory_9form_rule_2genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __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[8]; __pyx_lineno = 2121; __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 = 2115; __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);
   __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)(&PyTuple_Type))), ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
   __pyx_v_a = ((PyObject*)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2122
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2116
  *         e = Phrase(e_sym)
  *         a = tuple(self.alignment.link(i, j) for (i, j) in links)
  *         return (f, e, a, lex_f_i, lex_f_j)             # <<<<<<<<<<<<<<
@@ -63514,7 +63186,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_27form_rule(struct __py
  *     # Rule string from rule
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(5); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2116; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(((PyObject *)__pyx_v_f));
   PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_f));
@@ -63575,11 +63247,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_30fmt_rule(PyObject *__
   PyObject *__pyx_v_f = 0;
   PyObject *__pyx_v_e = 0;
   PyObject *__pyx_v_a = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__a,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("fmt_rule (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f,&__pyx_n_s__e,&__pyx_n_s__a,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -63594,21 +63266,24 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_30fmt_rule(PyObject *__
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
+        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__e)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__a)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__a);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fmt_rule") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fmt_rule") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -63623,7 +63298,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_30fmt_rule(PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("fmt_rule", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.fmt_rule", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -63635,7 +63310,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_30fmt_rule(PyObject *__
 }
 static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2126
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2120
  *     # Rule string from rule
  *     def fmt_rule(self, f, e, a):
  *         a_str = ' '.join('{0}-{1}'.format(*self.alignment.unlink(packed)) for packed in a)             # <<<<<<<<<<<<<<
@@ -63661,7 +63336,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_8fmt_rule_genexpr(PyObj
   __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_23HieroCachingRuleFactory_8fmt_rule_2generator16, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16, (PyObject *) __pyx_cur_scope); if (unlikely(!gen)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_cur_scope);
     __Pyx_RefNannyFinishContext();
     return (PyObject *) gen;
@@ -63700,37 +63375,29 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16(
     return NULL;
   }
   __pyx_L3_first_run:;
-  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_a)) { __Pyx_RaiseClosureNameError("a"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_a)) { __Pyx_RaiseClosureNameError("a"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
   if (PyList_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_a) || PyTuple_CheckExact(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_a)) {
     __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_a; __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_a); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_a); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __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[8]; __pyx_lineno = 2126; __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 = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 2126; __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 = 2126; __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[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -63741,24 +63408,24 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16(
     __Pyx_GIVEREF(__pyx_t_4);
     __pyx_cur_scope->__pyx_v_packed = __pyx_t_4;
     __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_139), __pyx_n_s__format); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_138), __pyx_n_s__format); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment), __pyx_n_s__unlink); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __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[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_5 = PyObject_GetAttr(((PyObject *)__pyx_cur_scope->__pyx_outer_scope->__pyx_v_self->alignment), __pyx_n_s__unlink); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_6);
     __Pyx_INCREF(__pyx_cur_scope->__pyx_v_packed);
     PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_cur_scope->__pyx_v_packed);
     __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_packed);
-    __pyx_t_7 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
-    __pyx_t_6 = PySequence_Tuple(__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PySequence_Tuple(__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_6));
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-    __pyx_t_7 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
@@ -63779,7 +63446,7 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16(
     __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[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   PyErr_SetNone(PyExc_StopIteration);
@@ -63794,12 +63461,11 @@ static PyObject *__pyx_gb_3_sa_23HieroCachingRuleFactory_8fmt_rule_2generator16(
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2125
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2119
  * 
  *     # Rule string from rule
  *     def fmt_rule(self, f, e, a):             # <<<<<<<<<<<<<<
@@ -63832,30 +63498,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_29fmt_rule(struct __pyx
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_a);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_a);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2126
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2120
  *     # Rule string from rule
  *     def fmt_rule(self, f, e, a):
  *         a_str = ' '.join('{0}-{1}'.format(*self.alignment.unlink(packed)) for packed in a)             # <<<<<<<<<<<<<<
  *         return '[X] ||| {0} ||| {1} ||| {2}'.format(f, e, a_str)
  * 
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_67), __pyx_n_s__join); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __pyx_pf_3_sa_23HieroCachingRuleFactory_8fmt_rule_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __pyx_pf_3_sa_23HieroCachingRuleFactory_8fmt_rule_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __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 = 2126; __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 = 2120; __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 = 2126; __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 = 2120; __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_v_a_str = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2127
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2121
  *     def fmt_rule(self, f, e, a):
  *         a_str = ' '.join('{0}-{1}'.format(*self.alignment.unlink(packed)) for packed in a)
  *         return '[X] ||| {0} ||| {1} ||| {2}'.format(f, e, a_str)             # <<<<<<<<<<<<<<
@@ -63863,9 +63529,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_29fmt_rule(struct __pyx
  *     # Debugging
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_140), __pyx_n_s__format); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(((PyObject *)__pyx_kp_s_139), __pyx_n_s__format); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __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 = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(__pyx_v_f);
   PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_f);
@@ -63876,7 +63542,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_29fmt_rule(struct __pyx
   __Pyx_INCREF(__pyx_v_a_str);
   PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_a_str);
   __Pyx_GIVEREF(__pyx_v_a_str);
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_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;
@@ -63911,7 +63577,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_32dump_online_stats(PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2130
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2124
  * 
  *     # Debugging
  *     def dump_online_stats(self):             # <<<<<<<<<<<<<<
@@ -63941,75 +63607,75 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("dump_online_stats", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2131
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2125
  *     # Debugging
  *     def dump_online_stats(self):
  *         logger.info('------------------------------')             # <<<<<<<<<<<<<<
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __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_142), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_141), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2132
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2126
  *     def dump_online_stats(self):
  *         logger.info('------------------------------')
  *         logger.info('         Online Stats         ')             # <<<<<<<<<<<<<<
  *         logger.info('------------------------------')
  *         logger.info('f')
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __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_144), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_143), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2133
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2127
  *         logger.info('------------------------------')
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')             # <<<<<<<<<<<<<<
  *         logger.info('f')
  *         for w in self.bilex_f:
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __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_145), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_144), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2134
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2128
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')
  *         logger.info('f')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_f:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2128; __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_146), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_145), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2128; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2135
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2129
  *         logger.info('------------------------------')
  *         logger.info('f')
  *         for w in self.bilex_f:             # <<<<<<<<<<<<<<
@@ -64020,31 +63686,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_t_1 = __pyx_v_self->bilex_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_4 && 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[8]; __pyx_lineno = 2135; __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[8]; __pyx_lineno = 2135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
     } else if (!__pyx_t_4 && 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[8]; __pyx_lineno = 2135; __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[8]; __pyx_lineno = 2135; __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)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64054,44 +63712,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_v_w = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2136
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2130
  *         logger.info('f')
  *         for w in self.bilex_f:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))             # <<<<<<<<<<<<<<
  *         logger.info('e')
  *         for w in self.bilex_e:
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __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 = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-    __pyx_t_7 = PyNumber_Add(((PyObject *)__pyx_t_2), ((PyObject *)__pyx_kp_s_147)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyNumber_Add(((PyObject *)__pyx_t_2), ((PyObject *)__pyx_kp_s_146)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->bilex_f, __pyx_v_w); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetItem(__pyx_v_self->bilex_f, __pyx_v_w); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __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 = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __pyx_t_8 = PyNumber_Add(__pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyNumber_Add(__pyx_t_7, __pyx_t_2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __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 = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_8);
     __Pyx_GIVEREF(__pyx_t_8);
     __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
@@ -64099,24 +63757,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2137
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2131
  *         for w in self.bilex_f:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))
  *         logger.info('e')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_e:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_148), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_147), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2138
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2132
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))
  *         logger.info('e')
  *         for w in self.bilex_e:             # <<<<<<<<<<<<<<
@@ -64127,31 +63785,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_t_1 = __pyx_v_self->bilex_e; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_8 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++;
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_8 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++;
     } else {
       __pyx_t_8 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_8)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64161,44 +63811,44 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_v_w = __pyx_t_8;
     __pyx_t_8 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2139
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2133
  *         logger.info('e')
  *         for w in self.bilex_e:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))             # <<<<<<<<<<<<<<
  *         logger.info('fe')
  *         for w in self.bilex_fe:
  */
-    __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __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[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_2 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_8 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(((PyObject *)__pyx_t_8));
-    __pyx_t_5 = PyNumber_Add(((PyObject *)__pyx_t_8), ((PyObject *)__pyx_kp_s_147)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyNumber_Add(((PyObject *)__pyx_t_8), ((PyObject *)__pyx_kp_s_146)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_GetItem(__pyx_v_self->bilex_e, __pyx_v_w); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_GetItem(__pyx_v_self->bilex_e, __pyx_v_w); if (!__pyx_t_8) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __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 = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_8);
     __Pyx_GIVEREF(__pyx_t_8);
     __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_7), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-    __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyNumber_Add(__pyx_t_5, __pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __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 = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7);
     __Pyx_GIVEREF(__pyx_t_7);
     __pyx_t_7 = 0;
-    __pyx_t_7 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
@@ -64206,24 +63856,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2140
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2134
  *         for w in self.bilex_e:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))
  *         logger.info('fe')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_fe:
  *             for w2 in self.bilex_fe[w]:
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_7 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_7 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_7);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_149), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_k_tuple_148), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2141
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2135
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))
  *         logger.info('fe')
  *         for w in self.bilex_fe:             # <<<<<<<<<<<<<<
@@ -64234,31 +63884,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_t_1 = __pyx_v_self->bilex_fe; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_fe); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->bilex_fe); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++;
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_7 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_7); __pyx_t_3++;
     } else {
       __pyx_t_7 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_7)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64268,20 +63910,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_v_w = __pyx_t_7;
     __pyx_t_7 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2142
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2136
  *         logger.info('fe')
  *         for w in self.bilex_fe:
  *             for w2 in self.bilex_fe[w]:             # <<<<<<<<<<<<<<
  *                 logger.info(sym_tostring(w) + ' : ' + sym_tostring(w2) + ' : ' + str(self.bilex_fe[w][w2]))
  *         logger.info('F')
  */
-    __pyx_t_7 = PyObject_GetItem(__pyx_v_self->bilex_fe, __pyx_v_w); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_GetItem(__pyx_v_self->bilex_fe, __pyx_v_w); if (!__pyx_t_7) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_7);
     if (PyList_CheckExact(__pyx_t_7) || PyTuple_CheckExact(__pyx_t_7)) {
       __pyx_t_8 = __pyx_t_7; __Pyx_INCREF(__pyx_t_8); __pyx_t_9 = 0;
       __pyx_t_10 = NULL;
     } else {
-      __pyx_t_9 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = -1; __pyx_t_8 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __pyx_t_10 = Py_TYPE(__pyx_t_8)->tp_iternext;
     }
@@ -64289,24 +63931,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     for (;;) {
       if (!__pyx_t_10 && PyList_CheckExact(__pyx_t_8)) {
         if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_8)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_7 = PySequence_ITEM(__pyx_t_8, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++;
       } else if (!__pyx_t_10 && PyTuple_CheckExact(__pyx_t_8)) {
         if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_8)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_7 = PySequence_ITEM(__pyx_t_8, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_8, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++;
       } else {
         __pyx_t_7 = __pyx_t_10(__pyx_t_8);
         if (unlikely(!__pyx_t_7)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -64316,57 +63950,57 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
       __pyx_v_w2 = __pyx_t_7;
       __pyx_t_7 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2143
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2137
  *         for w in self.bilex_fe:
  *             for w2 in self.bilex_fe[w]:
  *                 logger.info(sym_tostring(w) + ' : ' + sym_tostring(w2) + ' : ' + str(self.bilex_fe[w][w2]))             # <<<<<<<<<<<<<<
  *         logger.info('F')
  *         for ph in self.phrases_f:
  */
-      __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
-      __pyx_t_2 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_7));
-      __pyx_t_5 = PyNumber_Add(((PyObject *)__pyx_t_7), ((PyObject *)__pyx_kp_s_147)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyNumber_Add(((PyObject *)__pyx_t_7), ((PyObject *)__pyx_kp_s_146)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __pyx_t_7 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = __Pyx_PyInt_AsInt(__pyx_v_w2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyBytes_FromString(__pyx_f_3_sa_sym_tostring(__pyx_t_6)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(((PyObject *)__pyx_t_7));
-      __pyx_t_11 = PyNumber_Add(__pyx_t_5, ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyNumber_Add(__pyx_t_5, ((PyObject *)__pyx_t_7)); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0;
-      __pyx_t_7 = PyNumber_Add(__pyx_t_11, ((PyObject *)__pyx_kp_s_147)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_7 = PyNumber_Add(__pyx_t_11, ((PyObject *)__pyx_kp_s_146)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_7);
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      __pyx_t_11 = PyObject_GetItem(__pyx_v_self->bilex_fe, __pyx_v_w); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_GetItem(__pyx_v_self->bilex_fe, __pyx_v_w); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
-      __pyx_t_5 = PyObject_GetItem(__pyx_t_11, __pyx_v_w2); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_GetItem(__pyx_t_11, __pyx_v_w2); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-      __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5);
       __Pyx_GIVEREF(__pyx_t_5);
       __pyx_t_5 = 0;
-      __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
-      __pyx_t_11 = PyNumber_Add(__pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyNumber_Add(__pyx_t_7, __pyx_t_5); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       __Pyx_DECREF(__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 = 2143; __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 = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_11);
       __Pyx_GIVEREF(__pyx_t_11);
       __pyx_t_11 = 0;
-      __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_11);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -64376,24 +64010,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2144
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2138
  *             for w2 in self.bilex_fe[w]:
  *                 logger.info(sym_tostring(w) + ' : ' + sym_tostring(w2) + ' : ' + str(self.bilex_fe[w][w2]))
  *         logger.info('F')             # <<<<<<<<<<<<<<
  *         for ph in self.phrases_f:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_150), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_149), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2145
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2139
  *                 logger.info(sym_tostring(w) + ' : ' + sym_tostring(w2) + ' : ' + str(self.bilex_fe[w][w2]))
  *         logger.info('F')
  *         for ph in self.phrases_f:             # <<<<<<<<<<<<<<
@@ -64404,31 +64038,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_t_1 = __pyx_v_self->phrases_f; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->phrases_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->phrases_f); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_4 && PyList_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_8 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_8 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++;
     } else if (!__pyx_t_4 && PyTuple_CheckExact(__pyx_t_1)) {
       if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
-      #if CYTHON_COMPILING_IN_CPYTHON
-      __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #else
-      __pyx_t_8 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_8 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_8); __pyx_t_3++;
     } else {
       __pyx_t_8 = __pyx_t_4(__pyx_t_1);
       if (unlikely(!__pyx_t_8)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64438,49 +64064,49 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_v_ph = __pyx_t_8;
     __pyx_t_8 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2146
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2140
  *         logger.info('F')
  *         for ph in self.phrases_f:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))             # <<<<<<<<<<<<<<
  *         logger.info('E')
  *         for ph in self.phrases_e:
  */
-    __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __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[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
-    __pyx_t_11 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_GetAttr(__pyx_t_8, __pyx_n_s__info); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __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 = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_INCREF(__pyx_v_ph);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_v_ph);
     __Pyx_GIVEREF(__pyx_v_ph);
-    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __pyx_t_8 = PyNumber_Add(__pyx_t_5, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyNumber_Add(__pyx_t_5, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_GetItem(__pyx_v_self->phrases_f, __pyx_v_ph); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetItem(__pyx_v_self->phrases_f, __pyx_v_ph); if (!__pyx_t_5) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __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 = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5);
     __Pyx_GIVEREF(__pyx_t_5);
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __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 = PyNumber_Add(__pyx_t_8, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_t_8, __pyx_t_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
     __Pyx_DECREF(__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 = 2146; __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 = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2);
     __Pyx_GIVEREF(__pyx_t_2);
     __pyx_t_2 = 0;
-    __pyx_t_2 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyObject_Call(__pyx_t_11, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -64488,24 +64114,24 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2147
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2141
  *         for ph in self.phrases_f:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))
  *         logger.info('E')             # <<<<<<<<<<<<<<
  *         for ph in self.phrases_e:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __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_151), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_150), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2148
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2142
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))
  *         logger.info('E')
  *         for ph in self.phrases_e:             # <<<<<<<<<<<<<<
@@ -64516,31 +64142,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_t_1 = __pyx_v_self->phrases_e; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
     __pyx_t_4 = NULL;
   } else {
-    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->phrases_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->phrases_e); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = Py_TYPE(__pyx_t_1)->tp_iternext;
   }
   for (;;) {
     if (!__pyx_t_4 && 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[8]; __pyx_lineno = 2148; __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[8]; __pyx_lineno = 2148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_2); __pyx_t_3++;
     } else if (!__pyx_t_4 && 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[8]; __pyx_lineno = 2148; __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[8]; __pyx_lineno = 2148; __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)) {
         if (PyErr_Occurred()) {
           if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2142; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64550,49 +64168,49 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
     __pyx_v_ph = __pyx_t_2;
     __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2149
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2143
  *         logger.info('E')
  *         for ph in self.phrases_e:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))             # <<<<<<<<<<<<<<
  *         logger.info('FE')
  *         self.dump_online_rules()
  */
-    __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __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 = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__info); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __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 = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_ph);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_ph);
     __Pyx_GIVEREF(__pyx_v_ph);
-    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-    __pyx_t_2 = PyNumber_Add(__pyx_t_11, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Add(__pyx_t_11, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-    __pyx_t_11 = PyObject_GetItem(__pyx_v_self->phrases_e, __pyx_v_ph); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_GetItem(__pyx_v_self->phrases_e, __pyx_v_ph); if (!__pyx_t_11) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
-    __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __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 = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_11);
     __Pyx_GIVEREF(__pyx_t_11);
     __pyx_t_11 = 0;
-    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_8), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0;
-    __pyx_t_8 = PyNumber_Add(__pyx_t_2, __pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyNumber_Add(__pyx_t_2, __pyx_t_11); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
-    __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_11);
     PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_8);
     __Pyx_GIVEREF(__pyx_t_8);
     __pyx_t_8 = 0;
-    __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = PyObject_Call(__pyx_t_5, ((PyObject *)__pyx_t_11), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2143; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_8);
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_11)); __pyx_t_11 = 0;
@@ -64600,33 +64218,33 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_31dump_online_stats(str
   }
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2150
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2144
  *         for ph in self.phrases_e:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))
  *         logger.info('FE')             # <<<<<<<<<<<<<<
  *         self.dump_online_rules()
  * 
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_152), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_k_tuple_151), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2151
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2145
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))
  *         logger.info('FE')
  *         self.dump_online_rules()             # <<<<<<<<<<<<<<
  * 
  *     def dump_online_rules(self):
  */
-  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dump_online_rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dump_online_rules); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_8 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2145; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_8);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
@@ -64662,7 +64280,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_34dump_online_rules(PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2153
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2147
  *         self.dump_online_rules()
  * 
  *     def dump_online_rules(self):             # <<<<<<<<<<<<<<
@@ -64692,7 +64310,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("dump_online_rules", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2154
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2148
  * 
  *     def dump_online_rules(self):
  *         for ph in self.phrases_fe:             # <<<<<<<<<<<<<<
@@ -64703,31 +64321,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
     __pyx_t_1 = __pyx_v_self->phrases_fe; __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_self->phrases_fe); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_self->phrases_fe); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2148; __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[8]; __pyx_lineno = 2154; __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 = 2154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      #endif
+      __pyx_t_4 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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 = 2154; __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 = 2154; __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[8]; __pyx_lineno = 2154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+          else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         }
         break;
       }
@@ -64737,20 +64347,20 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
     __pyx_v_ph = __pyx_t_4;
     __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2155
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2149
  *     def dump_online_rules(self):
  *         for ph in self.phrases_fe:
  *             for ph2 in self.phrases_fe[ph]:             # <<<<<<<<<<<<<<
  *                 logger.info(self.fmt_rule(str(ph), str(ph2), self.phrases_al[ph][ph2]) + ' ||| ' + str(self.phrases_fe[ph][ph2]))
  * 
  */
-    __pyx_t_4 = PyObject_GetItem(__pyx_v_self->phrases_fe, __pyx_v_ph); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_GetItem(__pyx_v_self->phrases_fe, __pyx_v_ph); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __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_5 = __pyx_t_4; __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_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_6 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __pyx_t_7 = Py_TYPE(__pyx_t_5)->tp_iternext;
     }
@@ -64758,24 +64368,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
     for (;;) {
       if (!__pyx_t_7 && PyList_CheckExact(__pyx_t_5)) {
         if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_4); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_4); __pyx_t_6++;
       } else if (!__pyx_t_7 && PyTuple_CheckExact(__pyx_t_5)) {
         if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
-        #if CYTHON_COMPILING_IN_CPYTHON
-        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_4); __pyx_t_6++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #else
-        __pyx_t_4 = PySequence_ITEM(__pyx_t_5, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        #endif
+        __pyx_t_4 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_6); __Pyx_INCREF(__pyx_t_4); __pyx_t_6++;
       } else {
         __pyx_t_4 = __pyx_t_7(__pyx_t_5);
         if (unlikely(!__pyx_t_4)) {
           if (PyErr_Occurred()) {
             if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) PyErr_Clear();
-            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+            else {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
           }
           break;
         }
@@ -64785,42 +64387,42 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
       __pyx_v_ph2 = __pyx_t_4;
       __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2156
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2150
  *         for ph in self.phrases_fe:
  *             for ph2 in self.phrases_fe[ph]:
  *                 logger.info(self.fmt_rule(str(ph), str(ph2), self.phrases_al[ph][ph2]) + ' ||| ' + str(self.phrases_fe[ph][ph2]))             # <<<<<<<<<<<<<<
  * 
  *     # Lookup online stats for phrase pair (f, e).  Return None if no match.
  */
-      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__logger); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_8 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__info); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_8);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__fmt_rule); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__fmt_rule); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __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 = 2156; __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 = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_ph);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_ph);
       __Pyx_GIVEREF(__pyx_v_ph);
-      __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_10 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_10);
       __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 = 2156; __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 = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_INCREF(__pyx_v_ph2);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_ph2);
       __Pyx_GIVEREF(__pyx_v_ph2);
-      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_11 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __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 = PyObject_GetItem(__pyx_v_self->phrases_al, __pyx_v_ph); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyObject_GetItem(__pyx_v_self->phrases_al, __pyx_v_ph); if (!__pyx_t_9) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
-      __pyx_t_12 = PyObject_GetItem(__pyx_t_9, __pyx_v_ph2); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_GetItem(__pyx_t_9, __pyx_v_ph2); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
-      __pyx_t_9 = PyTuple_New(3); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __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 = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_10);
       __Pyx_GIVEREF(__pyx_t_10);
@@ -64831,36 +64433,36 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_33dump_online_rules(str
       __pyx_t_10 = 0;
       __pyx_t_11 = 0;
       __pyx_t_12 = 0;
-      __pyx_t_12 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_9), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_9)); __pyx_t_9 = 0;
-      __pyx_t_9 = PyNumber_Add(__pyx_t_12, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_9 = PyNumber_Add(__pyx_t_12, ((PyObject *)__pyx_kp_s_18)); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_9);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-      __pyx_t_12 = PyObject_GetItem(__pyx_v_self->phrases_fe, __pyx_v_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_GetItem(__pyx_v_self->phrases_fe, __pyx_v_ph); if (!__pyx_t_12) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
-      __pyx_t_4 = PyObject_GetItem(__pyx_t_12, __pyx_v_ph2); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_GetItem(__pyx_t_12, __pyx_v_ph2); if (!__pyx_t_4) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
-      __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __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 = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4);
       __Pyx_GIVEREF(__pyx_t_4);
       __pyx_t_4 = 0;
-      __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), ((PyObject *)__pyx_t_12), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_DECREF(((PyObject *)__pyx_t_12)); __pyx_t_12 = 0;
-      __pyx_t_12 = PyNumber_Add(__pyx_t_9, __pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyNumber_Add(__pyx_t_9, __pyx_t_4); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
       __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 = 2156; __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 = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_12);
       __Pyx_GIVEREF(__pyx_t_12);
       __pyx_t_12 = 0;
-      __pyx_t_12 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_12 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_12);
       __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
@@ -64896,11 +64498,11 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_36online_ctx_lookup(PyO
 static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_36online_ctx_lookup(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   PyObject *__pyx_v_f = 0;
   PyObject *__pyx_v_e = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f,&__pyx_n_s__e,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("online_ctx_lookup (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f,&__pyx_n_s__e,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -64914,16 +64516,18 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_36online_ctx_lookup(PyO
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f);
+        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__e)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__e);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("online_ctx_lookup", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("online_ctx_lookup", 1, 2, 2, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "online_ctx_lookup") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "online_ctx_lookup") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -64936,7 +64540,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_36online_ctx_lookup(PyO
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("online_ctx_lookup", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("online_ctx_lookup", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2154; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.online_ctx_lookup", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -64947,7 +64551,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_36online_ctx_lookup(PyO
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2160
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2154
  *     # Lookup online stats for phrase pair (f, e).  Return None if no match.
  *     # IMPORTANT: use get() to avoid adding items to defaultdict
  *     def online_ctx_lookup(self, f, e):             # <<<<<<<<<<<<<<
@@ -64972,7 +64576,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("online_ctx_lookup", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2161
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2155
  *     # IMPORTANT: use get() to avoid adding items to defaultdict
  *     def online_ctx_lookup(self, f, e):
  *         if self.online:             # <<<<<<<<<<<<<<
@@ -64981,16 +64585,16 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
  */
   if (__pyx_v_self->online) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2162
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2156
  *     def online_ctx_lookup(self, f, e):
  *         if self.online:
  *             fcount = self.phrases_f.get(f, 0)             # <<<<<<<<<<<<<<
  *             fsample_count = self.samples_f.get(f, 0)
  *             d = self.phrases_fe.get(f, None)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->phrases_f, __pyx_n_s__get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->phrases_f, __pyx_n_s__get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2156; __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 = 2162; __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 = 2156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_f);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
@@ -64998,23 +64602,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
     __Pyx_INCREF(__pyx_int_0);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_0);
     __Pyx_GIVEREF(__pyx_int_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 = 2162; __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 = 2156; __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_v_fcount = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2163
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2157
  *         if self.online:
  *             fcount = self.phrases_f.get(f, 0)
  *             fsample_count = self.samples_f.get(f, 0)             # <<<<<<<<<<<<<<
  *             d = self.phrases_fe.get(f, None)
  *             paircount = d.get(e, 0) if d else 0
  */
-    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self->samples_f, __pyx_n_s__get); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetAttr(__pyx_v_self->samples_f, __pyx_n_s__get); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2157; __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 = 2163; __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 = 2157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_f);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
@@ -65022,23 +64626,23 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
     __Pyx_INCREF(__pyx_int_0);
     PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_0);
     __Pyx_GIVEREF(__pyx_int_0);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_v_fsample_count = __pyx_t_1;
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2164
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2158
  *             fcount = self.phrases_f.get(f, 0)
  *             fsample_count = self.samples_f.get(f, 0)
  *             d = self.phrases_fe.get(f, None)             # <<<<<<<<<<<<<<
  *             paircount = d.get(e, 0) if d else 0
  *             return OnlineFeatureContext(fcount, fsample_count, paircount, self.bilex_f, self.bilex_e, self.bilex_fe)
  */
-    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->phrases_fe, __pyx_n_s__get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetAttr(__pyx_v_self->phrases_fe, __pyx_n_s__get); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2158; __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 = 2164; __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 = 2158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_f);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f);
@@ -65046,25 +64650,25 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
     __Pyx_INCREF(Py_None);
     PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
     __Pyx_GIVEREF(Py_None);
-    __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 = 2164; __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 = 2158; __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_v_d = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2165
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2159
  *             fsample_count = self.samples_f.get(f, 0)
  *             d = self.phrases_fe.get(f, None)
  *             paircount = d.get(e, 0) if d else 0             # <<<<<<<<<<<<<<
  *             return OnlineFeatureContext(fcount, fsample_count, paircount, self.bilex_f, self.bilex_e, self.bilex_fe)
  *         return None
  */
-    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_d); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_d); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_4) {
-      __pyx_t_2 = PyObject_GetAttr(__pyx_v_d, __pyx_n_s__get); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_GetAttr(__pyx_v_d, __pyx_n_s__get); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2159; __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[8]; __pyx_lineno = 2165; __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 = 2159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_INCREF(__pyx_v_e);
       PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_e);
@@ -65072,7 +64676,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
       __Pyx_INCREF(__pyx_int_0);
       PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
       __Pyx_GIVEREF(__pyx_int_0);
-      __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
@@ -65085,7 +64689,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
     __pyx_v_paircount = __pyx_t_3;
     __pyx_t_3 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2166
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2160
  *             d = self.phrases_fe.get(f, None)
  *             paircount = d.get(e, 0) if d else 0
  *             return OnlineFeatureContext(fcount, fsample_count, paircount, self.bilex_f, self.bilex_e, self.bilex_fe)             # <<<<<<<<<<<<<<
@@ -65093,9 +64697,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
  * 
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s_153); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s_152); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyTuple_New(6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_INCREF(__pyx_v_fcount);
     PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_fcount);
@@ -65115,7 +64719,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
     __Pyx_INCREF(__pyx_v_self->bilex_fe);
     PyTuple_SET_ITEM(__pyx_t_5, 5, __pyx_v_self->bilex_fe);
     __Pyx_GIVEREF(__pyx_v_self->bilex_fe);
-    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
     __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
@@ -65126,7 +64730,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_35online_ctx_lookup(str
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2167
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2161
  *             paircount = d.get(e, 0) if d else 0
  *             return OnlineFeatureContext(fcount, fsample_count, paircount, self.bilex_f, self.bilex_e, self.bilex_fe)
  *         return None             # <<<<<<<<<<<<<<
@@ -65179,11 +64783,12 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extrac
   PyObject *__pyx_v_wc = 0;
   PyObject *__pyx_v_ntc = 0;
   PyObject *__pyx_v_syms = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__f_j,&__pyx_n_s__lex_i,&__pyx_n_s__lex_j,&__pyx_n_s__wc,&__pyx_n_s__ntc,&__pyx_n_s__syms,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("extract (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__f_i,&__pyx_n_s__f_j,&__pyx_n_s__lex_i,&__pyx_n_s__lex_j,&__pyx_n_s__wc,&__pyx_n_s__ntc,&__pyx_n_s__syms,0};
     PyObject* values[7] = {0,0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -65202,41 +64807,48 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extrac
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_i)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_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__f_j)) != 0)) kw_args--;
+        values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f_j);
+        if (likely(values[1])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lex_i)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lex_i);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lex_j)) != 0)) kw_args--;
+        values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lex_j);
+        if (likely(values[3])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 3); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__wc)) != 0)) kw_args--;
+        values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__wc);
+        if (likely(values[4])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 4); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ntc)) != 0)) kw_args--;
+        values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__ntc);
+        if (likely(values[5])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 5); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  6:
-        if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__syms)) != 0)) kw_args--;
+        values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__syms);
+        if (likely(values[6])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, 6); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "extract") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "extract") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 7) {
       goto __pyx_L5_argtuple_error;
@@ -65259,7 +64871,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extrac
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("extract", 1, 7, 7, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.HieroCachingRuleFactory.get_f_phrases.extract", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -65270,7 +64882,7 @@ static PyObject *__pyx_pw_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extrac
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2177
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2171
  *         phrases = set() # (fphrase, lex_i, lex_j)
  * 
  *         def extract(f_i, f_j, lex_i, lex_j, wc, ntc, syms):             # <<<<<<<<<<<<<<
@@ -65302,33 +64914,35 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   __pyx_outer_scope = (struct __pyx_obj_3_sa___pyx_scope_struct_26_get_f_phrases *) __Pyx_CyFunction_GetClosure(__pyx_self);
   __pyx_cur_scope = __pyx_outer_scope;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2179
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2173
  *         def extract(f_i, f_j, lex_i, lex_j, wc, ntc, syms):
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:             # <<<<<<<<<<<<<<
  *                 return
  *             # Extend with word
  */
-  if (unlikely(!__pyx_cur_scope->__pyx_v_f_len)) { __Pyx_RaiseClosureNameError("f_len"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-  __pyx_t_1 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__pyx_cur_scope->__pyx_v_f_len)) { __Pyx_RaiseClosureNameError("f_len"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+  __pyx_t_1 = PyNumber_Subtract(__pyx_cur_scope->__pyx_v_f_len, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyObject_RichCompare(__pyx_v_f_j, __pyx_t_1, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __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 = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   if (!__pyx_t_3) {
-    __pyx_t_2 = PyNumber_Subtract(__pyx_v_f_j, __pyx_v_f_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyNumber_Subtract(__pyx_v_f_j, __pyx_v_f_i); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_self)) { __Pyx_RaiseClosureNameError("self"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_initial_size); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_GT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_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_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __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 = 2173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __pyx_t_6 = __pyx_t_5;
   } else {
@@ -65336,7 +64950,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   }
   if (__pyx_t_6) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2180
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2174
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  *                 return             # <<<<<<<<<<<<<<
@@ -65350,58 +64964,59 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   }
   __pyx_L3:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2182
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2176
  *                 return
  *             # Extend with word
  *             if wc + ntc < self.max_length:             # <<<<<<<<<<<<<<
  *                 syms.append(f_words[f_j])
  *                 f = Phrase(syms)
  */
-  __pyx_t_4 = PyNumber_Add(__pyx_v_wc, __pyx_v_ntc); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_Add(__pyx_v_wc, __pyx_v_ntc); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2176; __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_2); __pyx_t_2 = 0;
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __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 = 2176; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   if (__pyx_t_6) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2183
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2177
  *             # Extend with word
  *             if wc + ntc < self.max_length:
  *                 syms.append(f_words[f_j])             # <<<<<<<<<<<<<<
  *                 f = Phrase(syms)
  *                 new_lex_i = min(lex_i, f_j)
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2183; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_1 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_f_words, __pyx_v_f_j); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_f_words)) { __Pyx_RaiseClosureNameError("f_words"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_1 = PyObject_GetItem(__pyx_cur_scope->__pyx_v_f_words, __pyx_v_f_j); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_syms, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Append(__pyx_v_syms, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2184
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2178
  *             if wc + ntc < self.max_length:
  *                 syms.append(f_words[f_j])
  *                 f = Phrase(syms)             # <<<<<<<<<<<<<<
  *                 new_lex_i = min(lex_i, f_j)
  *                 new_lex_j = max(lex_j, f_j)
  */
-    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2184; __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 = 2178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_syms);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_syms);
     __Pyx_GIVEREF(__pyx_v_syms);
-    __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2184; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2178; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __pyx_v_f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_1);
     __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2185
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2179
  *                 syms.append(f_words[f_j])
  *                 f = Phrase(syms)
  *                 new_lex_i = min(lex_i, f_j)             # <<<<<<<<<<<<<<
@@ -65412,8 +65027,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __pyx_t_1 = __pyx_v_f_j;
     __Pyx_INCREF(__pyx_v_lex_i);
     __pyx_t_2 = __pyx_v_lex_i;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2179; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_6) {
       __Pyx_INCREF(__pyx_t_1);
@@ -65428,7 +65044,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __pyx_v_new_lex_i = __pyx_t_4;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2186
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2180
  *                 f = Phrase(syms)
  *                 new_lex_i = min(lex_i, f_j)
  *                 new_lex_j = max(lex_j, f_j)             # <<<<<<<<<<<<<<
@@ -65439,8 +65055,9 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __pyx_t_4 = __pyx_v_f_j;
     __Pyx_INCREF(__pyx_v_lex_j);
     __pyx_t_1 = __pyx_v_lex_j;
-    __pyx_t_7 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_7 = PyObject_RichCompare(__pyx_t_4, __pyx_t_1, Py_GT); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_7);
+    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2180; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
     if (__pyx_t_6) {
       __Pyx_INCREF(__pyx_t_4);
@@ -65455,17 +65072,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __pyx_v_new_lex_j = __pyx_t_2;
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2187
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2181
  *                 new_lex_i = min(lex_i, f_j)
  *                 new_lex_j = max(lex_j, f_j)
  *                 phrases.add((f, new_lex_i, new_lex_j))             # <<<<<<<<<<<<<<
  *                 extract(f_i, f_j + 1, new_lex_i, new_lex_j, wc + 1, ntc, syms)
  *                 syms.pop()
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_phrases)) { __Pyx_RaiseClosureNameError("phrases"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_phrases, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_phrases)) { __Pyx_RaiseClosureNameError("phrases"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2181; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_phrases, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
-    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __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 = 2181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_INCREF(((PyObject *)__pyx_v_f));
     PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_f));
@@ -65476,30 +65093,30 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __Pyx_INCREF(__pyx_v_new_lex_j);
     PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_new_lex_j);
     __Pyx_GIVEREF(__pyx_v_new_lex_j);
-    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __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 = 2181; __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_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2181; __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_1)); __pyx_t_1 = 0;
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2188
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2182
  *                 new_lex_j = max(lex_j, f_j)
  *                 phrases.add((f, new_lex_i, new_lex_j))
  *                 extract(f_i, f_j + 1, new_lex_i, new_lex_j, wc + 1, ntc, syms)             # <<<<<<<<<<<<<<
  *                 syms.pop()
  *             # Extend with existing non-terminal
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_1 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_Add(__pyx_v_wc, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_f_i);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f_i);
@@ -65522,37 +65139,37 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     __Pyx_GIVEREF(__pyx_v_syms);
     __pyx_t_4 = 0;
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2182; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2189
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2183
  *                 phrases.add((f, new_lex_i, new_lex_j))
  *                 extract(f_i, f_j + 1, new_lex_i, new_lex_j, wc + 1, ntc, syms)
  *                 syms.pop()             # <<<<<<<<<<<<<<
  *             # Extend with existing non-terminal
  *             if syms and sym_isvar(syms[-1]):
  */
-    __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_syms); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_syms); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     goto __pyx_L4;
   }
   __pyx_L4:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2191
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2185
  *                 syms.pop()
  *             # Extend with existing non-terminal
  *             if syms and sym_isvar(syms[-1]):             # <<<<<<<<<<<<<<
  *                 # Don't re-extract the same phrase
  *                 extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc, syms)
  */
-  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_syms); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_syms); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_6) {
-    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_syms, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_syms, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_1); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2185; __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_8);
   } else {
@@ -65560,17 +65177,17 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   }
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2193
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2187
  *             if syms and sym_isvar(syms[-1]):
  *                 # Don't re-extract the same phrase
  *                 extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc, syms)             # <<<<<<<<<<<<<<
  *             # Extend with new non-terminal
  *             if wc + ntc < self.max_length:
  */
-    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2193; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-    __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+    __pyx_t_1 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_INCREF(__pyx_v_f_i);
     PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f_i);
@@ -65593,7 +65210,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_syms);
     __Pyx_GIVEREF(__pyx_v_syms);
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
@@ -65601,44 +65218,46 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   }
   __pyx_L5:;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2195
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2189
  *                 extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc, syms)
  *             # Extend with new non-terminal
  *             if wc + ntc < self.max_length:             # <<<<<<<<<<<<<<
  *                 if not syms or (ntc < self.max_nonterminals and not sym_isvar(syms[-1])):
  *                     syms.append(sym_setindex(self.category, ntc + 1))
  */
-  __pyx_t_1 = PyNumber_Add(__pyx_v_wc, __pyx_v_ntc); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyNumber_Add(__pyx_v_wc, __pyx_v_ntc); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_length); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyObject_RichCompare(__pyx_t_1, __pyx_t_2, Py_LT); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2189; __pyx_clineno = __LINE__; goto __pyx_L1_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_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __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[8]; __pyx_lineno = 2189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   if (__pyx_t_3) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2196
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2190
  *             # Extend with new non-terminal
  *             if wc + ntc < self.max_length:
  *                 if not syms or (ntc < self.max_nonterminals and not sym_isvar(syms[-1])):             # <<<<<<<<<<<<<<
  *                     syms.append(sym_setindex(self.category, ntc + 1))
  *                     f = Phrase(syms)
  */
-    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_syms); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_syms); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_6 = (!__pyx_t_3);
     if (!__pyx_t_6) {
-      __pyx_t_4 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyInt_FromLong(__pyx_cur_scope->__pyx_v_self->max_nonterminals); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_ntc, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_ntc, __pyx_t_4, Py_LT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2190; __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[8]; __pyx_lineno = 2196; __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 = 2190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
-        __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_syms, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_2 = __Pyx_GetItemInt(__pyx_v_syms, -1, sizeof(long), PyInt_FromLong); if (!__pyx_t_2) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
         __pyx_t_5 = (!__pyx_f_3_sa_sym_isvar(__pyx_t_8));
         __pyx_t_9 = __pyx_t_5;
@@ -65651,66 +65270,67 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
     }
     if (__pyx_t_3) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2197
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2191
  *             if wc + ntc < self.max_length:
  *                 if not syms or (ntc < self.max_nonterminals and not sym_isvar(syms[-1])):
  *                     syms.append(sym_setindex(self.category, ntc + 1))             # <<<<<<<<<<<<<<
  *                     f = Phrase(syms)
  *                     if wc > 0:
  */
-      __pyx_t_2 = PyNumber_Add(__pyx_v_ntc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyNumber_Add(__pyx_v_ntc, __pyx_int_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_8 = __Pyx_PyInt_AsInt(__pyx_t_2); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-      __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyInt_FromLong(__pyx_f_3_sa_sym_setindex(__pyx_cur_scope->__pyx_v_self->category, __pyx_t_8)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
-      __pyx_t_4 = __Pyx_PyObject_Append(__pyx_v_syms, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2197; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = __Pyx_PyObject_Append(__pyx_v_syms, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2191; __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_4); __pyx_t_4 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2198
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2192
  *                 if not syms or (ntc < self.max_nonterminals and not sym_isvar(syms[-1])):
  *                     syms.append(sym_setindex(self.category, ntc + 1))
  *                     f = Phrase(syms)             # <<<<<<<<<<<<<<
  *                     if wc > 0:
  *                         phrases.add((f, lex_i, lex_j))
  */
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2198; __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 = 2192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
       __Pyx_INCREF(__pyx_v_syms);
       PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_syms);
       __Pyx_GIVEREF(__pyx_v_syms);
-      __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2198; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_3_sa_Phrase)), ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
       __Pyx_XDECREF(((PyObject *)__pyx_v_f));
       __pyx_v_f = ((struct __pyx_obj_3_sa_Phrase *)__pyx_t_2);
       __pyx_t_2 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2199
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2193
  *                     syms.append(sym_setindex(self.category, ntc + 1))
  *                     f = Phrase(syms)
  *                     if wc > 0:             # <<<<<<<<<<<<<<
  *                         phrases.add((f, lex_i, lex_j))
  *                     extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc + 1, syms)
  */
-      __pyx_t_2 = PyObject_RichCompare(__pyx_v_wc, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2199; __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 = 2199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyObject_RichCompare(__pyx_v_wc, __pyx_int_0, Py_GT); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2193; __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[8]; __pyx_lineno = 2193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
       if (__pyx_t_3) {
 
-        /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2200
+        /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2194
  *                     f = Phrase(syms)
  *                     if wc > 0:
  *                         phrases.add((f, lex_i, lex_j))             # <<<<<<<<<<<<<<
  *                     extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc + 1, syms)
  *                     syms.pop()
  */
-        if (unlikely(!__pyx_cur_scope->__pyx_v_phrases)) { __Pyx_RaiseClosureNameError("phrases"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-        __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_phrases, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        if (unlikely(!__pyx_cur_scope->__pyx_v_phrases)) { __Pyx_RaiseClosureNameError("phrases"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2194; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+        __pyx_t_2 = PyObject_GetAttr(__pyx_cur_scope->__pyx_v_phrases, __pyx_n_s__add); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_2);
-        __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __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 = 2194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_INCREF(((PyObject *)__pyx_v_f));
         PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_f));
@@ -65721,12 +65341,12 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
         __Pyx_INCREF(__pyx_v_lex_j);
         PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_lex_j);
         __Pyx_GIVEREF(__pyx_v_lex_j);
-        __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __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 = 2194; __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_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2194; __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_1)); __pyx_t_1 = 0;
@@ -65735,19 +65355,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
       }
       __pyx_L8:;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2201
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2195
  *                     if wc > 0:
  *                         phrases.add((f, lex_i, lex_j))
  *                     extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc + 1, syms)             # <<<<<<<<<<<<<<
  *                     syms.pop()
  * 
  */
-      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
-      __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (unlikely(!__pyx_cur_scope->__pyx_v_extract)) { __Pyx_RaiseClosureNameError("extract"); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
+      __pyx_t_4 = PyNumber_Add(__pyx_v_f_j, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_1 = PyNumber_Add(__pyx_v_ntc, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyNumber_Add(__pyx_v_ntc, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
-      __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_2 = PyTuple_New(7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_2);
       __Pyx_INCREF(__pyx_v_f_i);
       PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_f_i);
@@ -65770,19 +65390,19 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
       __Pyx_GIVEREF(__pyx_v_syms);
       __pyx_t_4 = 0;
       __pyx_t_1 = 0;
-      __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2202
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2196
  *                         phrases.add((f, lex_i, lex_j))
  *                     extract(f_i, f_j + 1, lex_i, lex_j, wc, ntc + 1, syms)
  *                     syms.pop()             # <<<<<<<<<<<<<<
  * 
  *         # Try to extract phrases from every f index
  */
-      __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_syms); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_Pop(__pyx_v_syms); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
       goto __pyx_L7;
@@ -65810,7 +65430,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_13get_f_phrases_extract
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2172
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2166
  *     # (Used for EGivenFCoherent)
  *     # Return set of (fphrase, lex_i, lex_j)
  *     def get_f_phrases(self, f_words):             # <<<<<<<<<<<<<<
@@ -65846,7 +65466,7 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_37get_f_phrases(struct
   __Pyx_INCREF(__pyx_cur_scope->__pyx_v_f_words);
   __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_f_words);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2174
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2168
  *     def get_f_phrases(self, f_words):
  * 
  *         f_len = len(f_words)             # <<<<<<<<<<<<<<
@@ -65855,64 +65475,64 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_37get_f_phrases(struct
  */
   __pyx_t_1 = __pyx_cur_scope->__pyx_v_f_words;
   __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 = 2174; __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 = 2168; __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 = 2174; __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 = 2168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_f_len = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2175
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2169
  * 
  *         f_len = len(f_words)
  *         phrases = set() # (fphrase, lex_i, lex_j)             # <<<<<<<<<<<<<<
  * 
  *         def extract(f_i, f_j, lex_i, lex_j, wc, ntc, syms):
  */
-  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(((PyObject *)__pyx_t_1));
   __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
   __pyx_cur_scope->__pyx_v_phrases = ((PyObject *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2177
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2171
  *         phrases = set() # (fphrase, lex_i, lex_j)
  * 
  *         def extract(f_i, f_j, lex_i, lex_j, wc, ntc, syms):             # <<<<<<<<<<<<<<
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  */
-  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extract, 0, ((PyObject*)__pyx_cur_scope), __pyx_n_s___sa, ((PyObject *)__pyx_k_codeobj_155)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3_sa_23HieroCachingRuleFactory_13get_f_phrases_1extract, 0, ((PyObject*)__pyx_cur_scope), __pyx_n_s___sa, ((PyObject *)__pyx_k_codeobj_154)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_cur_scope->__pyx_v_extract = __pyx_t_1;
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2205
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2199
  * 
  *         # Try to extract phrases from every f index
  *         for f_i from 0 <= f_i < f_len:             # <<<<<<<<<<<<<<
  *             extract(f_i, f_i, f_len, -1, 0, 0, [])
  * 
  */
-  __pyx_t_3 = __Pyx_PyInt_AsLong(__pyx_cur_scope->__pyx_v_f_len); if (unlikely((__pyx_t_3 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_PyInt_AsLong(__pyx_cur_scope->__pyx_v_f_len); if (unlikely((__pyx_t_3 == (long)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   for (__pyx_v_f_i = 0; __pyx_v_f_i < __pyx_t_3; __pyx_v_f_i++) {
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2206
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2200
  *         # Try to extract phrases from every f index
  *         for f_i from 0 <= f_i < f_len:
  *             extract(f_i, f_i, f_len, -1, 0, 0, [])             # <<<<<<<<<<<<<<
  * 
  *         return phrases
  */
-    __pyx_t_1 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __pyx_t_4 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyInt_FromLong(__pyx_v_f_i); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
-    __pyx_t_6 = PyTuple_New(7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_6 = PyTuple_New(7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __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);
@@ -65935,13 +65555,13 @@ static PyObject *__pyx_pf_3_sa_23HieroCachingRuleFactory_37get_f_phrases(struct
     __pyx_t_1 = 0;
     __pyx_t_4 = 0;
     __pyx_t_5 = 0;
-    __pyx_t_5 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_5 = PyObject_Call(__pyx_cur_scope->__pyx_v_extract, ((PyObject *)__pyx_t_6), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_5);
     __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0;
     __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2208
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2202
  *             extract(f_i, f_i, f_len, -1, 0, 0, [])
  * 
  *         return phrases             # <<<<<<<<<<<<<<
@@ -65976,11 +65596,12 @@ static PyObject *__pyx_pw_3_sa_17span_check(PyObject *__pyx_self, PyObject *__py
   PyObject *__pyx_v_vec = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("span_check (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -65995,21 +65616,24 @@ static PyObject *__pyx_pw_3_sa_17span_check(PyObject *__pyx_self, PyObject *__py
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec);
+        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("span_check", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_check", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("span_check", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_check", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_check") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_check") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -66024,7 +65648,7 @@ static PyObject *__pyx_pw_3_sa_17span_check(PyObject *__pyx_self, PyObject *__py
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("span_check", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("span_check", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.span_check", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -66035,7 +65659,7 @@ static PyObject *__pyx_pw_3_sa_17span_check(PyObject *__pyx_self, PyObject *__py
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2211
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2205
  * 
  * # Spans are _inclusive_ on both ends [i, j]
  * def span_check(vec, i, j):             # <<<<<<<<<<<<<<
@@ -66054,7 +65678,7 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("span_check", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2212
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2206
  * # Spans are _inclusive_ on both ends [i, j]
  * def span_check(vec, i, j):
  *     k = i             # <<<<<<<<<<<<<<
@@ -66064,7 +65688,7 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_k = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2213
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2207
  * def span_check(vec, i, j):
  *     k = i
  *     while k <= j:             # <<<<<<<<<<<<<<
@@ -66072,25 +65696,26 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
  *             return False
  */
   while (1) {
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __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 = 2213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2207; __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 = 2207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (!__pyx_t_2) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2214
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2208
  *     k = i
  *     while k <= j:
  *         if vec[k]:             # <<<<<<<<<<<<<<
  *             return False
  *         k += 1
  */
-    __pyx_t_1 = PyObject_GetItem(__pyx_v_vec, __pyx_v_k); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_GetItem(__pyx_v_vec, __pyx_v_k); if (!__pyx_t_1) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2208; __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 = 2214; __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 = 2208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (__pyx_t_2) {
 
-      /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2215
+      /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2209
  *     while k <= j:
  *         if vec[k]:
  *             return False             # <<<<<<<<<<<<<<
@@ -66098,7 +65723,7 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
  *     return True
  */
       __Pyx_XDECREF(__pyx_r);
-      __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2215; __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 = 2209; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_1);
       __pyx_r = __pyx_t_1;
       __pyx_t_1 = 0;
@@ -66107,21 +65732,21 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
     }
     __pyx_L5:;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2216
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2210
  *         if vec[k]:
  *             return False
  *         k += 1             # <<<<<<<<<<<<<<
  *     return True
  * 
  */
-    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_k);
     __pyx_v_k = __pyx_t_1;
     __pyx_t_1 = 0;
   }
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2217
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2211
  *             return False
  *         k += 1
  *     return True             # <<<<<<<<<<<<<<
@@ -66129,7 +65754,7 @@ static PyObject *__pyx_pf_3_sa_16span_check(CYTHON_UNUSED PyObject *__pyx_self,
  * def span_inc(vec, i, j):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2217; __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 = 2211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_r = __pyx_t_1;
   __pyx_t_1 = 0;
@@ -66155,11 +65780,12 @@ static PyObject *__pyx_pw_3_sa_19span_inc(PyObject *__pyx_self, PyObject *__pyx_
   PyObject *__pyx_v_vec = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("span_inc (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -66174,21 +65800,24 @@ static PyObject *__pyx_pw_3_sa_19span_inc(PyObject *__pyx_self, PyObject *__pyx_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec);
+        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("span_inc", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_inc", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("span_inc", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_inc", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_inc") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_inc") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -66203,7 +65832,7 @@ static PyObject *__pyx_pw_3_sa_19span_inc(PyObject *__pyx_self, PyObject *__pyx_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("span_inc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("span_inc", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.span_inc", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -66214,7 +65843,7 @@ static PyObject *__pyx_pw_3_sa_19span_inc(PyObject *__pyx_self, PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2213
  *     return True
  * 
  * def span_inc(vec, i, j):             # <<<<<<<<<<<<<<
@@ -66235,7 +65864,7 @@ static PyObject *__pyx_pf_3_sa_18span_inc(CYTHON_UNUSED PyObject *__pyx_self, Py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("span_inc", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2220
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2214
  * 
  * def span_inc(vec, i, j):
  *     k = i             # <<<<<<<<<<<<<<
@@ -66245,7 +65874,7 @@ static PyObject *__pyx_pf_3_sa_18span_inc(CYTHON_UNUSED PyObject *__pyx_self, Py
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_k = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2221
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2215
  * def span_inc(vec, i, j):
  *     k = i
  *     while k <= j:             # <<<<<<<<<<<<<<
@@ -66253,12 +65882,13 @@ static PyObject *__pyx_pf_3_sa_18span_inc(CYTHON_UNUSED PyObject *__pyx_self, Py
  *         k += 1
  */
   while (1) {
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2221; __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 = 2221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2215; __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 = 2215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (!__pyx_t_2) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2222
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2216
  *     k = i
  *     while k <= j:
  *         vec[k] += 1             # <<<<<<<<<<<<<<
@@ -66267,23 +65897,23 @@ static PyObject *__pyx_pf_3_sa_18span_inc(CYTHON_UNUSED PyObject *__pyx_self, Py
  */
     __Pyx_INCREF(__pyx_v_k);
     __pyx_t_1 = __pyx_v_k;
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_vec, __pyx_t_1); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_vec, __pyx_t_1); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_3, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_t_3, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    if (PyObject_SetItem(__pyx_v_vec, __pyx_t_1, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_vec, __pyx_t_1, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2223
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2217
  *     while k <= j:
  *         vec[k] += 1
  *         k += 1             # <<<<<<<<<<<<<<
  * 
  * def span_dec(vec, i, j):
  */
-    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_k);
     __pyx_v_k = __pyx_t_1;
@@ -66312,11 +65942,12 @@ static PyObject *__pyx_pw_3_sa_21span_dec(PyObject *__pyx_self, PyObject *__pyx_
   PyObject *__pyx_v_vec = 0;
   PyObject *__pyx_v_i = 0;
   PyObject *__pyx_v_j = 0;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("span_dec (wrapper)", 0);
+  __pyx_self = __pyx_self;
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vec,&__pyx_n_s__i,&__pyx_n_s__j,0};
     PyObject* values[3] = {0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -66331,21 +65962,24 @@ static PyObject *__pyx_pw_3_sa_21span_dec(PyObject *__pyx_self, PyObject *__pyx_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec)) != 0)) kw_args--;
+        values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__vec);
+        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("span_dec", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_dec", 1, 3, 3, 1); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j)) != 0)) kw_args--;
+        values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__j);
+        if (likely(values[2])) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("span_dec", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("span_dec", 1, 3, 3, 2); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_dec") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "span_dec") < 0)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
       goto __pyx_L5_argtuple_error;
@@ -66360,7 +65994,7 @@ static PyObject *__pyx_pw_3_sa_21span_dec(PyObject *__pyx_self, PyObject *__pyx_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("span_dec", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("span_dec", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_sa.span_dec", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
@@ -66371,7 +66005,7 @@ static PyObject *__pyx_pw_3_sa_21span_dec(PyObject *__pyx_self, PyObject *__pyx_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2225
+/* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
  *         k += 1
  * 
  * def span_dec(vec, i, j):             # <<<<<<<<<<<<<<
@@ -66392,7 +66026,7 @@ static PyObject *__pyx_pf_3_sa_20span_dec(CYTHON_UNUSED PyObject *__pyx_self, Py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("span_dec", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2226
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2220
  * 
  * def span_dec(vec, i, j):
  *     k = i             # <<<<<<<<<<<<<<
@@ -66402,7 +66036,7 @@ static PyObject *__pyx_pf_3_sa_20span_dec(CYTHON_UNUSED PyObject *__pyx_self, Py
   __Pyx_INCREF(__pyx_v_i);
   __pyx_v_k = __pyx_v_i;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2227
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2221
  * def span_dec(vec, i, j):
  *     k = i
  *     while k <= j:             # <<<<<<<<<<<<<<
@@ -66410,12 +66044,13 @@ static PyObject *__pyx_pf_3_sa_20span_dec(CYTHON_UNUSED PyObject *__pyx_self, Py
  *         k += 1
  */
   while (1) {
-    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2227; __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 = 2227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyObject_RichCompare(__pyx_v_k, __pyx_v_j, Py_LE); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2221; __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 = 2221; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     if (!__pyx_t_2) break;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2228
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2222
  *     k = i
  *     while k <= j:
  *         vec[k] -= 1             # <<<<<<<<<<<<<<
@@ -66423,21 +66058,21 @@ static PyObject *__pyx_pf_3_sa_20span_dec(CYTHON_UNUSED PyObject *__pyx_self, Py
  */
     __Pyx_INCREF(__pyx_v_k);
     __pyx_t_1 = __pyx_v_k;
-    __pyx_t_3 = PyObject_GetItem(__pyx_v_vec, __pyx_t_1); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = PyObject_GetItem(__pyx_v_vec, __pyx_t_1); if (!__pyx_t_3) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyNumber_InPlaceSubtract(__pyx_t_3, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_4 = PyNumber_InPlaceSubtract(__pyx_t_3, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    if (PyObject_SetItem(__pyx_v_vec, __pyx_t_1, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (PyObject_SetItem(__pyx_v_vec, __pyx_t_1, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2229
+    /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2223
  *     while k <= j:
  *         vec[k] -= 1
  *         k += 1             # <<<<<<<<<<<<<<
  */
-    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2229; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_k, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
     __Pyx_DECREF(__pyx_v_k);
     __pyx_v_k = __pyx_t_1;
@@ -66473,7 +66108,7 @@ static int __pyx_pw_3_sa_13FeatureVector_1__cinit__(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":7
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":7
  * 
  * cdef class FeatureVector:
  *     def __cinit__(self):             # <<<<<<<<<<<<<<
@@ -66492,7 +66127,7 @@ static int __pyx_pf_3_sa_13FeatureVector___cinit__(struct __pyx_obj_3_sa_Feature
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":8
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":8
  * cdef class FeatureVector:
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -66520,7 +66155,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":9
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":9
  *     def __cinit__(self):
  *         self.names = IntList(INITIAL_CAPACITY, INCREMENT)
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)             # <<<<<<<<<<<<<<
@@ -66566,11 +66201,11 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
 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;
+  static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__name,&__pyx_n_s__value,0};
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __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;
@@ -66584,10 +66219,12 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_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;}
         }
@@ -66617,7 +66254,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_3set(PyObject *__pyx_v_self, PyOb
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":11
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":11
  *         self.values = FloatList(INITIAL_CAPACITY, INCREMENT)
  * 
  *     def set(self, unsigned name, float value):             # <<<<<<<<<<<<<<
@@ -66635,7 +66272,7 @@ static PyObject *__pyx_pf_3_sa_13FeatureVector_2set(struct __pyx_obj_3_sa_Featur
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("set", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":12
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":12
  * 
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)             # <<<<<<<<<<<<<<
@@ -66649,7 +66286,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":13
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":13
  *     def set(self, unsigned name, float value):
  *         self.names.append(name)
  *         self.values.append(value)             # <<<<<<<<<<<<<<
@@ -66688,7 +66325,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_5__iter__(PyObject *__pyx_v_self)
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":15
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":15
  *         self.values.append(value)
  * 
  *     def __iter__(self):             # <<<<<<<<<<<<<<
@@ -66754,7 +66391,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;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":17
  *     def __iter__(self):
  *         cdef unsigned i
  *         for i in range(self.names.len):             # <<<<<<<<<<<<<<
@@ -66765,7 +66402,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;
 
-    /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":18
+    /* "/home/paulb/workspace/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])             # <<<<<<<<<<<<<<
@@ -66812,7 +66449,6 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_6generator5(__pyx_GeneratorObject
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
@@ -66829,7 +66465,7 @@ static PyObject *__pyx_pw_3_sa_13FeatureVector_8__str__(PyObject *__pyx_v_self)
 }
 static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator17(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":21
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -66904,18 +66540,10 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator17(__pyx_Gener
   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[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 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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[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)) {
@@ -66932,7 +66560,7 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator17(__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_156), __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_155), __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;
@@ -66963,12 +66591,11 @@ static PyObject *__pyx_gb_3_sa_13FeatureVector_7__str___2generator17(__pyx_Gener
   __pyx_L0:;
   __Pyx_XDECREF(__pyx_r);
   __pyx_generator->resume_label = -1;
-  __Pyx_Generator_clear((PyObject*)__pyx_generator);
   __Pyx_RefNannyFinishContext();
   return NULL;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":20
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":20
  *             yield (FD.word(self.names[i]), self.values[i])
  * 
  *     def __str__(self):             # <<<<<<<<<<<<<<
@@ -66997,7 +66624,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":21
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":21
  * 
  *     def __str__(self):
  *         return ' '.join('%s=%s' % feat for feat in self)             # <<<<<<<<<<<<<<
@@ -67053,7 +66680,7 @@ static int __pyx_pw_3_sa_6Scorer_1__init__(PyObject *__pyx_v_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":25
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":25
  * cdef class Scorer:
  *     cdef models
  *     def __init__(self, *models):             # <<<<<<<<<<<<<<
@@ -67076,7 +66703,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);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":26
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":26
  *     cdef models
  *     def __init__(self, *models):
  *         names = [FD.index(<char *>model.__name__) for model in models]             # <<<<<<<<<<<<<<
@@ -67088,11 +66715,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   __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;
@@ -67102,7 +66725,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;
@@ -67110,7 +66733,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;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":27
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -67149,7 +66772,7 @@ static int __pyx_pf_3_sa_6Scorer___init__(struct __pyx_obj_3_sa_Scorer *__pyx_v_
   return __pyx_r;
 }
 
-/* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":29
+/* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":29
  *         self.models = zip(names, models)
  * 
  *     cdef FeatureVector score(self, ctx):             # <<<<<<<<<<<<<<
@@ -67176,7 +66799,7 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("score", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":30
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":30
  * 
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()             # <<<<<<<<<<<<<<
@@ -67188,7 +66811,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/pauldb/workspace/cdec/python/src/sa/features.pxi":31
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":31
  *     cdef FeatureVector score(self, ctx):
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:             # <<<<<<<<<<<<<<
@@ -67206,18 +66829,10 @@ static struct __pyx_obj_3_sa_FeatureVector *__pyx_f_3_sa_6Scorer_score(struct __
   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[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 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_4); __pyx_t_2++;
     } 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[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)) {
@@ -67231,33 +66846,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);
@@ -67268,13 +66877,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:;
     }
@@ -67285,7 +66893,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/pauldb/workspace/cdec/python/src/sa/features.pxi":32
+    /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":32
  *         cdef FeatureVector scores = FeatureVector()
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))             # <<<<<<<<<<<<<<
@@ -67317,7 +66925,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/pauldb/workspace/cdec/python/src/sa/features.pxi":33
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":33
  *         for name, model in self.models:
  *             scores.set(name, model(ctx))
  *         return scores             # <<<<<<<<<<<<<<
@@ -67763,7 +67371,7 @@ 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;
@@ -67778,8 +67386,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);
 }
 
@@ -67999,7 +67607,7 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_6Phrase_words(PyObject *o, void *x) {
   return __pyx_pw_3_sa_6Phrase_5words_1__get__(o);
 }
 
@@ -68191,10 +67799,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);
 }
 
@@ -68234,11 +67842,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_4Rule_f(PyObject *o, 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) {
+static PyObject *__pyx_getprop_3_sa_4Rule_e(PyObject *o, void *x) {
   return __pyx_pw_3_sa_4Rule_1e_1__get__(o);
 }
 
@@ -68410,7 +68018,7 @@ 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;
@@ -68613,11 +68221,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);
 }
 
@@ -68670,11 +68278,11 @@ static PyObject *__pyx_sq_item_3_sa_DataArray(PyObject *o, Py_ssize_t i) {
   return r;
 }
 
-static PyObject *__pyx_getprop_3_sa_9DataArray_word2id(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_9DataArray_word2id(PyObject *o, 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) {
+static int __pyx_setprop_3_sa_9DataArray_word2id(PyObject *o, PyObject *v, void *x) {
   if (v) {
     return __pyx_pw_3_sa_9DataArray_7word2id_3__set__(o, v);
   }
@@ -68683,11 +68291,11 @@ static int __pyx_setprop_3_sa_9DataArray_word2id(PyObject *o, PyObject *v, CYTHO
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9DataArray_id2word(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_9DataArray_id2word(PyObject *o, 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) {
+static int __pyx_setprop_3_sa_9DataArray_id2word(PyObject *o, PyObject *v, void *x) {
   if (v) {
     return __pyx_pw_3_sa_9DataArray_7id2word_3__set__(o, v);
   }
@@ -68696,11 +68304,11 @@ static int __pyx_setprop_3_sa_9DataArray_id2word(PyObject *o, PyObject *v, CYTHO
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9DataArray_data(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_9DataArray_data(PyObject *o, 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) {
+static int __pyx_setprop_3_sa_9DataArray_data(PyObject *o, PyObject *v, void *x) {
   if (v) {
     return __pyx_pw_3_sa_9DataArray_4data_3__set__(o, v);
   }
@@ -68709,11 +68317,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_9DataArray_sent_id(PyObject *o, 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) {
+static int __pyx_setprop_3_sa_9DataArray_sent_id(PyObject *o, PyObject *v, void *x) {
   if (v) {
     return __pyx_pw_3_sa_9DataArray_7sent_id_3__set__(o, v);
   }
@@ -68722,11 +68330,11 @@ static int __pyx_setprop_3_sa_9DataArray_sent_id(PyObject *o, PyObject *v, CYTHO
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_9DataArray_sent_index(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_9DataArray_sent_index(PyObject *o, 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) {
+static int __pyx_setprop_3_sa_9DataArray_sent_index(PyObject *o, PyObject *v, void *x) {
   if (v) {
     return __pyx_pw_3_sa_9DataArray_10sent_index_3__set__(o, v);
   }
@@ -68931,8 +68539,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);
 }
 
@@ -69149,14 +68757,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);
 }
 
@@ -69386,7 +68994,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;
@@ -69555,7 +69163,7 @@ 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) {
@@ -69739,7 +69347,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;
@@ -70109,8 +69717,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);
 }
 
@@ -70298,7 +69906,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;
@@ -70324,9 +69932,9 @@ static void __pyx_tp_dealloc_3_sa_Alphabet(PyObject *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);
 }
 
@@ -70360,11 +69968,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_8Alphabet_terminals(PyObject *o, 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) {
+static PyObject *__pyx_getprop_3_sa_8Alphabet_nonterminals(PyObject *o, void *x) {
   return __pyx_pw_3_sa_8Alphabet_12nonterminals_1__get__(o);
 }
 
@@ -70736,8 +70344,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);
 }
 
@@ -70944,9 +70552,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);
 }
 
@@ -71152,7 +70760,7 @@ 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;
@@ -71166,7 +70774,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);
 }
 
@@ -71188,11 +70796,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_8TrieNode_children(PyObject *o, 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) {
+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);
   }
@@ -71380,9 +70988,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);
 }
 
@@ -71418,11 +71026,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, 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) {
+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);
   }
@@ -71431,11 +71039,11 @@ static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase(PyObject *o, PyObject *v
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, 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) {
+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);
   }
@@ -71444,11 +71052,11 @@ static int __pyx_setprop_3_sa_16ExtendedTrieNode_phrase_location(PyObject *o, Py
   }
 }
 
-static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, CYTHON_UNUSED void *x) {
+static PyObject *__pyx_getprop_3_sa_16ExtendedTrieNode_suffix_link(PyObject *o, 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) {
+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);
   }
@@ -71636,7 +71244,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);
 }
 
@@ -71658,11 +71266,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_9TrieTable_extended(PyObject *o, void *x) {
   return __pyx_pw_3_sa_9TrieTable_8extended_1__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);
   }
@@ -71672,11 +71280,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_9TrieTable_count(PyObject *o, 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) {
+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);
   }
@@ -71686,11 +71294,11 @@ 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) {
+static PyObject *__pyx_getprop_3_sa_9TrieTable_root(PyObject *o, 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) {
+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);
   }
@@ -71880,7 +71488,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);
 }
 
@@ -72074,7 +71682,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);
 }
 
@@ -72294,30 +71902,30 @@ 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_CLEAR(p->samples_f);
-  Py_CLEAR(p->phrases_f);
-  Py_CLEAR(p->phrases_e);
-  Py_CLEAR(p->phrases_fe);
-  Py_CLEAR(p->phrases_al);
-  Py_CLEAR(p->bilex_f);
-  Py_CLEAR(p->bilex_e);
-  Py_CLEAR(p->bilex_fe);
+  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_XDECREF(p->samples_f);
+  Py_XDECREF(p->phrases_f);
+  Py_XDECREF(p->phrases_e);
+  Py_XDECREF(p->phrases_fe);
+  Py_XDECREF(p->phrases_al);
+  Py_XDECREF(p->bilex_f);
+  Py_XDECREF(p->bilex_e);
+  Py_XDECREF(p->bilex_fe);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -72654,7 +72262,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;
@@ -72666,7 +72274,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);
 }
 
@@ -72846,7 +72454,7 @@ 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) {
+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 = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -72857,7 +72465,7 @@ 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_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -73037,7 +72645,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;
@@ -73048,7 +72656,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);
 }
 
@@ -73228,7 +72836,7 @@ 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);
   if (!o) return 0;
@@ -73241,9 +72849,9 @@ 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_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_line);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -73435,7 +73043,7 @@ 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);
   if (!o) return 0;
@@ -73451,12 +73059,12 @@ 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_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));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -73666,7 +73274,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_3_compute_stats = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4_make_lattice(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4_make_lattice(PyTypeObject *t, PyObject *a, 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;
@@ -73678,8 +73286,8 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_4_make_lattice(PyTypeObjec
 
 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_XDECREF(p->__pyx_v_word_ids);
+  Py_XDECREF(p->__pyx_v_words);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -73865,7 +73473,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_4_make_lattice = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_5_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -73878,9 +73486,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_5_genexpr(PyTypeObject *t,
 
 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_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_word);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -74072,7 +73680,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_5_genexpr = {
   #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);
   if (!o) return 0;
@@ -74085,9 +73693,9 @@ 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_word);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_word);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -74279,7 +73887,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_6_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_decode_lattice(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_decode_lattice(PyTypeObject *t, PyObject *a, 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;
@@ -74290,7 +73898,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_7_decode_lattice(PyTypeObj
 
 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_XDECREF(p->__pyx_v_lattice);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -74470,7 +74078,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_7_decode_lattice = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_8_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -74489,15 +74097,15 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_8_genexpr(PyTypeObject *t,
 
 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_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_arc);
+  Py_XDECREF(p->__pyx_v_dist);
+  Py_XDECREF(p->__pyx_v_node);
+  Py_XDECREF(p->__pyx_v_sym);
+  Py_XDECREF(p->__pyx_v_weight);
+  Py_XDECREF(p->__pyx_t_0);
+  Py_XDECREF(p->__pyx_t_3);
+  Py_XDECREF(p->__pyx_t_4);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -74725,7 +74333,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_8_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9_decode_sentence(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9_decode_sentence(PyTypeObject *t, PyObject *a, 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;
@@ -74736,7 +74344,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_9_decode_sentence(PyTypeOb
 
 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_XDECREF(p->__pyx_v_lattice);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -74916,7 +74524,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_9_decode_sentence = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_10_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -74930,10 +74538,10 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_10_genexpr(PyTypeObject *t
 
 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_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v__);
+  Py_XDECREF(p->__pyx_v_sym);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -75131,7 +74739,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_10_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_encode_words(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_encode_words(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_encode_words *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -75142,7 +74750,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_11_encode_words(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_11_encode_words(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_11_encode_words *p = (struct __pyx_obj_3_sa___pyx_scope_struct_11_encode_words *)o;
-  Py_CLEAR(p->__pyx_v_words);
+  Py_XDECREF(p->__pyx_v_words);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -75322,7 +74930,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_11_encode_words = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_12_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_12_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_12_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -75335,9 +74943,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_12_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_12_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_12_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_12_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_word);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_word);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -75529,7 +75137,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_12_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_13_decode_words(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_13_decode_words(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_13_decode_words *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -75540,7 +75148,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_13_decode_words(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_13_decode_words(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_13_decode_words *p = (struct __pyx_obj_3_sa___pyx_scope_struct_13_decode_words *)o;
-  Py_CLEAR(p->__pyx_v_syms);
+  Py_XDECREF(p->__pyx_v_syms);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -75720,7 +75328,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_13_decode_words = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_14_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_14_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_14_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -75733,9 +75341,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_14_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_14_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_14_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_14_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_sym);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_sym);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -75927,7 +75535,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_14_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_15___iter__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -75938,7 +75546,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_15___iter__(PyTypeObject *
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_15___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_15___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_15___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -76118,7 +75726,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_15___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_16___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_16___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_16___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -76129,7 +75737,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_16___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_16___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_16___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_16___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -76309,7 +75917,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_16___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_17_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_17_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_17_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -76322,9 +75930,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_17_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_17_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_17_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_17_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_a);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_a);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -76516,7 +76124,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_17_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_18_alignments(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_18_alignments(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_18_alignments *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -76529,9 +76137,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_18_alignments(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_18_alignments(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_18_alignments *p = (struct __pyx_obj_3_sa___pyx_scope_struct_18_alignments *)o;
-  Py_CLEAR(p->__pyx_v_point);
-  Py_CLEAR(p->__pyx_v_self);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(p->__pyx_v_point);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -76723,7 +76331,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_18_alignments = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_19_input(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_19_input(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_19_input *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -76782,71 +76390,71 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_19_input(PyTypeObject *t,
   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_4 = 0;
-  p->__pyx_t_5 = 0;
   return o;
 }
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_19_input(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_19_input *p = (struct __pyx_obj_3_sa___pyx_scope_struct_19_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_f_syms);
-  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_genexpr);
-  Py_CLEAR(p->__pyx_v_hiero_phrase);
-  Py_CLEAR(p->__pyx_v_input_match);
-  Py_CLEAR(p->__pyx_v_intersect_start_time);
-  Py_CLEAR(p->__pyx_v_intersect_stop_time);
-  Py_CLEAR(p->__pyx_v_is_shadow_path);
-  Py_CLEAR(p->__pyx_v_key);
-  Py_CLEAR(p->__pyx_v_lex_i);
-  Py_CLEAR(p->__pyx_v_lex_j);
-  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);
-  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_seen_phrases);
-  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_3);
-  Py_CLEAR(p->__pyx_t_4);
-  Py_CLEAR(p->__pyx_t_5);
+  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(((PyObject *)p->__pyx_v_f_syms));
+  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(p->__pyx_v_genexpr);
+  Py_XDECREF(((PyObject *)p->__pyx_v_hiero_phrase));
+  Py_XDECREF(p->__pyx_v_input_match);
+  Py_XDECREF(p->__pyx_v_intersect_start_time);
+  Py_XDECREF(p->__pyx_v_intersect_stop_time);
+  Py_XDECREF(p->__pyx_v_is_shadow_path);
+  Py_XDECREF(((PyObject *)p->__pyx_v_key));
+  Py_XDECREF(p->__pyx_v_lex_i);
+  Py_XDECREF(p->__pyx_v_lex_j);
+  Py_XDECREF(p->__pyx_v_loc);
+  Py_XDECREF(((PyObject *)p->__pyx_v_locs));
+  Py_XDECREF(p->__pyx_v_max_locs);
+  Py_XDECREF(p->__pyx_v_meta);
+  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_seen_phrases));
+  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);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -77015,15 +76623,15 @@ static int __pyx_tp_traverse_3_sa___pyx_scope_struct_19_input(PyObject *o, visit
   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_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;
 }
 
@@ -77192,15 +76800,15 @@ static int __pyx_tp_clear_3_sa___pyx_scope_struct_19_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);
   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;
 }
 
@@ -77362,7 +76970,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_19_input = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_20_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_20_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_20_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -77375,9 +76983,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_20_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_20_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_20_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_20_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_word);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_word);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -77569,7 +77177,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_20_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_21_add_instance(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_21_add_instance(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_21_add_instance *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -77590,17 +77198,17 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_21_add_instance(PyTypeObje
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_21_add_instance(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_21_add_instance *p = (struct __pyx_obj_3_sa___pyx_scope_struct_21_add_instance *)o;
-  Py_CLEAR(p->__pyx_v_al);
-  Py_CLEAR(p->__pyx_v_cover);
-  Py_CLEAR(p->__pyx_v_e_nt_cover);
-  Py_CLEAR(p->__pyx_v_e_words);
-  Py_CLEAR(p->__pyx_v_ef_span);
-  Py_CLEAR(p->__pyx_v_extract);
-  Py_CLEAR(p->__pyx_v_f_len);
-  Py_CLEAR(p->__pyx_v_f_words);
-  Py_CLEAR(p->__pyx_v_fe_span);
-  Py_CLEAR(p->__pyx_v_rules);
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(p->__pyx_v_al);
+  Py_XDECREF(p->__pyx_v_cover);
+  Py_XDECREF(p->__pyx_v_e_nt_cover);
+  Py_XDECREF(p->__pyx_v_e_words);
+  Py_XDECREF(p->__pyx_v_ef_span);
+  Py_XDECREF(p->__pyx_v_extract);
+  Py_XDECREF(p->__pyx_v_f_len);
+  Py_XDECREF(p->__pyx_v_f_words);
+  Py_XDECREF(p->__pyx_v_fe_span);
+  Py_XDECREF(p->__pyx_v_rules);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -77840,7 +77448,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_21_add_instance = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_22_form_rule(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_22_form_rule(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_22_form_rule *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -77852,8 +77460,8 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_22_form_rule(PyTypeObject
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_22_form_rule(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_22_form_rule *p = (struct __pyx_obj_3_sa___pyx_scope_struct_22_form_rule *)o;
-  Py_CLEAR(p->__pyx_v_links);
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(p->__pyx_v_links);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -78039,7 +77647,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_22_form_rule = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_23_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_23_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_23_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -78053,10 +77661,10 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_23_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_23_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_23_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_23_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_i);
-  Py_CLEAR(p->__pyx_v_j);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_i);
+  Py_XDECREF(p->__pyx_v_j);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -78254,7 +77862,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_23_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_24_fmt_rule(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_24_fmt_rule(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_24_fmt_rule *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -78266,8 +77874,8 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_24_fmt_rule(PyTypeObject *
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_24_fmt_rule(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_24_fmt_rule *p = (struct __pyx_obj_3_sa___pyx_scope_struct_24_fmt_rule *)o;
-  Py_CLEAR(p->__pyx_v_a);
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(p->__pyx_v_a);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -78453,7 +78061,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_24_fmt_rule = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_25_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_25_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_25_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -78466,9 +78074,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_25_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_25_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_25_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_25_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_packed);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_packed);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -78660,7 +78268,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_25_genexpr = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_26_get_f_phrases(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_26_get_f_phrases(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_26_get_f_phrases *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -78675,11 +78283,11 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_26_get_f_phrases(PyTypeObj
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_26_get_f_phrases(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_26_get_f_phrases *p = (struct __pyx_obj_3_sa___pyx_scope_struct_26_get_f_phrases *)o;
-  Py_CLEAR(p->__pyx_v_extract);
-  Py_CLEAR(p->__pyx_v_f_len);
-  Py_CLEAR(p->__pyx_v_f_words);
-  Py_CLEAR(p->__pyx_v_phrases);
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(p->__pyx_v_extract);
+  Py_XDECREF(p->__pyx_v_f_len);
+  Py_XDECREF(p->__pyx_v_f_words);
+  Py_XDECREF(p->__pyx_v_phrases);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -78883,7 +78491,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_26_get_f_phrases = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_27___iter__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_27___iter__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_27___iter__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -78894,7 +78502,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_27___iter__(PyTypeObject *
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_27___iter__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_27___iter__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_27___iter__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -79074,7 +78682,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_27___iter__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_28___str__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_28___str__(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_28___str__ *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -79085,7 +78693,7 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_28___str__(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_28___str__(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_28___str__ *p = (struct __pyx_obj_3_sa___pyx_scope_struct_28___str__ *)o;
-  Py_CLEAR(p->__pyx_v_self);
+  Py_XDECREF(((PyObject *)p->__pyx_v_self));
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -79265,7 +78873,7 @@ static PyTypeObject __pyx_type_3_sa___pyx_scope_struct_28___str__ = {
   #endif
 };
 
-static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_29_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
+static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_29_genexpr(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_3_sa___pyx_scope_struct_29_genexpr *p;
   PyObject *o = (*t->tp_alloc)(t, 0);
   if (!o) return 0;
@@ -79278,9 +78886,9 @@ static PyObject *__pyx_tp_new_3_sa___pyx_scope_struct_29_genexpr(PyTypeObject *t
 
 static void __pyx_tp_dealloc_3_sa___pyx_scope_struct_29_genexpr(PyObject *o) {
   struct __pyx_obj_3_sa___pyx_scope_struct_29_genexpr *p = (struct __pyx_obj_3_sa___pyx_scope_struct_29_genexpr *)o;
-  Py_CLEAR(p->__pyx_outer_scope);
-  Py_CLEAR(p->__pyx_v_feat);
-  Py_CLEAR(p->__pyx_t_0);
+  Py_XDECREF(((PyObject *)p->__pyx_outer_scope));
+  Py_XDECREF(p->__pyx_v_feat);
+  Py_XDECREF(p->__pyx_t_0);
   (*Py_TYPE(o)->tp_free)(o);
 }
 
@@ -79511,8 +79119,8 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__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_123, __pyx_k_123, sizeof(__pyx_k_123), 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},
@@ -79524,19 +79132,18 @@ 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_140, __pyx_k_140, sizeof(__pyx_k_140), 0, 0, 1, 0},
-  {&__pyx_kp_s_141, __pyx_k_141, sizeof(__pyx_k_141), 0, 0, 1, 0},
-  {&__pyx_kp_s_143, __pyx_k_143, sizeof(__pyx_k_143), 0, 0, 1, 0},
-  {&__pyx_kp_s_147, __pyx_k_147, sizeof(__pyx_k_147), 0, 0, 1, 0},
-  {&__pyx_n_s_153, __pyx_k_153, sizeof(__pyx_k_153), 0, 0, 1, 1},
-  {&__pyx_kp_s_156, __pyx_k_156, sizeof(__pyx_k_156), 0, 0, 1, 0},
-  {&__pyx_kp_s_158, __pyx_k_158, sizeof(__pyx_k_158), 0, 0, 1, 0},
-  {&__pyx_kp_s_161, __pyx_k_161, sizeof(__pyx_k_161), 0, 0, 1, 0},
-  {&__pyx_kp_s_165, __pyx_k_165, sizeof(__pyx_k_165), 0, 0, 1, 0},
+  {&__pyx_kp_s_142, __pyx_k_142, sizeof(__pyx_k_142), 0, 0, 1, 0},
+  {&__pyx_kp_s_146, __pyx_k_146, sizeof(__pyx_k_146), 0, 0, 1, 0},
+  {&__pyx_n_s_152, __pyx_k_152, sizeof(__pyx_k_152), 0, 0, 1, 1},
+  {&__pyx_kp_s_155, __pyx_k_155, sizeof(__pyx_k_155), 0, 0, 1, 0},
+  {&__pyx_kp_s_157, __pyx_k_157, sizeof(__pyx_k_157), 0, 0, 1, 0},
+  {&__pyx_kp_s_160, __pyx_k_160, sizeof(__pyx_k_160), 0, 0, 1, 0},
+  {&__pyx_kp_s_164, __pyx_k_164, sizeof(__pyx_k_164), 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},
@@ -79813,12 +79420,10 @@ static __Pyx_StringTabEntry __pyx_string_tab[] = {
   {&__pyx_n_s__split, __pyx_k__split, sizeof(__pyx_k__split), 0, 0, 1, 1},
   {&__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__stderr, __pyx_k__stderr, sizeof(__pyx_k__stderr), 0, 0, 1, 1},
   {&__pyx_n_s__stop, __pyx_k__stop, sizeof(__pyx_k__stop), 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, __pyx_k__sym, sizeof(__pyx_k__sym), 0, 0, 1, 1},
   {&__pyx_n_s__syms, __pyx_k__syms, sizeof(__pyx_k__syms), 0, 0, 1, 1},
-  {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 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},
@@ -79855,8 +79460,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 = 966; __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 = 1151; __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 = 971; __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 = 1148; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -79866,7 +79471,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":20
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -79883,7 +79488,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":21
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -79900,7 +79505,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":22
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -79917,7 +79522,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":66
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":66
  *                     f.write("%s " % self.get_word(w_id))
  *                 if w_id == 1:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -79931,7 +79536,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":61
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":61
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -79951,7 +79556,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":69
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":69
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -79971,7 +79576,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":74
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -79985,7 +79590,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_18));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":73
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":73
  * 
  *     def read_bitext(self, char* filename, int side):
  *         with gzip_or_text(filename) as fp:             # <<<<<<<<<<<<<<
@@ -80005,7 +79610,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_20));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":144
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":144
  *         for i in self.data:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -80019,7 +79624,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_22));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":147
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":147
  *         for i in self.sent_index:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -80033,7 +79638,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":150
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":150
  *         for i in self.sent_id:
  *             f.write("%d " %i)
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -80047,7 +79652,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":153
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":153
  *         for word in self.id2word:
  *             f.write("%s %d " % (word, self.word2id[word]))
  *         f.write("\n")             # <<<<<<<<<<<<<<
@@ -80061,7 +79666,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_26));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/data_array.pxi":156
+  /* "/home/paulb/workspace/cdec/python/src/sa/data_array.pxi":156
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80080,7 +79685,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_28));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":46
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":46
  * 
  *     def __cinit__(self, from_binary=None, from_text=None):
  *         self.links = IntList(1000,1000)             # <<<<<<<<<<<<<<
@@ -80097,7 +79702,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_29));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":47
+  /* "/home/paulb/workspace/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)             # <<<<<<<<<<<<<<
@@ -80114,7 +79719,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_1000);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":59
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":59
  *                 pairs = line.split()
  *                 for pair in pairs:
  *                     (i, j) = map(int, pair.split('-'))             # <<<<<<<<<<<<<<
@@ -80128,7 +79733,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_31));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":54
  * 
  *     def read_text(self, char* filename):
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -80148,7 +79753,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_33));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":75
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":75
  *             for i, link in enumerate(self.links):
  *                 while i >= self.sent_index[sent_num]:
  *                     f.write("\n")             # <<<<<<<<<<<<<<
@@ -80162,7 +79767,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_34));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":78
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":78
  *                     sent_num = sent_num + 1
  *                 f.write("%d-%d " % self.unlink(link))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80176,7 +79781,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_36));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":71
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":71
  * 
  *     def write_text(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80196,7 +79801,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_37));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":92
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":92
  *             for link in self.links:
  *                 f.write("%d " % link)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80210,7 +79815,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_38));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":95
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":95
  *             for i in self.sent_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80224,7 +79829,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_39));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/alignment.pxi":88
+  /* "/home/paulb/workspace/cdec/python/src/sa/alignment.pxi":88
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80244,7 +79849,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_40));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":297
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":297
  * 
  *             # Re-read file, placing words into buckets
  *             f.seek(0)             # <<<<<<<<<<<<<<
@@ -80258,7 +79863,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_0);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_43));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":273
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":273
  * 
  *         fcount = IntList()
  *         with gzip_or_text(filename) as f:             # <<<<<<<<<<<<<<
@@ -80278,7 +79883,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_44));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":339
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":339
  * 
  *         if i > j:
  *             raise Exception("Sort error in CLex")             # <<<<<<<<<<<<<<
@@ -80292,7 +79897,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_46));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_47));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":362
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":362
  *             for i in self.f_index:
  *                 f.write("%d " % i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80306,7 +79911,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_49));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":365
+  /* "/home/paulb/workspace/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")             # <<<<<<<<<<<<<<
@@ -80320,7 +79925,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_51));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":368
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":368
  *             for i, w in enumerate(self.id2fword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80334,7 +79939,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_53));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":371
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":371
  *             for i, w in enumerate(self.id2eword):
  *                 f.write("%d %s " % (i, w))
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80348,7 +79953,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_54));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":359
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":359
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80368,7 +79973,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_55));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/bilex.pxi":404
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":404
  *         cdef i, N, e_id, f_id
  * 
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80388,7 +79993,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_57));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":13
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":13
  *         cdef IntList rank
  * 
  *         logger.info("Constructing LCP array")             # <<<<<<<<<<<<<<
@@ -80402,7 +80007,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_60));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_61));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/lcp.pxi":34
+  /* "/home/paulb/workspace/cdec/python/src/sa/lcp.pxi":34
  *             if h > 0:
  *                 h = h-1
  *         logger.info("LCP array completed")             # <<<<<<<<<<<<<<
@@ -80416,7 +80021,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_62));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_63));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":297
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":297
  *         pattern_rank = {}
  * 
  *         logger.info("Precomputing frequent intersections")             # <<<<<<<<<<<<<<
@@ -80430,7 +80035,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_72));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_73));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":314
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":314
  *         queue = IntList(increment=1000)
  * 
  *         logger.info("    Computing inverted indexes...")             # <<<<<<<<<<<<<<
@@ -80444,7 +80049,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_74));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_75));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":329
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":329
  *                     trie_node_data_append(node, i)
  * 
  *         logger.info("    Computing collocations...")             # <<<<<<<<<<<<<<
@@ -80458,7 +80063,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_76));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_77));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":393
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
@@ -80472,7 +80077,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_79));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":400
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":400
  *                 x = x+1
  *                 if len(pattern1) + len(pattern2) + 1 <= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -80486,7 +80091,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_80));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":407
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":407
  *                 x = x+2
  *                 if len(pattern1) + len(pattern2) + 1<= self.max_length:
  *                     combined_pattern = pattern1 + (-1,) + pattern2             # <<<<<<<<<<<<<<
@@ -80500,7 +80105,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_81));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/precomputation.pxi":409
+  /* "/home/paulb/workspace/cdec/python/src/sa/precomputation.pxi":409
  *                     combined_pattern = pattern1 + (-1,) + pattern2
  *                     IJ_set.add(combined_pattern)
  *                     combined_pattern = pattern2 + (-1,) + pattern1             # <<<<<<<<<<<<<<
@@ -80514,7 +80119,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(__pyx_int_neg_1);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_82));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":94
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":94
  * 
  *         '''Step 3: read off suffix array from inverse suffix array'''
  *         logger.info("    Finalizing sort...")             # <<<<<<<<<<<<<<
@@ -80528,7 +80133,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_92));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_93));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":193
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":193
  *             for a_i in self.sa:
  *                 f.write("%d " % a_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80542,7 +80147,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_96));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":196
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":196
  *             for w_i in self.ha:
  *                 f.write("%d " % w_i)
  *             f.write("\n")             # <<<<<<<<<<<<<<
@@ -80556,7 +80161,7 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_14));
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_97));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/suffix_array.pxi":189
+  /* "/home/paulb/workspace/cdec/python/src/sa/suffix_array.pxi":189
  * 
  *     def write_enhanced(self, char* filename):
  *         with open(filename, "w") as f:             # <<<<<<<<<<<<<<
@@ -80576,284 +80181,284 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_GIVEREF(Py_None);
   __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_98));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":120
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":119
  *             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 = 120; __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 = 119; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":334
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":339
  *         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 = 334; __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 = 339; __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1062
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1064
  *                         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 = 1062; __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 = 1064; __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));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":1924
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":1918
  *         # f_ i and j are current, e_ i and j are previous
  *         # We care _considering_ f_j, so it is not yet in counts
  *         def extract(f_i, f_j, e_i, e_j, min_bound, wc, links, nt, nt_open):             # <<<<<<<<<<<<<<
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  */
-  __pyx_k_tuple_136 = PyTuple_New(19); if (unlikely(!__pyx_k_tuple_136)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_136);
+  __pyx_k_tuple_135 = PyTuple_New(19); if (unlikely(!__pyx_k_tuple_135)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_135);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 0, ((PyObject *)__pyx_n_s__f_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 0, ((PyObject *)__pyx_n_s__f_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 1, ((PyObject *)__pyx_n_s__f_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 1, ((PyObject *)__pyx_n_s__f_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__e_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 2, ((PyObject *)__pyx_n_s__e_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 2, ((PyObject *)__pyx_n_s__e_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__e_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 3, ((PyObject *)__pyx_n_s__e_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 3, ((PyObject *)__pyx_n_s__e_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__min_bound));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 4, ((PyObject *)__pyx_n_s__min_bound));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 4, ((PyObject *)__pyx_n_s__min_bound));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__min_bound));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__wc));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 5, ((PyObject *)__pyx_n_s__wc));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 5, ((PyObject *)__pyx_n_s__wc));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wc));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__links));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 6, ((PyObject *)__pyx_n_s__links));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 6, ((PyObject *)__pyx_n_s__links));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__links));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__nt));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 7, ((PyObject *)__pyx_n_s__nt));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 7, ((PyObject *)__pyx_n_s__nt));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__nt));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__nt_open));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 8, ((PyObject *)__pyx_n_s__nt_open));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 8, ((PyObject *)__pyx_n_s__nt_open));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__nt_open));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__link_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 9, ((PyObject *)__pyx_n_s__link_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 9, ((PyObject *)__pyx_n_s__link_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__link_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__link_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 10, ((PyObject *)__pyx_n_s__link_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 10, ((PyObject *)__pyx_n_s__link_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__link_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__new_e_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 11, ((PyObject *)__pyx_n_s__new_e_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 11, ((PyObject *)__pyx_n_s__new_e_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__new_e_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__new_e_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 12, ((PyObject *)__pyx_n_s__new_e_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 12, ((PyObject *)__pyx_n_s__new_e_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__new_e_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__new_min_bound));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 13, ((PyObject *)__pyx_n_s__new_min_bound));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 13, ((PyObject *)__pyx_n_s__new_min_bound));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__new_min_bound));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 14, ((PyObject *)__pyx_n_s__i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 14, ((PyObject *)__pyx_n_s__i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__nt_collision));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 15, ((PyObject *)__pyx_n_s__nt_collision));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 15, ((PyObject *)__pyx_n_s__nt_collision));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__nt_collision));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__link));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 16, ((PyObject *)__pyx_n_s__link));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 16, ((PyObject *)__pyx_n_s__link));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__link));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__plus_links));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 17, ((PyObject *)__pyx_n_s__plus_links));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 17, ((PyObject *)__pyx_n_s__plus_links));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__plus_links));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__old_last_nt));
-  PyTuple_SET_ITEM(__pyx_k_tuple_136, 18, ((PyObject *)__pyx_n_s__old_last_nt));
+  PyTuple_SET_ITEM(__pyx_k_tuple_135, 18, ((PyObject *)__pyx_n_s__old_last_nt));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__old_last_nt));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_136));
-  __pyx_k_codeobj_137 = (PyObject*)__Pyx_PyCode_New(9, 0, 19, 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__extract, 1924, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_137)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1924; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_135));
+  __pyx_k_codeobj_136 = (PyObject*)__Pyx_PyCode_New(9, 0, 19, 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__extract, 1918, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_136)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1918; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2131
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2125
  *     # Debugging
  *     def dump_online_stats(self):
  *         logger.info('------------------------------')             # <<<<<<<<<<<<<<
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')
  */
-  __pyx_k_tuple_142 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_142)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_142);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_141));
-  PyTuple_SET_ITEM(__pyx_k_tuple_142, 0, ((PyObject *)__pyx_kp_s_141));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_141));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_142));
+  __pyx_k_tuple_141 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_141)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_141);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_140));
+  PyTuple_SET_ITEM(__pyx_k_tuple_141, 0, ((PyObject *)__pyx_kp_s_140));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_140));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_141));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2132
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2126
  *     def dump_online_stats(self):
  *         logger.info('------------------------------')
  *         logger.info('         Online Stats         ')             # <<<<<<<<<<<<<<
  *         logger.info('------------------------------')
  *         logger.info('f')
  */
-  __pyx_k_tuple_144 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_144)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_144);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_143));
-  PyTuple_SET_ITEM(__pyx_k_tuple_144, 0, ((PyObject *)__pyx_kp_s_143));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_143));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_144));
+  __pyx_k_tuple_143 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_143)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_143);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_142));
+  PyTuple_SET_ITEM(__pyx_k_tuple_143, 0, ((PyObject *)__pyx_kp_s_142));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_142));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_143));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2133
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2127
  *         logger.info('------------------------------')
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')             # <<<<<<<<<<<<<<
  *         logger.info('f')
  *         for w in self.bilex_f:
  */
-  __pyx_k_tuple_145 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_145)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_145);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_141));
-  PyTuple_SET_ITEM(__pyx_k_tuple_145, 0, ((PyObject *)__pyx_kp_s_141));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_141));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_145));
+  __pyx_k_tuple_144 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_144)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_144);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_140));
+  PyTuple_SET_ITEM(__pyx_k_tuple_144, 0, ((PyObject *)__pyx_kp_s_140));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_140));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_144));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2134
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2128
  *         logger.info('         Online Stats         ')
  *         logger.info('------------------------------')
  *         logger.info('f')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_f:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))
  */
-  __pyx_k_tuple_146 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_146)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_146);
+  __pyx_k_tuple_145 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_145)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_145);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f));
-  PyTuple_SET_ITEM(__pyx_k_tuple_146, 0, ((PyObject *)__pyx_n_s__f));
+  PyTuple_SET_ITEM(__pyx_k_tuple_145, 0, ((PyObject *)__pyx_n_s__f));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_146));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_145));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2137
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2131
  *         for w in self.bilex_f:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_f[w]))
  *         logger.info('e')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_e:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))
  */
-  __pyx_k_tuple_148 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_148)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_148);
+  __pyx_k_tuple_147 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_147)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_147);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__e));
-  PyTuple_SET_ITEM(__pyx_k_tuple_148, 0, ((PyObject *)__pyx_n_s__e));
+  PyTuple_SET_ITEM(__pyx_k_tuple_147, 0, ((PyObject *)__pyx_n_s__e));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__e));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_148));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_147));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2140
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2134
  *         for w in self.bilex_e:
  *             logger.info(sym_tostring(w) + ' : ' + str(self.bilex_e[w]))
  *         logger.info('fe')             # <<<<<<<<<<<<<<
  *         for w in self.bilex_fe:
  *             for w2 in self.bilex_fe[w]:
  */
-  __pyx_k_tuple_149 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_149)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_149);
+  __pyx_k_tuple_148 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_148)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_148);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fe));
-  PyTuple_SET_ITEM(__pyx_k_tuple_149, 0, ((PyObject *)__pyx_n_s__fe));
+  PyTuple_SET_ITEM(__pyx_k_tuple_148, 0, ((PyObject *)__pyx_n_s__fe));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fe));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_149));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_148));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2144
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2138
  *             for w2 in self.bilex_fe[w]:
  *                 logger.info(sym_tostring(w) + ' : ' + sym_tostring(w2) + ' : ' + str(self.bilex_fe[w][w2]))
  *         logger.info('F')             # <<<<<<<<<<<<<<
  *         for ph in self.phrases_f:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))
  */
-  __pyx_k_tuple_150 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_150)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_150);
+  __pyx_k_tuple_149 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_149)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_149);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__F));
-  PyTuple_SET_ITEM(__pyx_k_tuple_150, 0, ((PyObject *)__pyx_n_s__F));
+  PyTuple_SET_ITEM(__pyx_k_tuple_149, 0, ((PyObject *)__pyx_n_s__F));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__F));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_150));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_149));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2147
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2141
  *         for ph in self.phrases_f:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_f[ph]))
  *         logger.info('E')             # <<<<<<<<<<<<<<
  *         for ph in self.phrases_e:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))
  */
-  __pyx_k_tuple_151 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_151)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_151);
+  __pyx_k_tuple_150 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_150)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_150);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__E));
-  PyTuple_SET_ITEM(__pyx_k_tuple_151, 0, ((PyObject *)__pyx_n_s__E));
+  PyTuple_SET_ITEM(__pyx_k_tuple_150, 0, ((PyObject *)__pyx_n_s__E));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__E));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_151));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_150));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2150
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2144
  *         for ph in self.phrases_e:
  *             logger.info(str(ph) + ' ||| ' + str(self.phrases_e[ph]))
  *         logger.info('FE')             # <<<<<<<<<<<<<<
  *         self.dump_online_rules()
  * 
  */
-  __pyx_k_tuple_152 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_152)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_152);
+  __pyx_k_tuple_151 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_151)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_151);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__FE));
-  PyTuple_SET_ITEM(__pyx_k_tuple_152, 0, ((PyObject *)__pyx_n_s__FE));
+  PyTuple_SET_ITEM(__pyx_k_tuple_151, 0, ((PyObject *)__pyx_n_s__FE));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__FE));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_152));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_151));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2177
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2171
  *         phrases = set() # (fphrase, lex_i, lex_j)
  * 
  *         def extract(f_i, f_j, lex_i, lex_j, wc, ntc, syms):             # <<<<<<<<<<<<<<
  *             # Phrase extraction limits
  *             if f_j > (f_len - 1) or (f_j - f_i) + 1 > self.max_initial_size:
  */
-  __pyx_k_tuple_154 = PyTuple_New(10); if (unlikely(!__pyx_k_tuple_154)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_154);
+  __pyx_k_tuple_153 = PyTuple_New(10); if (unlikely(!__pyx_k_tuple_153)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_153);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 0, ((PyObject *)__pyx_n_s__f_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 0, ((PyObject *)__pyx_n_s__f_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 1, ((PyObject *)__pyx_n_s__f_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 1, ((PyObject *)__pyx_n_s__f_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lex_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 2, ((PyObject *)__pyx_n_s__lex_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 2, ((PyObject *)__pyx_n_s__lex_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lex_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lex_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 3, ((PyObject *)__pyx_n_s__lex_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 3, ((PyObject *)__pyx_n_s__lex_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__lex_j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__wc));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 4, ((PyObject *)__pyx_n_s__wc));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 4, ((PyObject *)__pyx_n_s__wc));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__wc));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__ntc));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 5, ((PyObject *)__pyx_n_s__ntc));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 5, ((PyObject *)__pyx_n_s__ntc));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__ntc));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__syms));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 6, ((PyObject *)__pyx_n_s__syms));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 6, ((PyObject *)__pyx_n_s__syms));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__syms));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__f));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 7, ((PyObject *)__pyx_n_s__f));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 7, ((PyObject *)__pyx_n_s__f));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__f));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__new_lex_i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 8, ((PyObject *)__pyx_n_s__new_lex_i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 8, ((PyObject *)__pyx_n_s__new_lex_i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__new_lex_i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__new_lex_j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_154, 9, ((PyObject *)__pyx_n_s__new_lex_j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_153, 9, ((PyObject *)__pyx_n_s__new_lex_j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__new_lex_j));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_154));
-  __pyx_k_codeobj_155 = (PyObject*)__Pyx_PyCode_New(7, 0, 10, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_154, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__extract, 2177, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_155)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2177; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_153));
+  __pyx_k_codeobj_154 = (PyObject*)__Pyx_PyCode_New(7, 0, 10, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_153, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__extract, 2171, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_154)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_sa.pyx":5
  * import gzip
@@ -80862,7 +80467,7 @@ static int __Pyx_InitCachedConstants(void) {
  *     return (resource.getrusage(resource.RUSAGE_SELF).ru_utime+
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
  */
-  __pyx_k_codeobj_157 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_158, __pyx_n_s__monitor_cpu, 5, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_157)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_k_codeobj_156 = (PyObject*)__Pyx_PyCode_New(0, 0, 0, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_157, __pyx_n_s__monitor_cpu, 5, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_156)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_sa.pyx":9
  *             resource.getrusage(resource.RUSAGE_SELF).ru_stime)
@@ -80871,16 +80476,16 @@ static int __Pyx_InitCachedConstants(void) {
  *     if filename.endswith('.gz'):
  *         return gzip.GzipFile(filename)
  */
-  __pyx_k_tuple_159 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_159)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_159);
+  __pyx_k_tuple_158 = PyTuple_New(2); if (unlikely(!__pyx_k_tuple_158)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_158);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__filename));
-  PyTuple_SET_ITEM(__pyx_k_tuple_159, 0, ((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_158, 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_159, 1, ((PyObject *)__pyx_n_s__filename));
+  PyTuple_SET_ITEM(__pyx_k_tuple_158, 1, ((PyObject *)__pyx_n_s__filename));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__filename));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_159));
-  __pyx_k_codeobj_160 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_159, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_158, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_160)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_158));
+  __pyx_k_codeobj_159 = (PyObject*)__Pyx_PyCode_New(1, 0, 2, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_158, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_157, __pyx_n_s__gzip_or_text, 9, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_159)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_sa.pyx":15
  *         return open(filename)
@@ -80889,209 +80494,209 @@ static int __Pyx_InitCachedConstants(void) {
  * 
  * include "float_list.pxi"
  */
-  __pyx_k_tuple_162 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_162)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_162);
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_161));
-  PyTuple_SET_ITEM(__pyx_k_tuple_162, 0, ((PyObject *)__pyx_kp_s_161));
-  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_161));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_162));
+  __pyx_k_tuple_161 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_161)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_161);
+  __Pyx_INCREF(((PyObject *)__pyx_kp_s_160));
+  PyTuple_SET_ITEM(__pyx_k_tuple_161, 0, ((PyObject *)__pyx_kp_s_160));
+  __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_160));
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_161));
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":107
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def isvar(sym):             # <<<<<<<<<<<<<<
  *     return sym_isvar(sym)
  * 
  */
-  __pyx_k_tuple_163 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_163)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_163);
+  __pyx_k_tuple_162 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_162)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_162);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__sym));
-  PyTuple_SET_ITEM(__pyx_k_tuple_163, 0, ((PyObject *)__pyx_n_s__sym));
+  PyTuple_SET_ITEM(__pyx_k_tuple_162, 0, ((PyObject *)__pyx_n_s__sym));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sym));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_163));
-  __pyx_k_codeobj_164 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_163, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__isvar, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_164)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_162));
+  __pyx_k_codeobj_163 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_162, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__isvar, 107, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_163)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":110
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":110
  *     return sym_isvar(sym)
  * 
  * 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_166 = PyTuple_New(5); if (unlikely(!__pyx_k_tuple_166)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_166);
+  __pyx_k_tuple_165 = PyTuple_New(5); if (unlikely(!__pyx_k_tuple_165)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_165);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__words));
-  PyTuple_SET_ITEM(__pyx_k_tuple_166, 0, ((PyObject *)__pyx_n_s__words));
+  PyTuple_SET_ITEM(__pyx_k_tuple_165, 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_166, 1, ((PyObject *)__pyx_n_s__word_ids));
+  PyTuple_SET_ITEM(__pyx_k_tuple_165, 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_166, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_165, 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_166, 3, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_165, 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_166, 4, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_165, 4, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_166));
-  __pyx_k_codeobj_167 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_166, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__make_lattice, 110, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_167)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_165));
+  __pyx_k_codeobj_166 = (PyObject*)__Pyx_PyCode_New(1, 0, 5, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_165, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__make_lattice, 110, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_166)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":114
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":114
  *     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_168 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_168)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_168);
+  __pyx_k_tuple_167 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_167)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_167);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
-  PyTuple_SET_ITEM(__pyx_k_tuple_168, 0, ((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_167, 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_168, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_167, 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_168, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_167, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_168));
-  __pyx_k_codeobj_169 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_168, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__decode_lattice, 114, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_169)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_167));
+  __pyx_k_codeobj_168 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_167, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__decode_lattice, 114, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_168)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":118
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":118
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  * 
  */
-  __pyx_k_tuple_170 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_170)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_170);
+  __pyx_k_tuple_169 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_169)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_169);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__lattice));
-  PyTuple_SET_ITEM(__pyx_k_tuple_170, 0, ((PyObject *)__pyx_n_s__lattice));
+  PyTuple_SET_ITEM(__pyx_k_tuple_169, 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_170, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_169, 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_170, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_169, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_170));
-  __pyx_k_codeobj_171 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_170, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__decode_sentence, 118, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_171)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_169));
+  __pyx_k_codeobj_170 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_169, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__decode_sentence, 118, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_170)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":121
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":121
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  * 
  * def encode_words(words):             # <<<<<<<<<<<<<<
  *     return tuple(sym_fromstring(word, True) for word in words)
  * 
  */
-  __pyx_k_tuple_172 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_172)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_172);
+  __pyx_k_tuple_171 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_171)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_171);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__words));
-  PyTuple_SET_ITEM(__pyx_k_tuple_172, 0, ((PyObject *)__pyx_n_s__words));
+  PyTuple_SET_ITEM(__pyx_k_tuple_171, 0, ((PyObject *)__pyx_n_s__words));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__words));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_172, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_171, 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_172, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_171, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_172));
-  __pyx_k_codeobj_173 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_172, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__encode_words, 121, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_173)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_171));
+  __pyx_k_codeobj_172 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_171, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__encode_words, 121, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_172)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":124
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":124
  *     return tuple(sym_fromstring(word, True) for word in words)
  * 
  * def decode_words(syms):             # <<<<<<<<<<<<<<
  *     return tuple(sym_tostring(sym) for sym in syms)
  */
-  __pyx_k_tuple_174 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_174)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_174);
+  __pyx_k_tuple_173 = PyTuple_New(3); if (unlikely(!__pyx_k_tuple_173)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_173);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__syms));
-  PyTuple_SET_ITEM(__pyx_k_tuple_174, 0, ((PyObject *)__pyx_n_s__syms));
+  PyTuple_SET_ITEM(__pyx_k_tuple_173, 0, ((PyObject *)__pyx_n_s__syms));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__syms));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__genexpr));
-  PyTuple_SET_ITEM(__pyx_k_tuple_174, 1, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_173, 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_174, 2, ((PyObject *)__pyx_n_s__genexpr));
+  PyTuple_SET_ITEM(__pyx_k_tuple_173, 2, ((PyObject *)__pyx_n_s__genexpr));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__genexpr));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_174));
-  __pyx_k_codeobj_175 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_174, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_165, __pyx_n_s__decode_words, 124, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_175)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_173));
+  __pyx_k_codeobj_174 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_173, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_164, __pyx_n_s__decode_words, 124, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_174)) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2211
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2205
  * 
  * # Spans are _inclusive_ on both ends [i, j]
  * def span_check(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_k_tuple_177 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_177)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_177);
+  __pyx_k_tuple_176 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_176)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_176);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__vec));
-  PyTuple_SET_ITEM(__pyx_k_tuple_177, 0, ((PyObject *)__pyx_n_s__vec));
+  PyTuple_SET_ITEM(__pyx_k_tuple_176, 0, ((PyObject *)__pyx_n_s__vec));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vec));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_177, 1, ((PyObject *)__pyx_n_s__i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_176, 1, ((PyObject *)__pyx_n_s__i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_177, 2, ((PyObject *)__pyx_n_s__j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_176, 2, ((PyObject *)__pyx_n_s__j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__k));
-  PyTuple_SET_ITEM(__pyx_k_tuple_177, 3, ((PyObject *)__pyx_n_s__k));
+  PyTuple_SET_ITEM(__pyx_k_tuple_176, 3, ((PyObject *)__pyx_n_s__k));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__k));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_177));
-  __pyx_k_codeobj_178 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_177, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__span_check, 2211, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_178)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_176));
+  __pyx_k_codeobj_177 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_176, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__span_check, 2205, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_177)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2213
  *     return True
  * 
  * def span_inc(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_k_tuple_179 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_179)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_179);
+  __pyx_k_tuple_178 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_178)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_178);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__vec));
-  PyTuple_SET_ITEM(__pyx_k_tuple_179, 0, ((PyObject *)__pyx_n_s__vec));
+  PyTuple_SET_ITEM(__pyx_k_tuple_178, 0, ((PyObject *)__pyx_n_s__vec));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vec));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_179, 1, ((PyObject *)__pyx_n_s__i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_178, 1, ((PyObject *)__pyx_n_s__i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_179, 2, ((PyObject *)__pyx_n_s__j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_178, 2, ((PyObject *)__pyx_n_s__j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__k));
-  PyTuple_SET_ITEM(__pyx_k_tuple_179, 3, ((PyObject *)__pyx_n_s__k));
+  PyTuple_SET_ITEM(__pyx_k_tuple_178, 3, ((PyObject *)__pyx_n_s__k));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__k));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_179));
-  __pyx_k_codeobj_180 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_179, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__span_inc, 2219, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_180)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_178));
+  __pyx_k_codeobj_179 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_178, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__span_inc, 2213, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_179)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2225
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
  *         k += 1
  * 
  * def span_dec(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_k_tuple_181 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_181)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_181);
+  __pyx_k_tuple_180 = PyTuple_New(4); if (unlikely(!__pyx_k_tuple_180)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_k_tuple_180);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__vec));
-  PyTuple_SET_ITEM(__pyx_k_tuple_181, 0, ((PyObject *)__pyx_n_s__vec));
+  PyTuple_SET_ITEM(__pyx_k_tuple_180, 0, ((PyObject *)__pyx_n_s__vec));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__vec));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__i));
-  PyTuple_SET_ITEM(__pyx_k_tuple_181, 1, ((PyObject *)__pyx_n_s__i));
+  PyTuple_SET_ITEM(__pyx_k_tuple_180, 1, ((PyObject *)__pyx_n_s__i));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__j));
-  PyTuple_SET_ITEM(__pyx_k_tuple_181, 2, ((PyObject *)__pyx_n_s__j));
+  PyTuple_SET_ITEM(__pyx_k_tuple_180, 2, ((PyObject *)__pyx_n_s__j));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__j));
   __Pyx_INCREF(((PyObject *)__pyx_n_s__k));
-  PyTuple_SET_ITEM(__pyx_k_tuple_181, 3, ((PyObject *)__pyx_n_s__k));
+  PyTuple_SET_ITEM(__pyx_k_tuple_180, 3, ((PyObject *)__pyx_n_s__k));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__k));
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_181));
-  __pyx_k_codeobj_182 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_181, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_138, __pyx_n_s__span_dec, 2225, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_182)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_180));
+  __pyx_k_codeobj_181 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_180, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_137, __pyx_n_s__span_dec, 2219, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_181)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -81159,15 +80764,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;}
@@ -81312,24 +80918,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 = 47; __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 = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 46; __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 = 46; __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 = 53; __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 = 53; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_ExtendedTrieNode) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 52; __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 = 52; __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 = 64; __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 = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_TrieTable) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 63; __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 = 63; __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 = 85; __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 = 85; __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 = 85; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_PhraseLocation) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 84; __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 = 84; __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 = 84; __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 = 107; __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 = 107; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_Sampler) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 106; __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 = 106; __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;
@@ -81347,9 +80953,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 = 223; __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 = 223; __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 = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa_HieroCachingRuleFactory) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 228; __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 = 228; __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 = 228; __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;
@@ -81395,21 +81001,21 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_ptype_3_sa___pyx_scope_struct_17_genexpr = &__pyx_type_3_sa___pyx_scope_struct_17_genexpr;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_18_alignments) < 0) {__pyx_filename = __pyx_f[7]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_18_alignments = &__pyx_type_3_sa___pyx_scope_struct_18_alignments;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_19_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 968; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_19_input) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 973; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_19_input = &__pyx_type_3_sa___pyx_scope_struct_19_input;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_20_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_20_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_20_genexpr = &__pyx_type_3_sa___pyx_scope_struct_20_genexpr;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_21_add_instance) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_21_add_instance) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 1884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_21_add_instance = &__pyx_type_3_sa___pyx_scope_struct_21_add_instance;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_22_form_rule) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2060; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_22_form_rule) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_22_form_rule = &__pyx_type_3_sa___pyx_scope_struct_22_form_rule;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_23_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_23_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_23_genexpr = &__pyx_type_3_sa___pyx_scope_struct_23_genexpr;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_24_fmt_rule) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_24_fmt_rule) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2119; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_24_fmt_rule = &__pyx_type_3_sa___pyx_scope_struct_24_fmt_rule;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_25_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_25_genexpr) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_25_genexpr = &__pyx_type_3_sa___pyx_scope_struct_25_genexpr;
-  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_26_get_f_phrases) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_26_get_f_phrases) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_26_get_f_phrases = &__pyx_type_3_sa___pyx_scope_struct_26_get_f_phrases;
   if (PyType_Ready(&__pyx_type_3_sa___pyx_scope_struct_27___iter__) < 0) {__pyx_filename = __pyx_f[13]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_3_sa___pyx_scope_struct_27___iter__ = &__pyx_type_3_sa___pyx_scope_struct_27___iter__;
@@ -81491,13 +81097,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_162), 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_161), 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/pauldb/workspace/cdec/python/src/sa/bilex.pxi":54
+  /* "/home/paulb/workspace/cdec/python/src/sa/bilex.pxi":54
  *     cdef id2eword, id2fword, eword2id, fword2id
  * 
  *     def __cinit__(self, from_text=None, from_data=False, from_binary=None,             # <<<<<<<<<<<<<<
@@ -81510,7 +81116,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_GIVEREF(__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":17
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":17
  * from libc.string cimport memset
  * 
  * cdef int MIN_BOTTOM_SIZE = 32             # <<<<<<<<<<<<<<
@@ -81519,7 +81125,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_SIZE = 32;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":18
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":18
  * 
  * cdef int MIN_BOTTOM_SIZE = 32
  * cdef int MIN_BOTTOM_BITS = 5             # <<<<<<<<<<<<<<
@@ -81528,7 +81134,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MIN_BOTTOM_BITS = 5;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/veb.pxi":28
+  /* "/home/paulb/workspace/cdec/python/src/sa/veb.pxi":28
  *         LOWER_MASK[i] = mask
  * 
  * _init_lower_mask()             # <<<<<<<<<<<<<<
@@ -81537,7 +81143,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_f_3_sa__init_lower_mask();
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":4
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":4
  * from libc.stdlib cimport malloc, realloc, strtol
  * 
  * cdef int INDEX_SHIFT = 3             # <<<<<<<<<<<<<<
@@ -81546,7 +81152,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_SHIFT = 3;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":5
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":5
  * 
  * cdef int INDEX_SHIFT = 3
  * cdef int INDEX_MASK = (1<<INDEX_SHIFT)-1             # <<<<<<<<<<<<<<
@@ -81555,7 +81161,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_INDEX_MASK = ((1 << __pyx_v_3_sa_INDEX_SHIFT) - 1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":87
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":87
  *             return self.terminals.index(s)
  * 
  * cdef Alphabet ALPHABET = Alphabet()             # <<<<<<<<<<<<<<
@@ -81570,7 +81176,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __pyx_v_3_sa_ALPHABET = ((struct __pyx_obj_3_sa_Alphabet *)__pyx_t_1);
   __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":107
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":107
  *     return ALPHABET.fromstring(string, terminal)
  * 
  * def isvar(sym):             # <<<<<<<<<<<<<<
@@ -81582,7 +81188,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__isvar, __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/pauldb/workspace/cdec/python/src/sa/sym.pxi":110
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":110
  *     return sym_isvar(sym)
  * 
  * def make_lattice(words):             # <<<<<<<<<<<<<<
@@ -81594,7 +81200,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 = 110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":114
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":114
  *     return tuple(((word, None, 1), ) for word in word_ids)
  * 
  * def decode_lattice(lattice):             # <<<<<<<<<<<<<<
@@ -81606,7 +81212,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 = 114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":118
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":118
  *             for arc in node for node in lattice)
  * 
  * def decode_sentence(lattice):             # <<<<<<<<<<<<<<
@@ -81618,7 +81224,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 = 118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":121
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":121
  *     return tuple(sym_tostring(sym) for ((sym, _, _),) in lattice)
  * 
  * def encode_words(words):             # <<<<<<<<<<<<<<
@@ -81630,7 +81236,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__encode_words, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/sym.pxi":124
+  /* "/home/paulb/workspace/cdec/python/src/sa/sym.pxi":124
  *     return tuple(sym_fromstring(word, True) for word in words)
  * 
  * def decode_words(syms):             # <<<<<<<<<<<<<<
@@ -81641,50 +81247,38 @@ PyMODINIT_FUNC PyInit__sa(void)
   if (PyObject_SetAttr(__pyx_m, __pyx_n_s__decode_words, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[10]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":5
+  /* "/home/paulb/workspace/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             # <<<<<<<<<<<<<<
  * import itertools
- * import sys
+ * 
  */
   __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__gc), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 5; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":6
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":6
  * # Note to reader: this code is closer to C than Python
  * import gc
  * import itertools             # <<<<<<<<<<<<<<
- * import sys
  * 
+ * from libc.stdlib cimport malloc, realloc, free
  */
   __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__itertools), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 6; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":7
- * import gc
- * import itertools
- * import sys             # <<<<<<<<<<<<<<
- * 
- * from libc.stdlib cimport malloc, realloc, free
- */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":13
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":12
  * from libc.math cimport fmod, ceil, floor, log
  * 
  * from collections import defaultdict, Counter, namedtuple             # <<<<<<<<<<<<<<
  * 
  * FeatureContext = namedtuple('FeatureContext',
  */
-  __pyx_t_1 = PyList_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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_INCREF(((PyObject *)__pyx_n_s__defaultdict));
   PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__defaultdict));
@@ -81695,53 +81289,53 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__namedtuple));
   PyList_SET_ITEM(__pyx_t_1, 2, ((PyObject *)__pyx_n_s__namedtuple));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__namedtuple));
-  __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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    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 = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":15
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":14
  * from collections import defaultdict, Counter, namedtuple
  * 
  * FeatureContext = namedtuple('FeatureContext',             # <<<<<<<<<<<<<<
  *     ['fphrase',
  *      'ephrase',
  */
-  __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":16
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":15
  * 
  * FeatureContext = namedtuple('FeatureContext',
  *     ['fphrase',             # <<<<<<<<<<<<<<
  *      'ephrase',
  *      'paircount',
  */
-  __pyx_t_1 = PyList_New(13); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 16; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyList_New(13); 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));
@@ -81782,7 +81376,7 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__online));
   PyList_SET_ITEM(__pyx_t_1, 12, ((PyObject *)__pyx_n_s__online));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__online));
-  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __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));
   PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__FeatureContext));
@@ -81790,31 +81384,31 @@ PyMODINIT_FUNC PyInit__sa(void)
   PyTuple_SET_ITEM(__pyx_t_3, 1, ((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_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_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;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__FeatureContext, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  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/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":31
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":30
  *     ])
  * 
  * OnlineFeatureContext = namedtuple('OnlineFeatureContext',             # <<<<<<<<<<<<<<
  *     ['fcount',
  *      'fsample_count',
  */
-  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__namedtuple); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":32
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":31
  * 
  * OnlineFeatureContext = namedtuple('OnlineFeatureContext',
  *     ['fcount',             # <<<<<<<<<<<<<<
  *      'fsample_count',
  *      'paircount',
  */
-  __pyx_t_3 = PyList_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyList_New(6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __Pyx_INCREF(((PyObject *)__pyx_n_s__fcount));
   PyList_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_n_s__fcount));
@@ -81834,22 +81428,22 @@ PyMODINIT_FUNC PyInit__sa(void)
   __Pyx_INCREF(((PyObject *)__pyx_n_s__bilex_fe));
   PyList_SET_ITEM(__pyx_t_3, 5, ((PyObject *)__pyx_n_s__bilex_fe));
   __Pyx_GIVEREF(((PyObject *)__pyx_n_s__bilex_fe));
-  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 31; __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 = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_INCREF(((PyObject *)__pyx_n_s_153));
-  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s_153));
-  __Pyx_GIVEREF(((PyObject *)__pyx_n_s_153));
+  __Pyx_INCREF(((PyObject *)__pyx_n_s_152));
+  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_n_s_152));
+  __Pyx_GIVEREF(((PyObject *)__pyx_n_s_152));
   PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_t_3));
   __Pyx_GIVEREF(((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[8]; __pyx_lineno = 31; __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 = 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;
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_153, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s_152, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":40
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":39
  *     ])
  * 
  * cdef int PRECOMPUTE = 0             # <<<<<<<<<<<<<<
@@ -81858,7 +81452,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_PRECOMPUTE = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":41
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":40
  * 
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1             # <<<<<<<<<<<<<<
@@ -81867,7 +81461,7 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_MERGE = 1;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":42
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":41
  * cdef int PRECOMPUTE = 0
  * cdef int MERGE = 1
  * cdef int BAEZA_YATES = 2             # <<<<<<<<<<<<<<
@@ -81876,65 +81470,65 @@ PyMODINIT_FUNC PyInit__sa(void)
  */
   __pyx_v_3_sa_BAEZA_YATES = 2;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":45
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":44
  * 
  * # NOTE: was encoded as a non-terminal in the previous version
  * cdef int EPSILON = sym_fromstring('*EPS*', True)             # <<<<<<<<<<<<<<
  * 
  * cdef class TrieNode:
  */
-  __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_176, 1);
+  __pyx_v_3_sa_EPSILON = __pyx_f_3_sa_sym_fromstring(__pyx_k_175, 1);
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":68
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":67
  *     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 = 68; __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 = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
   __pyx_k_99 = __pyx_t_3;
   __Pyx_GIVEREF(__pyx_t_3);
   __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2211
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2205
  * 
  * # Spans are _inclusive_ on both ends [i, j]
  * def span_check(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_17span_check, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_17span_check, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_check, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_check, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2213
  *     return True
  * 
  * def span_inc(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_19span_inc, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_19span_inc, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_inc, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_inc, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/rulefactory.pxi":2225
+  /* "/home/paulb/workspace/cdec/python/src/sa/rulefactory.pxi":2219
  *         k += 1
  * 
  * def span_dec(vec, i, j):             # <<<<<<<<<<<<<<
  *     k = i
  *     while k <= j:
  */
-  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_21span_dec, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_3_sa_21span_dec, NULL, __pyx_n_s___sa); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_dec, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2225; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyObject_SetAttr(__pyx_m, __pyx_n_s__span_dec, __pyx_t_3) < 0) {__pyx_filename = __pyx_f[8]; __pyx_lineno = 2219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 
-  /* "/home/pauldb/workspace/cdec/python/src/sa/features.pxi":1
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":1
  * cdef StringMap FD = StringMap() # Feature name dictionary             # <<<<<<<<<<<<<<
  * 
  * INITIAL_CAPACITY = 7 # default number of features
@@ -81947,7 +81541,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/pauldb/workspace/cdec/python/src/sa/features.pxi":3
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":3
  * cdef StringMap FD = StringMap() # Feature name dictionary
  * 
  * INITIAL_CAPACITY = 7 # default number of features             # <<<<<<<<<<<<<<
@@ -81956,7 +81550,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/pauldb/workspace/cdec/python/src/sa/features.pxi":4
+  /* "/home/paulb/workspace/cdec/python/src/sa/features.pxi":4
  * 
  * INITIAL_CAPACITY = 7 # default number of features
  * INCREMENT = INITIAL_CAPACITY # double size             # <<<<<<<<<<<<<<
@@ -82038,7 +81632,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
 }
 
@@ -82059,72 +81653,48 @@ static int __Pyx_ParseOptionalKeywords(
         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_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 {
+                    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,
@@ -82163,7 +81733,7 @@ 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);
 }
@@ -82203,38 +81773,33 @@ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyOb
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                         CYTHON_UNUSED PyObject *cause) {
     Py_XINCREF(type);
-    if (!value || value == Py_None)
-        value = NULL;
-    else
+    Py_XINCREF(value);
+    Py_XINCREF(tb);
+    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;
+    }
+    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) {
+    {
+        if (value != Py_None) {
             PyErr_SetString(PyExc_TypeError,
                 "instance exception may not have a separate value");
             goto raise_error;
         }
+        Py_DECREF(value);
         value = type;
         #if PY_VERSION_HEX < 0x02050000
             if (PyInstance_Check(type)) {
@@ -82267,7 +81832,6 @@ raise_error:
 }
 #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)) {
@@ -82285,36 +81849,12 @@ 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);
@@ -82331,6 +81871,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);
@@ -82344,7 +81887,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         }
     }
 bad:
-    Py_XDECREF(owned_instance);
     return;
 }
 #endif
@@ -82368,17 +81910,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_Check(key)))
         #endif
-            if (unlikely(!PyUnicode_Check(key)))
-                goto invalid_keyword_type;
+            goto invalid_keyword_type;
     }
     if ((!kw_allowed) && unlikely(key))
         goto invalid_keyword;
@@ -82387,7 +81925,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
@@ -82400,9 +81937,10 @@ 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;
@@ -82411,27 +81949,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;
@@ -82439,13 +81969,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;
@@ -82474,40 +82001,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;
@@ -82516,25 +82026,12 @@ 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)) {
@@ -82551,7 +82048,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);
@@ -82585,158 +82081,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) {
@@ -82747,7 +82093,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;
@@ -82755,12 +82100,8 @@ 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;
@@ -82772,9 +82113,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) {
@@ -82855,6 +82193,78 @@ static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) {
 #endif
 }
 
+static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {
+        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 int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
+    if (s1 == s2) {
+        return (equals == Py_EQ);
+    } else if (PyUnicode_CheckExact(s1) & PyUnicode_CheckExact(s2)) {
+        #if CYTHON_PEP393_ENABLED
+        if ((PyUnicode_READY(s1) < 0) || (PyUnicode_READY(s2) < 0))
+            return -1;
+        if (PyUnicode_GET_LENGTH(s1) != PyUnicode_GET_LENGTH(s2)) {
+            return (equals == Py_NE);
+        } else if (PyUnicode_GET_LENGTH(s1) == 1) {
+            Py_UCS4 ch1 = PyUnicode_READ_CHAR(s1, 0);
+            Py_UCS4 ch2 = PyUnicode_READ_CHAR(s2, 0);
+            return (equals == Py_EQ) ? (ch1 == ch2) : (ch1 != ch2);
+        #else
+        if (PyUnicode_GET_SIZE(s1) != PyUnicode_GET_SIZE(s2)) {
+            return (equals == Py_NE);
+        } else if (PyUnicode_GET_SIZE(s1) == 1) {
+            Py_UNICODE ch1 = PyUnicode_AS_UNICODE(s1)[0];
+            Py_UNICODE ch2 = PyUnicode_AS_UNICODE(s2)[0];
+            return (equals == Py_EQ) ? (ch1 == ch2) : (ch1 != ch2);
+        #endif
+        } else {
+            int result = PyUnicode_Compare(s1, s2);
+            if ((result == -1) && unlikely(PyErr_Occurred()))
+                return -1;
+            return (equals == Py_EQ) ? (result == 0) : (result != 0);
+        }
+    } 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;
+    }
+}
+
 static PyObject *
 __Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
 {
@@ -83135,56 +82545,6 @@ __Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
                                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*/
@@ -83204,7 +82564,7 @@ static PyTypeObject __pyx_CyFunctionType_type = {
     0,                                  /*tp_as_sequence*/
     0,                                  /*tp_as_mapping*/
     0,                                  /*tp_hash*/
-    __Pyx_CyFunction_Call,              /*tp_call*/
+    __Pyx_PyCFunction_Call,             /*tp_call*/
     0,                                  /*tp_str*/
     0,                                  /*tp_getattro*/
     0,                                  /*tp_setattro*/
@@ -83240,16 +82600,15 @@ static PyTypeObject __pyx_CyFunctionType_type = {
     0,                                  /*tp_version_tag*/
 #endif
 };
-static int __Pyx_CyFunction_init(void) {
-#if !CYTHON_COMPILING_IN_PYPY
-    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
-#endif
+static int __Pyx_CyFunction_init(void)
+{
     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) {
+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)
@@ -83258,112 +82617,13 @@ static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t
     m->defaults_pyobjects = pyobjects;
     return m->defaults;
 }
-static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
+static void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple)
+{
     __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
     m->defaults_tuple = tuple;
     Py_INCREF(tuple);
 }
 
-#if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3
-static PyObject *__Pyx_GetStdout(void) {
-    PyObject *f = PySys_GetObject((char *)"stdout");
-    if (!f) {
-        PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
-    }
-    return f;
-}
-static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) {
-    int i;
-    if (!f) {
-        if (!(f = __Pyx_GetStdout()))
-            return -1;
-    }
-    Py_INCREF(f);
-    for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) {
-        PyObject* v;
-        if (PyFile_SoftSpace(f, 1)) {
-            if (PyFile_WriteString(" ", f) < 0)
-                goto error;
-        }
-        v = PyTuple_GET_ITEM(arg_tuple, i);
-        if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0)
-            goto error;
-        if (PyString_Check(v)) {
-            char *s = PyString_AsString(v);
-            Py_ssize_t len = PyString_Size(v);
-            if (len > 0 &&
-                isspace(Py_CHARMASK(s[len-1])) &&
-                s[len-1] != ' ')
-                    PyFile_SoftSpace(f, 0);
-        }
-    }
-    if (newline) {
-        if (PyFile_WriteString("\n", f) < 0)
-            goto error;
-        PyFile_SoftSpace(f, 0);
-    }
-    Py_DECREF(f);
-    return 0;
-error:
-    Py_DECREF(f);
-    return -1;
-}
-#else /* Python 3 has a print function */
-static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) {
-    PyObject* kwargs = 0;
-    PyObject* result = 0;
-    PyObject* end_string;
-    if (unlikely(!__pyx_print)) {
-        __pyx_print = __Pyx_GetAttrString(__pyx_b, "print");
-        if (!__pyx_print)
-            return -1;
-    }
-    if (stream) {
-        kwargs = PyDict_New();
-        if (unlikely(!kwargs))
-            return -1;
-        if (unlikely(PyDict_SetItemString(kwargs, "file", stream) < 0))
-            goto bad;
-        if (!newline) {
-            end_string = PyUnicode_FromStringAndSize(" ", 1);
-            if (unlikely(!end_string))
-                goto bad;
-            if (PyDict_SetItemString(kwargs, "end", end_string) < 0) {
-                Py_DECREF(end_string);
-                goto bad;
-            }
-            Py_DECREF(end_string);
-        }
-    } else if (!newline) {
-        if (unlikely(!__pyx_print_kwargs)) {
-            __pyx_print_kwargs = PyDict_New();
-            if (unlikely(!__pyx_print_kwargs))
-                return -1;
-            end_string = PyUnicode_FromStringAndSize(" ", 1);
-            if (unlikely(!end_string))
-                return -1;
-            if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) {
-                Py_DECREF(end_string);
-                return -1;
-            }
-            Py_DECREF(end_string);
-        }
-        kwargs = __pyx_print_kwargs;
-    }
-    result = PyObject_Call(__pyx_print, arg_tuple, kwargs);
-    if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs))
-        Py_DECREF(kwargs);
-    if (!result)
-        return -1;
-    Py_DECREF(result);
-    return 0;
-bad:
-    if (kwargs != __pyx_print_kwargs)
-        Py_XDECREF(kwargs);
-    return -1;
-}
-#endif
-
 static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
     const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
     const int is_unsigned = neg_one > const_zero;
@@ -83764,8 +83024,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);
@@ -83785,7 +83045,6 @@ 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;
@@ -83793,10 +83052,6 @@ static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value,
     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;
@@ -83806,70 +83061,9 @@ 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) {
+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;
@@ -83881,18 +83075,14 @@ void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
     Py_XDECREF(exc_traceback);
 }
 static CYTHON_INLINE
-int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
-    if (unlikely(gen->is_running)) {
+PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value)
+{
+    PyObject *retval;
+    if (unlikely(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)) {
             PyErr_SetString(PyExc_TypeError,
@@ -83905,240 +83095,81 @@ PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
         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_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 PyObject *__Pyx_Generator_Next(PyObject *self)
+{
+    return __Pyx_Generator_SendEx((__pyx_GeneratorObject *) self, Py_None);
 }
-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_Send(PyObject *self, PyObject *value)
+{
+    return __Pyx_Generator_SendEx((__pyx_GeneratorObject *) self, value);
 }
-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_Close(PyObject *self)
+{
+    __pyx_GeneratorObject *generator = (__pyx_GeneratorObject *) 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)
+{
+    __pyx_GeneratorObject *generator = (__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(gen, NULL);
+    return __Pyx_Generator_SendEx(generator, NULL);
 }
-static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
+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) {
+static void
+__Pyx_Generator_dealloc(PyObject *self)
+{
     __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
     PyObject_GC_UnTrack(gen);
     if (gen->gi_weakreflist != NULL)
@@ -84150,10 +83181,16 @@ static void __Pyx_Generator_dealloc(PyObject *self) {
             return;                     /* resurrected.  :( */
     }
     PyObject_GC_UnTrack(self);
-    __Pyx_Generator_clear(self);
+    Py_CLEAR(gen->closure);
+    Py_CLEAR(gen->classobj);
+    Py_CLEAR(gen->exc_type);
+    Py_CLEAR(gen->exc_value);
+    Py_CLEAR(gen->exc_traceback);
     PyObject_GC_Del(gen);
 }
-static void __Pyx_Generator_del(PyObject *self) {
+static void
+__Pyx_Generator_del(PyObject *self)
+{
     PyObject *res;
     PyObject *error_type, *error_value, *error_traceback;
     __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
@@ -84182,13 +83219,11 @@ static void __Pyx_Generator_del(PyObject *self) {
         _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
@@ -84196,17 +83231,13 @@ static void __Pyx_Generator_del(PyObject *self) {
      * undone.
      */
 #ifdef COUNT_ALLOCS
-    --Py_TYPE(self)->tp_frees;
-    --Py_TYPE(self)->tp_allocs;
+    --self->ob_type->tp_frees;
+    --self->ob_type->tp_allocs;
 #endif
 }
 static PyMemberDef __pyx_Generator_memberlist[] = {
     {(char *) "gi_running",
-#if PY_VERSION_HEX >= 0x02060000
-     T_BOOL,
-#else
-     T_BYTE,
-#endif
+     T_INT,
      offsetof(__pyx_GeneratorObject, is_running),
      READONLY,
      NULL},
@@ -84218,7 +83249,7 @@ static PyMethodDef __pyx_Generator_methods[] = {
     {__Pyx_NAMESTR("close"), (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
     {0, 0, 0, 0}
 };
-static PyTypeObject __pyx_GeneratorType_type = {
+static PyTypeObject __pyx_GeneratorType = {
     PyVarObject_HEAD_INIT(0, 0)
     __Pyx_NAMESTR("generator"),         /*tp_name*/
     sizeof(__pyx_GeneratorObject),      /*tp_basicsize*/
@@ -84239,7 +83270,7 @@ static PyTypeObject __pyx_GeneratorType_type = {
     0,                                  /*tp_hash*/
     0,                                  /*tp_call*/
     0,                                  /*tp_str*/
-    0,                                  /*tp_getattro*/
+    PyObject_GenericGetAttr,            /*tp_getattro*/
     0,                                  /*tp_setattro*/
     0,                                  /*tp_as_buffer*/
     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/
@@ -84248,7 +83279,7 @@ static PyTypeObject __pyx_GeneratorType_type = {
     0,                                  /*tp_clear*/
     0,                                  /*tp_richcompare*/
     offsetof(__pyx_GeneratorObject, gi_weakreflist), /* tp_weaklistoffse */
-    0,                                  /*tp_iter*/
+    PyObject_SelfIter,                  /*tp_iter*/
     (iternextfunc) __Pyx_Generator_Next, /*tp_iternext*/
     __pyx_Generator_methods,            /*tp_methods*/
     __pyx_Generator_memberlist,         /*tp_members*/
@@ -84273,10 +83304,12 @@ static PyTypeObject __pyx_GeneratorType_type = {
     0,                                  /*tp_version_tag*/
 #endif
 };
-static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
-                                                  PyObject *closure) {
+static
+__pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
+                                           PyObject *closure)
+{
     __pyx_GeneratorObject *gen =
-        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
+        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType);
     if (gen == NULL)
         return NULL;
     gen->body = body;
@@ -84285,7 +83318,6 @@ static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
     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;
@@ -84293,14 +83325,9 @@ static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
     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_Generator_init(void)
+{
+    return PyType_Ready(&__pyx_GeneratorType);
 }
 
 static int __Pyx_check_binary_version(void) {
-- 
cgit v1.2.3