Generated by Cython 0.26

Yellow lines hint at Python interaction.
Click on a line that starts with a "+" to see the C code that Cython generated for it.

Raw output: plcfrs.cpp

+0001: """Parser for string-rewriting Linear Context-Free Rewriting Systems.
  __pyx_t_4 = PyDict_New(); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test_2, __pyx_t_4) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0002: 
 0003: Expects binarized, epsilon-free, monotone LCFRS grammars."""
 0004: from __future__ import print_function
+0005: import re
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_re, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_re, __pyx_t_4) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0006: import logging
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_logging, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_logging, __pyx_t_4) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0007: import numpy as np
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_4) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 0008: cimport cython
 0009: from cython.operator cimport postincrement, dereference
 0010: from libc.math cimport HUGE_VAL as INFINITY
 0011: include "constants.pxi"
 0012: 
+0013: cdef SmallChartItem COMPONENT = SmallChartItem(0, 0)
  __pyx_v_8discodop_6plcfrs_COMPONENT = SmallChartItem(0, 0);
+0014: cdef SmallChartItem NONE = SmallChartItem(0, 0)
  __pyx_v_8discodop_6plcfrs_NONE = SmallChartItem(0, 0);
+0015: cdef FatChartItem FATNONE = FatChartItem(0)
  __pyx_v_8discodop_6plcfrs_FATNONE = FatChartItem(0);
+0016: cdef FatChartItem FATCOMPONENT = FatChartItem(0)
  __pyx_v_8discodop_6plcfrs_FATCOMPONENT = FatChartItem(0);
 0017: 
+0018: cdef class LCFRSChart(Chart):
struct __pyx_vtabstruct_8discodop_6plcfrs_LCFRSChart {
  struct __pyx_vtabstruct_8discodop_10containers_Chart __pyx_base;
  void (*addlexedge)(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *, ItemNo, short);
  void (*updateprob)(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *, ItemNo, Prob);
  void (*addprob)(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *, ItemNo, Prob);
  Prob (*_subtreeprob)(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *, ItemNo);
};
static struct __pyx_vtabstruct_8discodop_6plcfrs_LCFRSChart *__pyx_vtabptr_8discodop_6plcfrs_LCFRSChart;

 0019: 	"""A chart for LCFRS grammars. An item is a ChartItem object."""
+0020: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_6plcfrs_10LCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_6plcfrs_10LCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  PyObject *__pyx_v_sent = 0;
  PyObject *__pyx_v_start = 0;
  PyObject *__pyx_v_logprob = 0;
  PyObject *__pyx_v_viterbi = 0;
  CYTHON_UNUSED PyObject *__pyx_v_itemsestimate = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grammar,&__pyx_n_s_sent,&__pyx_n_s_start,&__pyx_n_s_logprob,&__pyx_n_s_viterbi,&__pyx_n_s_itemsestimate,0};
    PyObject* values[6] = {0,0,0,0,0,0};
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8discodop_6plcfrs_10LCFRSChart___init__(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_sent, PyObject *__pyx_v_start, PyObject *__pyx_v_logprob, PyObject *__pyx_v_viterbi, CYTHON_UNUSED PyObject *__pyx_v_itemsestimate) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("discodop.plcfrs.LCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0021: 			start=None, logprob=True, viterbi=True,
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
+0022: 			itemsestimate=None):
    values[5] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grammar)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sent)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, 1); __PYX_ERR(0, 20, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_start);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_logprob);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_viterbi);
          if (value) { values[4] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_itemsestimate);
          if (value) { values[5] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 20, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)values[0]);
    __pyx_v_sent = ((PyObject*)values[1]);
    __pyx_v_start = values[2];
    __pyx_v_logprob = values[3];
    __pyx_v_viterbi = values[4];
    __pyx_v_itemsestimate = values[5];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 20, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.LCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grammar), __pyx_ptype_8discodop_10containers_Grammar, 1, "grammar", 0))) __PYX_ERR(0, 20, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 20, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_10LCFRSChart___init__(((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi, __pyx_v_itemsestimate);
+0023: 		self.grammar = grammar
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.grammar);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_base.grammar));
  __pyx_v_self->__pyx_base.grammar = __pyx_v_grammar;
+0024: 		self.sent = sent
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.sent);
  __Pyx_DECREF(__pyx_v_self->__pyx_base.sent);
  __pyx_v_self->__pyx_base.sent = __pyx_v_sent;
+0025: 		self.lensent = len(sent)
  if (unlikely(__pyx_v_sent == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 25, __pyx_L1_error)
  }
  __pyx_t_1 = PyList_GET_SIZE(__pyx_v_sent); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 25, __pyx_L1_error)
  __pyx_v_self->__pyx_base.lensent = __pyx_t_1;
+0026: 		self.start = grammar.toid[grammar.start if start is None else start]
  __pyx_t_3 = (__pyx_v_start == Py_None);
  if ((__pyx_t_3 != 0)) {
    __Pyx_INCREF(__pyx_v_grammar->start);
    __pyx_t_2 = __pyx_v_grammar->start;
  } else {
    __Pyx_INCREF(__pyx_v_start);
    __pyx_t_2 = __pyx_v_start;
  }
  __pyx_t_4 = PyObject_GetItem(((PyObject *)__pyx_v_grammar->toid), __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = __Pyx_PyInt_As_uint32_t(__pyx_t_4); if (unlikely((__pyx_t_5 == ((Label)-1)) && PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_self->__pyx_base.start = __pyx_t_5;
+0027: 		self.logprob = logprob
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_logprob); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error)
  __pyx_v_self->__pyx_base.logprob = __pyx_t_3;
+0028: 		self.viterbi = viterbi
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_viterbi); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 28, __pyx_L1_error)
  __pyx_v_self->__pyx_base.viterbi = __pyx_t_3;
 0029: 
+0030: 	cdef void addlexedge(self, ItemNo itemidx, short wordidx):
static void __pyx_f_8discodop_6plcfrs_10LCFRSChart_addlexedge(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, short __pyx_v_wordidx) {
  Edge __pyx_v_edge;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("addlexedge", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.LCFRSChart.addlexedge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 0031: 		"""Add lexical edge."""
 0032: 		cdef Edge edge
+0033: 		edge.rule = NULL
  __pyx_v_edge.rule = NULL;
+0034: 		edge.pos.mid = wordidx + 1
  __pyx_v_edge.pos.mid = (__pyx_v_wordidx + 1);
+0035: 		self.parseforest[itemidx].push_back(edge)
  try {
    (__pyx_v_self->__pyx_base.parseforest[__pyx_v_itemidx]).push_back(__pyx_v_edge);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 35, __pyx_L1_error)
  }
 0036: 
+0037: 	cdef void updateprob(self, ItemNo itemidx, Prob prob):
static void __pyx_f_8discodop_6plcfrs_10LCFRSChart_updateprob(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Prob __pyx_v_prob) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("updateprob", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
+0038: 		if prob < self.probs[itemidx]:
  __pyx_t_1 = ((__pyx_v_prob < (__pyx_v_self->__pyx_base.probs[__pyx_v_itemidx])) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0039: 			self.probs[itemidx] = prob
    (__pyx_v_self->__pyx_base.probs[__pyx_v_itemidx]) = __pyx_v_prob;
 0040: 
+0041: 	cdef void addprob(self, ItemNo itemidx, Prob prob):
static void __pyx_f_8discodop_6plcfrs_10LCFRSChart_addprob(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Prob __pyx_v_prob) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("addprob", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
+0042: 		self.probs[itemidx] += prob
  __pyx_t_1 = __pyx_v_itemidx;
  (__pyx_v_self->__pyx_base.probs[__pyx_t_1]) = ((__pyx_v_self->__pyx_base.probs[__pyx_t_1]) + __pyx_v_prob);
 0043: 
+0044: 	cdef Prob _subtreeprob(self, ItemNo itemidx):
static Prob __pyx_f_8discodop_6plcfrs_10LCFRSChart__subtreeprob(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0045: 		return self.probs[itemidx]
  __pyx_r = (__pyx_v_self->__pyx_base.probs[__pyx_v_itemidx]);
  goto __pyx_L0;
 0046: 
+0047: 	cdef Prob subtreeprob(self, ItemNo itemidx):
static Prob __pyx_f_8discodop_6plcfrs_10LCFRSChart_subtreeprob(struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0048: 		return self.probs[itemidx]
  __pyx_r = (__pyx_v_self->__pyx_base.probs[__pyx_v_itemidx]);
  goto __pyx_L0;
 0049: 
+0050: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_6plcfrs_10LCFRSChart_label(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("label", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.LCFRSChart.label", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0051: 		raise NotImplementedError
  __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
  __PYX_ERR(0, 51, __pyx_L1_error)
 0052: 
 0053: 
 0054: @cython.final
+0055: cdef class SmallLCFRSChart(LCFRSChart):
struct __pyx_vtabstruct_8discodop_6plcfrs_SmallLCFRSChart {
  struct __pyx_vtabstruct_8discodop_6plcfrs_LCFRSChart __pyx_base;
  SmallChartItem (*_root)(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *);
  Label (*_label)(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *, ItemNo);
  void (*addedge)(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *, ItemNo, ItemNo, SmallChartItem &, ProbRule *);
};
static struct __pyx_vtabstruct_8discodop_6plcfrs_SmallLCFRSChart *__pyx_vtabptr_8discodop_6plcfrs_SmallLCFRSChart;
static SmallChartItem __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__root(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *);
static Label __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__label(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *, ItemNo);
static void __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_addedge(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *, ItemNo, ItemNo, SmallChartItem &, ProbRule *);

 0056: 	"""For sentences that fit into a single machine word."""
+0057: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  PyObject *__pyx_v_sent = 0;
  PyObject *__pyx_v_start = 0;
  PyObject *__pyx_v_logprob = 0;
  PyObject *__pyx_v_viterbi = 0;
  PyObject *__pyx_v_itemsestimate = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grammar,&__pyx_n_s_sent,&__pyx_n_s_start,&__pyx_n_s_logprob,&__pyx_n_s_viterbi,&__pyx_n_s_itemsestimate,0};
    PyObject* values[6] = {0,0,0,0,0,0};
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart___init__(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_sent, PyObject *__pyx_v_start, PyObject *__pyx_v_logprob, PyObject *__pyx_v_viterbi, PyObject *__pyx_v_itemsestimate) {
  SmallChartItem __pyx_v_tmp;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0058: 			start=None, logprob=True, viterbi=True,
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
+0059: 			itemsestimate=None):
    values[5] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grammar)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sent)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, 1); __PYX_ERR(0, 57, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_start);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_logprob);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_viterbi);
          if (value) { values[4] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_itemsestimate);
          if (value) { values[5] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 57, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)values[0]);
    __pyx_v_sent = ((PyObject*)values[1]);
    __pyx_v_start = values[2];
    __pyx_v_logprob = values[3];
    __pyx_v_viterbi = values[4];
    __pyx_v_itemsestimate = values[5];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 57, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grammar), __pyx_ptype_8discodop_10containers_Grammar, 1, "grammar", 0))) __PYX_ERR(0, 57, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 57, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart___init__(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi, __pyx_v_itemsestimate);
+0060: 		cdef SmallChartItem tmp = SmallChartItem(0, 0)
  __pyx_v_tmp = SmallChartItem(0, 0);
+0061: 		super(SmallLCFRSChart, self).__init__(
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_8discodop_6plcfrs_SmallLCFRSChart));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_8discodop_6plcfrs_SmallLCFRSChart));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_8discodop_6plcfrs_SmallLCFRSChart));
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self));
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 61, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+0062: 				grammar, sent, start, logprob, viterbi)
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_grammar), __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_grammar), __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(5+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
    __Pyx_INCREF(__pyx_v_sent);
    __Pyx_GIVEREF(__pyx_v_sent);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_sent);
    __Pyx_INCREF(__pyx_v_start);
    __Pyx_GIVEREF(__pyx_v_start);
    PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, __pyx_v_start);
    __Pyx_INCREF(__pyx_v_logprob);
    __Pyx_GIVEREF(__pyx_v_logprob);
    PyTuple_SET_ITEM(__pyx_t_5, 3+__pyx_t_4, __pyx_v_logprob);
    __Pyx_INCREF(__pyx_v_viterbi);
    __Pyx_GIVEREF(__pyx_v_viterbi);
    PyTuple_SET_ITEM(__pyx_t_5, 4+__pyx_t_4, __pyx_v_viterbi);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0063: 		if itemsestimate is not None:
  __pyx_t_6 = (__pyx_v_itemsestimate != Py_None);
  __pyx_t_7 = (__pyx_t_6 != 0);
  if (__pyx_t_7) {
/* … */
  }
+0064: 			self.items.reserve(itemsestimate)
    __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 64, __pyx_L1_error)
    __pyx_v_self->items.reserve(__pyx_t_8);
 0065: 			# NB: self.itemindex does not support reserve
+0066: 			self.parseforest.reserve(itemsestimate)
    __pyx_t_9 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_9 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 66, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.parseforest.reserve(__pyx_t_9);
+0067: 			self.probs.reserve(itemsestimate)
    __pyx_t_10 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_10 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.probs.reserve(__pyx_t_10);
 0068: 		# first item is a sentinel
+0069: 		self.items.push_back(tmp)
  try {
    __pyx_v_self->items.push_back(__pyx_v_tmp);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 69, __pyx_L1_error)
  }
+0070: 		self.itemindex[tmp] = 0
  (__pyx_v_self->itemindex[__pyx_v_tmp]) = 0;
+0071: 		self.probs.push_back(INFINITY)
  try {
    __pyx_v_self->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 71, __pyx_L1_error)
  }
 0072: 
+0073: 	cdef void addedge(self, ItemNo itemidx, ItemNo leftitemidx,
static void __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_addedge(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, CYTHON_UNUSED ItemNo __pyx_v_leftitemidx, SmallChartItem &__pyx_v_left, ProbRule *__pyx_v_rule) {
  Edge __pyx_v_edge;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("addedge", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.SmallLCFRSChart.addedge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 0074: 			SmallChartItem& left, ProbRule *rule):
 0075: 		"""Add new edge."""
 0076: 		cdef Edge edge
+0077: 		edge.rule = rule
  __pyx_v_edge.rule = __pyx_v_rule;
+0078: 		edge.pos.lvec = 0UL
  __pyx_v_edge.pos.lvec = 0UL;
+0079: 		edge.pos.lvec = left.vec
  __pyx_t_1 = __pyx_v_left.vec;
  __pyx_v_edge.pos.lvec = __pyx_t_1;
+0080: 		self.parseforest[itemidx].push_back(edge)
  try {
    (__pyx_v_self->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).push_back(__pyx_v_edge);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 80, __pyx_L1_error)
  }
 0081: 
+0082: 	cdef ItemNo _left(self, ItemNo itemidx_unused, Edge edge):
static ItemNo __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__left(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx_unused, Edge __pyx_v_edge) {
  SmallChartItem __pyx_v_tmp;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_left", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0083: 		cdef SmallChartItem tmp
+0084: 		if edge.rule is NULL:
  __pyx_t_1 = ((__pyx_v_edge.rule == NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0085: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0086: 		tmp.label = edge.rule.rhs1
  __pyx_t_2 = __pyx_v_edge.rule->rhs1;
  __pyx_v_tmp.label = __pyx_t_2;
+0087: 		tmp.vec = edge.pos.lvec
  __pyx_t_3 = __pyx_v_edge.pos.lvec;
  __pyx_v_tmp.vec = __pyx_t_3;
+0088: 		return self.itemindex[tmp]
  __pyx_r = (__pyx_v_self->itemindex[__pyx_v_tmp]);
  goto __pyx_L0;
 0089: 
+0090: 	cdef ItemNo _right(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__right(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  SmallChartItem __pyx_v_tmp;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_right", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0091: 		cdef SmallChartItem tmp
+0092: 		if edge.rule is NULL or edge.rule.rhs2 == 0:
  __pyx_t_2 = ((__pyx_v_edge.rule == NULL) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_edge.rule->rhs2 == 0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+0093: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0094: 		tmp.label = edge.rule.rhs2
  __pyx_t_3 = __pyx_v_edge.rule->rhs2;
  __pyx_v_tmp.label = __pyx_t_3;
+0095: 		tmp.vec = self.items[itemidx].vec ^ edge.pos.lvec
  __pyx_v_tmp.vec = ((__pyx_v_self->items[__pyx_v_itemidx]).vec ^ __pyx_v_edge.pos.lvec);
+0096: 		return self.itemindex[tmp]
  __pyx_r = (__pyx_v_self->itemindex[__pyx_v_tmp]);
  goto __pyx_L0;
 0097: 
+0098: 	cdef SmallChartItem _root(self):
static SmallChartItem __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__root(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self) {
  SmallChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_root", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0099: 		return SmallChartItem(self.start, (1UL << self.lensent) - 1)
  __pyx_r = SmallChartItem(__pyx_v_self->__pyx_base.__pyx_base.start, ((1UL << __pyx_v_self->__pyx_base.__pyx_base.lensent) - 1));
  goto __pyx_L0;
 0100: 
+0101: 	def root(self):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_15SmallLCFRSChart_2root[] = "SmallLCFRSChart.root(self)";
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root (wrapper)", 0);
  __pyx_r = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_2root(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_2root(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.root", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0102: 		if self.itemindex.find(self._root()) == self.itemindex.end():
  __pyx_t_1 = ((__pyx_v_self->itemindex.find(__pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__root(__pyx_v_self)) == __pyx_v_self->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0103: 			return 0
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_int_0);
    __pyx_r = __pyx_int_0;
    goto __pyx_L0;
+0104: 		return self.itemindex[self._root()]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_uint32_t((__pyx_v_self->itemindex[__pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__root(__pyx_v_self)])); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 104, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 0105: 
+0106: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_label(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0107: 		return self.items[itemidx].label
  __pyx_r = (__pyx_v_self->items[__pyx_v_itemidx]).label;
  goto __pyx_L0;
 0108: 
+0109: 	cdef Label _label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__label(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0110: 		return self.items[itemidx].label
  __pyx_r = (__pyx_v_self->items[__pyx_v_itemidx]).label;
  goto __pyx_L0;
 0111: 
+0112: 	cdef ItemNo getitemidx(self, uint64_t n):
static ItemNo __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_getitemidx(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, uint64_t __pyx_v_n) {
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("getitemidx", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0113: 		"""Get itemidx of n'th item."""
+0114: 		return n
  __pyx_r = __pyx_v_n;
  goto __pyx_L0;
 0115: 
+0116: 	def indices(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_15SmallLCFRSChart_4indices[] = "SmallLCFRSChart.indices(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx) {
  ItemNo __pyx_v_itemidx;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("indices (wrapper)", 0);
  assert(__pyx_arg_itemidx); {
    __pyx_v_itemidx = __Pyx_PyInt_As_uint32_t(__pyx_arg_itemidx); if (unlikely((__pyx_v_itemidx == ((ItemNo)-1)) && PyErr_Occurred())) __PYX_ERR(0, 116, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_4indices(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_4indices(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  SmallChartItem __pyx_v_item;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("indices", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0117: 		cdef SmallChartItem item = self.items[itemidx]
  __pyx_v_item = (__pyx_v_self->items[__pyx_v_itemidx]);
+0118: 		return [n for n in range(len(self.sent)) if testbit(item.vec, n)]
  __Pyx_XDECREF(__pyx_r);
  { /* enter inner scope */
    Py_ssize_t __pyx_7genexpr__pyx_v_n;
    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.sent;
    __Pyx_INCREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 118, __pyx_L1_error)
    }
    __pyx_t_3 = PyList_GET_SIZE(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
      __pyx_7genexpr__pyx_v_n = __pyx_t_4;
      __pyx_t_5 = (__pyx_fuse_3__pyx_f_8discodop_3bit_testbit(__pyx_v_item.vec, __pyx_7genexpr__pyx_v_n) != 0);
      if (__pyx_t_5) {
        __pyx_t_2 = PyInt_FromSsize_t(__pyx_7genexpr__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 118, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      }
    }
  } /* exit inner scope */
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 0119: 
+0120: 	def itemstr(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_15SmallLCFRSChart_6itemstr[] = "SmallLCFRSChart.itemstr(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx) {
  ItemNo __pyx_v_itemidx;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr (wrapper)", 0);
  assert(__pyx_arg_itemidx); {
    __pyx_v_itemidx = __Pyx_PyInt_As_uint32_t(__pyx_arg_itemidx); if (unlikely((__pyx_v_itemidx == ((ItemNo)-1)) && PyErr_Occurred())) __PYX_ERR(0, 120, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_6itemstr(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_6itemstr(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0121: 		return '%s[%s]' % (
  __Pyx_XDECREF(__pyx_r);
/* … */
  __pyx_t_4 = PyUnicode_Format(__pyx_kp_u_s_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 121, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
+0122: 				self.grammar.tolabel[self._label(itemidx)],
  __pyx_t_1 = __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__label(__pyx_v_self, __pyx_v_itemidx);
  __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->tolabel), __pyx_t_1, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
/* … */
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 122, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
  __pyx_t_2 = 0;
  __pyx_t_4 = 0;
+0123: 				bin(self.items[itemidx].vec)[2:].zfill(self.lensent)[::-1])
  __pyx_t_4 = __Pyx_PyInt_From_uint64_t((__pyx_v_self->items[__pyx_v_itemidx]).vec); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_bin, __pyx_t_5, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyObject_GetSlice(__pyx_t_4, 2, 0, NULL, NULL, &__pyx_slice_, 1, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_zfill); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyInt_From_short(__pyx_v_self->__pyx_base.__pyx_base.lensent); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (!__pyx_t_6) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_4)) {
      PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
      __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
      PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
      __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 123, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5);
      __pyx_t_5 = 0;
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 123, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_slice_ = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice_)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice_);
  __Pyx_GIVEREF(__pyx_slice_);
  __pyx_t_4 = PyObject_GetItem(__pyx_t_3, __pyx_slice__2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_slice__2 = PySlice_New(Py_None, Py_None, __pyx_int_neg_1); if (unlikely(!__pyx_slice__2)) __PYX_ERR(0, 123, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice__2);
  __Pyx_GIVEREF(__pyx_slice__2);
 0124: 
+0125: 	def hasnode(self, node, Whitelist whitelist=None):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_9hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_15SmallLCFRSChart_8hasnode[] = "SmallLCFRSChart.hasnode(self, node, Whitelist whitelist=None)";
static PyObject *__pyx_pw_8discodop_6plcfrs_15SmallLCFRSChart_9hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_node = 0;
  struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_node,&__pyx_n_s_whitelist,0};
    PyObject* values[2] = {0,0};
    values[1] = (PyObject *)((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_node)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_whitelist);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "hasnode") < 0)) __PYX_ERR(0, 125, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_node = values[0];
    __pyx_v_whitelist = ((struct __pyx_obj_8discodop_10containers_Whitelist *)values[1]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("hasnode", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 125, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_whitelist), __pyx_ptype_8discodop_10containers_Whitelist, 1, "whitelist", 0))) __PYX_ERR(0, 125, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_8hasnode(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_self), __pyx_v_node, __pyx_v_whitelist);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_8discodop_6plcfrs_15SmallLCFRSChart_7hasnode_2generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */
/* … */
static PyObject *__pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_8hasnode(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, PyObject *__pyx_v_node, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode *__pyx_cur_scope;
  SmallChartItem __pyx_v_tmp;
  PyObject *__pyx_v_label = NULL;
  PyObject *__pyx_v_vec = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode", 0);
  __pyx_cur_scope = (struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode *)__pyx_tp_new_8discodop_6plcfrs___pyx_scope_struct__hasnode(__pyx_ptype_8discodop_6plcfrs___pyx_scope_struct__hasnode, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 125, __pyx_L1_error)
  } else {
    __Pyx_GOTREF(__pyx_cur_scope);
  }
  __pyx_cur_scope->__pyx_v_node = __pyx_v_node;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_node);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_node);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_label);
  __Pyx_XDECREF(__pyx_v_vec);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode {
  PyObject_HEAD
  PyObject *__pyx_v_node;
};

 0126: 		cdef SmallChartItem tmp
+0127: 		try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L8_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
    __pyx_L8_try_end:;
  }
+0128: 			label = self.grammar.toid[node.label]
      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_node, __pyx_n_s_label); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 128, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PyObject_GetItem(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->toid), __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 128, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_label = __pyx_t_5;
      __pyx_t_5 = 0;
+0129: 		except KeyError:
    __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
    if (__pyx_t_6) {
      __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(0, 129, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_7);
+0130: 			return False
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;
+0131: 		vec = sum(1 << n for n in node.leaves())
static PyObject *__pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_7hasnode_genexpr(PyObject *__pyx_self) {
  struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct_1_genexpr *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("genexpr", 0);
  __pyx_cur_scope = (struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct_1_genexpr *)__pyx_tp_new_8discodop_6plcfrs___pyx_scope_struct_1_genexpr(__pyx_ptype_8discodop_6plcfrs___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __pyx_cur_scope = ((struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct_1_genexpr *)Py_None);
    __Pyx_INCREF(Py_None);
    __PYX_ERR(0, 131, __pyx_L1_error)
  } else {
    __Pyx_GOTREF(__pyx_cur_scope);
  }
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode *) __pyx_self;
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_8discodop_6plcfrs_15SmallLCFRSChart_7hasnode_2generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_hasnode_locals_genexpr, __pyx_n_s_discodop_plcfrs); if (unlikely(!gen)) __PYX_ERR(0, 131, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("discodop.plcfrs.SmallLCFRSChart.hasnode.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_8discodop_6plcfrs_15SmallLCFRSChart_7hasnode_2generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 131, __pyx_L1_error)
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_node)) { __Pyx_RaiseClosureNameError("node"); __PYX_ERR(0, 131, __pyx_L1_error) }
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 131, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 131, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 131, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __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_ERR(0, 131, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __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_ERR(0, 131, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_5(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 131, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_n);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_n, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Lshift(__pyx_int_1, __pyx_cur_scope->__pyx_v_n); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 131, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    __Pyx_XGIVEREF(__pyx_t_2);
    __pyx_cur_scope->__pyx_t_0 = __pyx_t_2;
    __pyx_cur_scope->__pyx_t_1 = __pyx_t_4;
    __pyx_cur_scope->__pyx_t_2 = __pyx_t_5;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L6_resume_from_yield:;
    __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
    __pyx_cur_scope->__pyx_t_0 = 0;
    __Pyx_XGOTREF(__pyx_t_2);
    __pyx_t_4 = __pyx_cur_scope->__pyx_t_1;
    __pyx_t_5 = __pyx_cur_scope->__pyx_t_2;
    if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 131, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope);

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_7 = __pyx_pf_8discodop_6plcfrs_15SmallLCFRSChart_7hasnode_genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 131, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 131, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_7);
  __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_sum, __pyx_t_4, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 131, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_vec = __pyx_t_7;
  __pyx_t_7 = 0;
/* … */
struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct_1_genexpr {
  PyObject_HEAD
  struct __pyx_obj_8discodop_6plcfrs___pyx_scope_struct__hasnode *__pyx_outer_scope;
  PyObject *__pyx_v_n;
  PyObject *__pyx_t_0;
  Py_ssize_t __pyx_t_1;
  PyObject *(*__pyx_t_2)(PyObject *);
};

+0132: 		tmp = SmallChartItem(label, vec)
  __pyx_t_8 = __Pyx_PyInt_As_uint32_t(__pyx_v_label); if (unlikely((__pyx_t_8 == ((Label)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error)
  __pyx_t_9 = __Pyx_PyInt_As_uint64_t(__pyx_v_vec); if (unlikely((__pyx_t_9 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error)
  __pyx_v_tmp = SmallChartItem(__pyx_t_8, __pyx_t_9);
+0133: 		if whitelist is not None:
  __pyx_t_10 = (((PyObject *)__pyx_v_whitelist) != Py_None);
  __pyx_t_11 = (__pyx_t_10 != 0);
  if (__pyx_t_11) {
/* … */
  }
+0134: 			tmp.label = whitelist.mapping[label]
    __pyx_t_12 = __Pyx_PyIndex_AsSsize_t(__pyx_v_label); if (unlikely((__pyx_t_12 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 134, __pyx_L1_error)
    __pyx_v_tmp.label = (__pyx_v_whitelist->mapping[__pyx_t_12]);
+0135: 			return whitelist.small[tmp.label].count(tmp) != 0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_PyBool_FromLong(((__pyx_v_whitelist->small[__pyx_v_tmp.label]).count(__pyx_v_tmp) != 0)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 135, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_r = __pyx_t_7;
    __pyx_t_7 = 0;
    goto __pyx_L0;
+0136: 		return self.itemindex[tmp] != 0
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_7 = __Pyx_PyBool_FromLong(((__pyx_v_self->itemindex[__pyx_v_tmp]) != 0)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 136, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_r = __pyx_t_7;
  __pyx_t_7 = 0;
  goto __pyx_L0;
 0137: 
+0138: 	cdef SmallChartItem asSmallChartItem(self, ItemNo itemidx):
static SmallChartItem __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_asSmallChartItem(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  SmallChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asSmallChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0139: 		return self.items[itemidx]
  __pyx_r = (__pyx_v_self->items[__pyx_v_itemidx]);
  goto __pyx_L0;
 0140: 
+0141: 	cdef FatChartItem asFatChartItem(self, ItemNo itemidx):
static FatChartItem __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_asFatChartItem(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx) {
  FatChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asFatChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.SmallLCFRSChart.asFatChartItem", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_pretend_to_initialize(&__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0142: 		raise ValueError
  __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0);
  __PYX_ERR(0, 142, __pyx_L1_error)
 0143: 
+0144: 	cdef size_t asCFGspan(self, ItemNo itemidx):
static size_t __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_asCFGspan(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  SmallChartItem __pyx_v_sitem;
  int __pyx_v_start;
  int __pyx_v_end;
  size_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asCFGspan", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.SmallLCFRSChart.asCFGspan", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0145: 		cdef SmallChartItem sitem = self.items[itemidx]
  __pyx_v_sitem = (__pyx_v_self->items[__pyx_v_itemidx]);
+0146: 		cdef int start = nextset(sitem.vec, 0)
  __pyx_v_start = __pyx_f_8discodop_3bit_nextset(__pyx_v_sitem.vec, 0);
+0147: 		cdef int end = nextunset(sitem.vec, start)
  __pyx_v_end = __pyx_f_8discodop_3bit_nextunset(__pyx_v_sitem.vec, __pyx_v_start);
+0148: 		assert nextset(sitem.vec, end) == -1
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((__pyx_f_8discodop_3bit_nextset(__pyx_v_sitem.vec, __pyx_v_end) == -1L) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 148, __pyx_L1_error)
    }
  }
  #endif
+0149: 		assert 0 <= start < end <= self.lensent
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_1 = (0 <= __pyx_v_start);
    if (__pyx_t_1) {
      __pyx_t_1 = (__pyx_v_start < __pyx_v_end);
      if (__pyx_t_1) {
        __pyx_t_1 = (__pyx_v_end <= __pyx_v_self->__pyx_base.__pyx_base.lensent);
      }
    }
    if (unlikely(!(__pyx_t_1 != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 149, __pyx_L1_error)
    }
  }
  #endif
+0150: 		return compactcellidx(start, end, self.lensent, 1)
  __pyx_r = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_start, __pyx_v_end, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1);
  goto __pyx_L0;
 0151: 
 0152: 
 0153: @cython.final
+0154: cdef class FatLCFRSChart(LCFRSChart):
struct __pyx_vtabstruct_8discodop_6plcfrs_FatLCFRSChart {
  struct __pyx_vtabstruct_8discodop_6plcfrs_LCFRSChart __pyx_base;
  FatChartItem (*_root)(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *);
  Label (*_label)(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *, ItemNo);
  void (*addedge)(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *, ItemNo, ItemNo, FatChartItem &, ProbRule *);
};
static struct __pyx_vtabstruct_8discodop_6plcfrs_FatLCFRSChart *__pyx_vtabptr_8discodop_6plcfrs_FatLCFRSChart;
static FatChartItem __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__root(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *);
static Label __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__label(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *, ItemNo);
static void __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_addedge(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *, ItemNo, ItemNo, FatChartItem &, ProbRule *);

 0155: 	"""LCFRS chart that supports longer sentences."""
+0156: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  PyObject *__pyx_v_sent = 0;
  PyObject *__pyx_v_start = 0;
  PyObject *__pyx_v_logprob = 0;
  PyObject *__pyx_v_viterbi = 0;
  PyObject *__pyx_v_itemsestimate = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_grammar,&__pyx_n_s_sent,&__pyx_n_s_start,&__pyx_n_s_logprob,&__pyx_n_s_viterbi,&__pyx_n_s_itemsestimate,0};
    PyObject* values[6] = {0,0,0,0,0,0};
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart___init__(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_sent, PyObject *__pyx_v_start, PyObject *__pyx_v_logprob, PyObject *__pyx_v_viterbi, PyObject *__pyx_v_itemsestimate) {
  FatChartItem __pyx_v_tmp;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0157: 			start=None, logprob=True, viterbi=True,
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
+0158: 			itemsestimate=None):
    values[5] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grammar)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sent)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, 1); __PYX_ERR(0, 156, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_start);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_logprob);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_viterbi);
          if (value) { values[4] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_itemsestimate);
          if (value) { values[5] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 156, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)values[0]);
    __pyx_v_sent = ((PyObject*)values[1]);
    __pyx_v_start = values[2];
    __pyx_v_logprob = values[3];
    __pyx_v_viterbi = values[4];
    __pyx_v_itemsestimate = values[5];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 156, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grammar), __pyx_ptype_8discodop_10containers_Grammar, 1, "grammar", 0))) __PYX_ERR(0, 156, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 156, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart___init__(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi, __pyx_v_itemsestimate);
+0159: 		super(FatLCFRSChart, self).__init__(
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_8discodop_6plcfrs_FatLCFRSChart));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_8discodop_6plcfrs_FatLCFRSChart));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_8discodop_6plcfrs_FatLCFRSChart));
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self));
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 159, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+0160: 				grammar, sent, start, logprob, viterbi)
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_grammar), __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[6] = {__pyx_t_3, ((PyObject *)__pyx_v_grammar), __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_4, 5+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(5+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 159, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
    __Pyx_INCREF(__pyx_v_sent);
    __Pyx_GIVEREF(__pyx_v_sent);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_sent);
    __Pyx_INCREF(__pyx_v_start);
    __Pyx_GIVEREF(__pyx_v_start);
    PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, __pyx_v_start);
    __Pyx_INCREF(__pyx_v_logprob);
    __Pyx_GIVEREF(__pyx_v_logprob);
    PyTuple_SET_ITEM(__pyx_t_5, 3+__pyx_t_4, __pyx_v_logprob);
    __Pyx_INCREF(__pyx_v_viterbi);
    __Pyx_GIVEREF(__pyx_v_viterbi);
    PyTuple_SET_ITEM(__pyx_t_5, 4+__pyx_t_4, __pyx_v_viterbi);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 159, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0161: 		cdef FatChartItem tmp = FatChartItem(0)
  __pyx_v_tmp = FatChartItem(0);
+0162: 		if itemsestimate is not None:
  __pyx_t_6 = (__pyx_v_itemsestimate != Py_None);
  __pyx_t_7 = (__pyx_t_6 != 0);
  if (__pyx_t_7) {
/* … */
  }
+0163: 			self.items.reserve(itemsestimate)
    __pyx_t_8 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_8 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 163, __pyx_L1_error)
    __pyx_v_self->items.reserve(__pyx_t_8);
 0164: 			# NB: self.itemindex does not support reserve
+0165: 			self.parseforest.reserve(itemsestimate)
    __pyx_t_9 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_9 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 165, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.parseforest.reserve(__pyx_t_9);
+0166: 			self.probs.reserve(itemsestimate)
    __pyx_t_10 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_10 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 166, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.probs.reserve(__pyx_t_10);
+0167: 		self.items.push_back(tmp)  # sentinel
  try {
    __pyx_v_self->items.push_back(__pyx_v_tmp);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 167, __pyx_L1_error)
  }
+0168: 		self.itemindex[tmp] = 0  # sentinel
  (__pyx_v_self->itemindex[__pyx_v_tmp]) = 0;
+0169: 		self.probs.push_back(INFINITY)
  try {
    __pyx_v_self->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 169, __pyx_L1_error)
  }
 0170: 
+0171: 	cdef void addedge(self, ItemNo itemidx, ItemNo leftitemidx,
static void __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_addedge(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, ItemNo __pyx_v_leftitemidx, CYTHON_UNUSED FatChartItem &__pyx_v_left, ProbRule *__pyx_v_rule) {
  Edge __pyx_v_edge;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("addedge", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.FatLCFRSChart.addedge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 0172: 			FatChartItem& left, ProbRule *rule):
 0173: 		"""Add new edge and update viterbi probability."""
 0174: 		cdef Edge edge
+0175: 		edge.rule = rule
  __pyx_v_edge.rule = __pyx_v_rule;
+0176: 		edge.pos.lvec = 0UL
  __pyx_v_edge.pos.lvec = 0UL;
+0177: 		edge.pos.lidx = leftitemidx
  __pyx_v_edge.pos.lidx = __pyx_v_leftitemidx;
+0178: 		self.parseforest[itemidx].push_back(edge)
  try {
    (__pyx_v_self->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).push_back(__pyx_v_edge);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 178, __pyx_L1_error)
  }
 0179: 
+0180: 	cdef ItemNo _left(self, ItemNo itemidx_unused, Edge edge):
static ItemNo __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__left(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx_unused, Edge __pyx_v_edge) {
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_left", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0181: 		if edge.rule is NULL:
  __pyx_t_1 = ((__pyx_v_edge.rule == NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0182: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0183: 		return edge.pos.lidx
  __pyx_r = __pyx_v_edge.pos.lidx;
  goto __pyx_L0;
 0184: 
+0185: 	cdef ItemNo _right(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__right(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  FatChartItem __pyx_v_tmp;
  size_t __pyx_v_n;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_right", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0186: 		cdef FatChartItem tmp
 0187: 		cdef size_t n
+0188: 		if edge.rule is NULL or edge.rule.rhs2 == 0:
  __pyx_t_2 = ((__pyx_v_edge.rule == NULL) != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = ((__pyx_v_edge.rule->rhs2 == 0) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+0189: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+0190: 		tmp = self.items[edge.pos.lidx]
  __pyx_v_tmp = (__pyx_v_self->items[__pyx_v_edge.pos.lidx]);
+0191: 		tmp.label = edge.rule.rhs2
  __pyx_t_3 = __pyx_v_edge.rule->rhs2;
  __pyx_v_tmp.label = __pyx_t_3;
+0192: 		for n in range(SLOTS):
  for (__pyx_t_4 = 0; __pyx_t_4 < 2; __pyx_t_4+=1) {
    __pyx_v_n = __pyx_t_4;
+0193: 			tmp.vec[n] ^= self.items[itemidx].vec[n]
    __pyx_t_5 = __pyx_v_n;
    (__pyx_v_tmp.vec[__pyx_t_5]) = ((__pyx_v_tmp.vec[__pyx_t_5]) ^ ((__pyx_v_self->items[__pyx_v_itemidx]).vec[__pyx_v_n]));
  }
+0194: 		return self.itemindex[tmp]
  __pyx_r = (__pyx_v_self->itemindex[__pyx_v_tmp]);
  goto __pyx_L0;
 0195: 
+0196: 	cdef FatChartItem _root(self):
static FatChartItem __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__root(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self) {
  FatChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_root", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0197: 		return CFGtoFatChartItem(self.start, 0, self.lensent)
  __pyx_r = __pyx_f_8discodop_10containers_CFGtoFatChartItem(__pyx_v_self->__pyx_base.__pyx_base.start, 0, __pyx_v_self->__pyx_base.__pyx_base.lensent);
  goto __pyx_L0;
 0198: 
+0199: 	def root(self):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_13FatLCFRSChart_2root[] = "FatLCFRSChart.root(self)";
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root (wrapper)", 0);
  __pyx_r = __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_2root(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_2root(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self) {
  FatChartItem __pyx_v_tmp;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.root", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0200: 		cdef FatChartItem tmp = self._root()
  __pyx_v_tmp = __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__root(__pyx_v_self);
+0201: 		if self.itemindex.find(tmp) == self.itemindex.end():
  __pyx_t_1 = ((__pyx_v_self->itemindex.find(__pyx_v_tmp) == __pyx_v_self->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
  }
+0202: 			return 0
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_int_0);
    __pyx_r = __pyx_int_0;
    goto __pyx_L0;
+0203: 		return self.itemindex[tmp]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_uint32_t((__pyx_v_self->itemindex[__pyx_v_tmp])); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 203, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 0204: 
+0205: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_label(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0206: 		return self._label(itemidx)  # somehow needed
  __pyx_r = __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__label(__pyx_v_self, __pyx_v_itemidx);
  goto __pyx_L0;
 0207: 
+0208: 	cdef Label _label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__label(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0209: 		return self.items[itemidx].label
  __pyx_r = (__pyx_v_self->items[__pyx_v_itemidx]).label;
  goto __pyx_L0;
 0210: 
+0211: 	cdef ItemNo getitemidx(self, uint64_t n):
static ItemNo __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_getitemidx(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, uint64_t __pyx_v_n) {
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("getitemidx", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0212: 		"""Get itemidx of n'th item."""
+0213: 		return n
  __pyx_r = __pyx_v_n;
  goto __pyx_L0;
 0214: 
+0215: 	def indices(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_13FatLCFRSChart_4indices[] = "FatLCFRSChart.indices(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx) {
  ItemNo __pyx_v_itemidx;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("indices (wrapper)", 0);
  assert(__pyx_arg_itemidx); {
    __pyx_v_itemidx = __Pyx_PyInt_As_uint32_t(__pyx_arg_itemidx); if (unlikely((__pyx_v_itemidx == ((ItemNo)-1)) && PyErr_Occurred())) __PYX_ERR(0, 215, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_4indices(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_4indices(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  FatChartItem __pyx_v_item;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("indices", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0216: 		cdef FatChartItem item = self.items[itemidx]
  __pyx_v_item = (__pyx_v_self->items[__pyx_v_itemidx]);
+0217: 		return [n for n in range(len(self.sent)) if TESTBIT(item.vec, n)]
  __Pyx_XDECREF(__pyx_r);
  { /* enter inner scope */
    Py_ssize_t __pyx_8genexpr2__pyx_v_n;
    __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 217, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.sent;
    __Pyx_INCREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 217, __pyx_L1_error)
    }
    __pyx_t_3 = PyList_GET_SIZE(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 217, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
      __pyx_8genexpr2__pyx_v_n = __pyx_t_4;
      __pyx_t_5 = (TESTBIT(__pyx_v_item.vec, __pyx_8genexpr2__pyx_v_n) != 0);
      if (__pyx_t_5) {
        __pyx_t_2 = PyInt_FromSsize_t(__pyx_8genexpr2__pyx_v_n); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 217, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 217, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      }
    }
  } /* exit inner scope */
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 0218: 
+0219: 	def itemstr(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_13FatLCFRSChart_6itemstr[] = "FatLCFRSChart.itemstr(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx) {
  ItemNo __pyx_v_itemidx;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr (wrapper)", 0);
  assert(__pyx_arg_itemidx); {
    __pyx_v_itemidx = __Pyx_PyInt_As_uint32_t(__pyx_arg_itemidx); if (unlikely((__pyx_v_itemidx == ((ItemNo)-1)) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_6itemstr(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_6itemstr(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  int __pyx_v_n;
  PyObject *__pyx_v_result = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_result);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0220: 		cdef int n
+0221: 		cdef str result = ''
  __Pyx_INCREF(__pyx_kp_u__3);
  __pyx_v_result = __pyx_kp_u__3;
+0222: 		for n in range(SLOTS):
  for (__pyx_t_1 = 0; __pyx_t_1 < 2; __pyx_t_1+=1) {
    __pyx_v_n = __pyx_t_1;
+0223: 			result += bin(self.items[itemidx].vec[n])[2:].zfill(BITSIZE)[::-1]
    __pyx_t_3 = __Pyx_PyInt_From_uint64_t(((__pyx_v_self->items[__pyx_v_itemidx]).vec[__pyx_v_n])); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_bin, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_t_3, 2, 0, NULL, NULL, &__pyx_slice__4, 1, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zfill); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyInt_From_int(BITSIZE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GOTREF(__pyx_t_2);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4};
        __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_4};
        __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else
      #endif
      {
        __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 223, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
        __Pyx_GIVEREF(__pyx_t_4);
        PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4);
        __pyx_t_4 = 0;
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
/* … */
  __pyx_slice__4 = PySlice_New(__pyx_int_2, Py_None, Py_None); if (unlikely(!__pyx_slice__4)) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice__4);
  __Pyx_GIVEREF(__pyx_slice__4);
    __pyx_t_3 = PyObject_GetItem(__pyx_t_2, __pyx_slice__5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_result, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (!(likely(PyUnicode_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_DECREF_SET(__pyx_v_result, ((PyObject*)__pyx_t_2));
    __pyx_t_2 = 0;
  }
  __pyx_slice__5 = PySlice_New(Py_None, Py_None, __pyx_int_neg_1); if (unlikely(!__pyx_slice__5)) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice__5);
  __Pyx_GIVEREF(__pyx_slice__5);
+0224: 		result = result[:self.lensent]
  if (unlikely(__pyx_v_result == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
    __PYX_ERR(0, 224, __pyx_L1_error)
  }
  __pyx_t_2 = __Pyx_PyUnicode_Substring(__pyx_v_result, 0, __pyx_v_self->__pyx_base.__pyx_base.lensent); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 224, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF_SET(__pyx_v_result, ((PyObject*)__pyx_t_2));
  __pyx_t_2 = 0;
+0225: 		return '%s[%s]' % (self.grammar.tolabel[self._label(itemidx)],
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_7 = __pyx_f_8discodop_6plcfrs_13FatLCFRSChart__label(__pyx_v_self, __pyx_v_itemidx);
  __pyx_t_2 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->tolabel), __pyx_t_7, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 225, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
/* … */
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_INCREF(__pyx_v_result);
  __Pyx_GIVEREF(__pyx_v_result);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_result);
  __pyx_t_2 = 0;
/* … */
  __pyx_t_2 = PyUnicode_Format(__pyx_kp_u_s_s, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 225, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 0226: 				result)
 0227: 
+0228: 	def hasnode(self, node, Whitelist whitelist=None):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_9hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_13FatLCFRSChart_8hasnode[] = "FatLCFRSChart.hasnode(self, node, Whitelist whitelist=None)";
static PyObject *__pyx_pw_8discodop_6plcfrs_13FatLCFRSChart_9hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_node = 0;
  struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_node,&__pyx_n_s_whitelist,0};
    PyObject* values[2] = {0,0};
    values[1] = (PyObject *)((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_node)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_whitelist);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "hasnode") < 0)) __PYX_ERR(0, 228, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_node = values[0];
    __pyx_v_whitelist = ((struct __pyx_obj_8discodop_10containers_Whitelist *)values[1]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("hasnode", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 228, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_whitelist), __pyx_ptype_8discodop_10containers_Whitelist, 1, "whitelist", 0))) __PYX_ERR(0, 228, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_8hasnode(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_self), __pyx_v_node, __pyx_v_whitelist);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_13FatLCFRSChart_8hasnode(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, PyObject *__pyx_v_node, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  FatChartItem __pyx_v_tmp;
  uint64_t __pyx_v_n;
  PyObject *__pyx_v_label = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_label);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0229: 		cdef FatChartItem tmp
 0230: 		cdef uint64_t n
+0231: 		try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L8_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
    __pyx_L8_try_end:;
  }
+0232: 			label = self.grammar.toid[node.label]
      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_label); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 232, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PyObject_GetItem(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->toid), __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 232, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_label = __pyx_t_5;
      __pyx_t_5 = 0;
+0233: 		except KeyError:
    __pyx_t_6 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
    if (__pyx_t_6) {
      __Pyx_AddTraceback("discodop.plcfrs.FatLCFRSChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_5, &__pyx_t_4, &__pyx_t_7) < 0) __PYX_ERR(0, 233, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_7);
+0234: 			return False
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;
+0235: 		tmp = FatChartItem(label)
  __pyx_t_8 = __Pyx_PyInt_As_uint32_t(__pyx_v_label); if (unlikely((__pyx_t_8 == ((Label)-1)) && PyErr_Occurred())) __PYX_ERR(0, 235, __pyx_L1_error)
  __pyx_v_tmp = FatChartItem(__pyx_t_8);
+0236: 		for n in node.leaves():
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 236, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (__pyx_t_5) {
    __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 236, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    __pyx_t_7 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 236, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (likely(PyList_CheckExact(__pyx_t_7)) || PyTuple_CheckExact(__pyx_t_7)) {
    __pyx_t_4 = __pyx_t_7; __Pyx_INCREF(__pyx_t_4); __pyx_t_9 = 0;
    __pyx_t_10 = NULL;
  } else {
    __pyx_t_9 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 236, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_10 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 236, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  for (;;) {
    if (likely(!__pyx_t_10)) {
      if (likely(PyList_CheckExact(__pyx_t_4))) {
        if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_4)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_7 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 236, __pyx_L1_error)
        #else
        __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 236, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        #endif
      } else {
        if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_7 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_9); __Pyx_INCREF(__pyx_t_7); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 236, __pyx_L1_error)
        #else
        __pyx_t_7 = PySequence_ITEM(__pyx_t_4, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 236, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        #endif
      }
    } else {
      __pyx_t_7 = __pyx_t_10(__pyx_t_4);
      if (unlikely(!__pyx_t_7)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 236, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_7);
    }
    __pyx_t_11 = __Pyx_PyInt_As_uint64_t(__pyx_t_7); if (unlikely((__pyx_t_11 == ((uint64_t)-1)) && PyErr_Occurred())) __PYX_ERR(0, 236, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_n = __pyx_t_11;
/* … */
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0237: 			if n >= SLOTS * sizeof(unsigned long) * 8:
    __pyx_t_12 = ((__pyx_v_n >= ((2 * (sizeof(unsigned long))) * 8)) != 0);
    if (__pyx_t_12) {
/* … */
    }
+0238: 				return False
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L0;
+0239: 			SETBIT(tmp.vec, n)
    SETBIT(__pyx_v_tmp.vec, __pyx_v_n);
+0240: 		if whitelist is not None:
  __pyx_t_12 = (((PyObject *)__pyx_v_whitelist) != Py_None);
  __pyx_t_13 = (__pyx_t_12 != 0);
  if (__pyx_t_13) {
/* … */
  }
+0241: 			tmp.label = whitelist.mapping[label]
    __pyx_t_9 = __Pyx_PyIndex_AsSsize_t(__pyx_v_label); if (unlikely((__pyx_t_9 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 241, __pyx_L1_error)
    __pyx_v_tmp.label = (__pyx_v_whitelist->mapping[__pyx_t_9]);
+0242: 			return whitelist.fat[tmp.label].count(tmp) != 0
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyBool_FromLong(((__pyx_v_whitelist->fat[__pyx_v_tmp.label]).count(__pyx_v_tmp) != 0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
+0243: 		return self.itemindex[tmp] != 0
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = __Pyx_PyBool_FromLong(((__pyx_v_self->itemindex[__pyx_v_tmp]) != 0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 0244: 
+0245: 	cdef SmallChartItem asSmallChartItem(self, ItemNo itemidx):
static SmallChartItem __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_asSmallChartItem(CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx) {
  SmallChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asSmallChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.FatLCFRSChart.asSmallChartItem", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __Pyx_pretend_to_initialize(&__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0246: 		raise ValueError
  __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0);
  __PYX_ERR(0, 246, __pyx_L1_error)
 0247: 
+0248: 	cdef FatChartItem asFatChartItem(self, ItemNo itemidx):
static FatChartItem __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_asFatChartItem(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  FatChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asFatChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0249: 		return self.items[itemidx]
  __pyx_r = (__pyx_v_self->items[__pyx_v_itemidx]);
  goto __pyx_L0;
 0250: 
+0251: 	cdef size_t asCFGspan(self, ItemNo itemidx):
static size_t __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_asCFGspan(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  FatChartItem __pyx_v_fitem;
  int __pyx_v_start;
  int __pyx_v_end;
  size_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asCFGspan", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.plcfrs.FatLCFRSChart.asCFGspan", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+0252: 		cdef FatChartItem fitem = self.items[itemidx]
  __pyx_v_fitem = (__pyx_v_self->items[__pyx_v_itemidx]);
+0253: 		cdef int start = anextset(fitem.vec, 0, SLOTS)
  __pyx_v_start = __pyx_f_8discodop_3bit_anextset(__pyx_v_fitem.vec, 0, 2);
+0254: 		cdef int end = anextunset(fitem.vec, start, SLOTS)
  __pyx_v_end = __pyx_f_8discodop_3bit_anextunset(__pyx_v_fitem.vec, __pyx_v_start, 2);
+0255: 		assert anextset(fitem.vec, end, SLOTS) == -1
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((__pyx_f_8discodop_3bit_anextset(__pyx_v_fitem.vec, __pyx_v_end, 2) == -1L) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 255, __pyx_L1_error)
    }
  }
  #endif
+0256: 		assert 0 <= start < end <= self.lensent
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_1 = (0 <= __pyx_v_start);
    if (__pyx_t_1) {
      __pyx_t_1 = (__pyx_v_start < __pyx_v_end);
      if (__pyx_t_1) {
        __pyx_t_1 = (__pyx_v_end <= __pyx_v_self->__pyx_base.__pyx_base.lensent);
      }
    }
    if (unlikely(!(__pyx_t_1 != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 256, __pyx_L1_error)
    }
  }
  #endif
+0257: 		return compactcellidx(start, end, self.lensent, 1)
  __pyx_r = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_start, __pyx_v_end, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1);
  goto __pyx_L0;
 0258: 
 0259: 
+0260: def parse(sent, Grammar grammar, tags=None, bint exhaustive=True,
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_1parse(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_parse[] = "parse(sent, Grammar grammar, tags=None, bool exhaustive=True, start=None, Whitelist whitelist=None, bool splitprune=False, bool markorigin=False, estimates=None, Prob beam_beta=0.0, int beam_delta=50, itemsestimate=None)\nParse sentence and produce a chart.\n\n\t:param sent: A sequence of tokens that will be parsed.\n\t:param grammar: A ``Grammar`` object.\n\t:returns: a tuple (chart, msg); a ``Chart`` object and status message.\n\t:param tags: Optionally, a sequence of POS tags to use instead of\n\t\tattempting to apply all possible POS tags.\n\t:param exhaustive: don't stop at viterbi parse, return a full chart\n\t:param start: integer corresponding to the start symbol that complete\n\t\tderivations should be headed by; e.g., ``grammar.toid['ROOT']``.\n\t\tIf not given, the default specified by ``grammar`` is used.\n\t:param whitelist: a whitelist of allowed ChartItems. Anything else is not\n\t\tadded to the agenda.\n\t:param splitprune: coarse stage used a split-PCFG where discontinuous node\n\t\tappear as multiple CFG nodes. Every discontinuous node will result\n\t\tin multiple lookups into whitelist to see whether it should be\n\t\tallowed on the agenda.\n\t:param markorigin: in combination with splitprune, coarse labels include an\n\t\tinteger to distinguish components; e.g., CFG nodes NP*0 and NP*1\n\t\tmap to the discontinuous node NP_2\n\t:param estimates: use context-summary estimates (heuristics, figures of\n\t\tmerit) to order agenda. should be a tuple with the kind of\n\t\testimates ('SX' or 'SXlrgaps'), and the estimates themselves in a\n\t\t4-dimensional numpy matrix. If estimates are not consistent, it is\n\t\tno longer guaranteed that the optimal parse will be found.\n\t\texperimental.\n\t:param beam_beta: keep track of the best score in each cell and only allow\n\t\titems which are within a multiple of ``beam_beta`` of the best score.\n\t\tShould be a negative log probability. Pass ``0.0`` to disable.\n\t:param beam_delta: the maximum span length t""o which beam search is applied.\n\t:param itemsestimate: the number of chart items to pre-allocate.\n\t";
static PyMethodDef __pyx_mdef_8discodop_6plcfrs_1parse = {"parse", (PyCFunction)__pyx_pw_8discodop_6plcfrs_1parse, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8discodop_6plcfrs_parse};
static PyObject *__pyx_pw_8discodop_6plcfrs_1parse(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_sent = 0;
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  PyObject *__pyx_v_tags = 0;
  int __pyx_v_exhaustive;
  PyObject *__pyx_v_start = 0;
  struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist = 0;
  int __pyx_v_splitprune;
  int __pyx_v_markorigin;
  PyObject *__pyx_v_estimates = 0;
  Prob __pyx_v_beam_beta;
  int __pyx_v_beam_delta;
  PyObject *__pyx_v_itemsestimate = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("parse (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_sent,&__pyx_n_s_grammar,&__pyx_n_s_tags,&__pyx_n_s_exhaustive,&__pyx_n_s_start,&__pyx_n_s_whitelist,&__pyx_n_s_splitprune,&__pyx_n_s_markorigin,&__pyx_n_s_estimates,&__pyx_n_s_beam_beta,&__pyx_n_s_beam_delta,&__pyx_n_s_itemsestimate,0};
    PyObject* values[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
    values[2] = ((PyObject *)Py_None);
/* … */
      __pyx_v_exhaustive = ((int)1);
    }
    __pyx_v_start = values[4];
    __pyx_v_whitelist = ((struct __pyx_obj_8discodop_10containers_Whitelist *)values[5]);
    if (values[6]) {
      __pyx_v_splitprune = __Pyx_PyObject_IsTrue(values[6]); if (unlikely((__pyx_v_splitprune == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 261, __pyx_L3_error)
    } else {
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_parse(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_tags, int __pyx_v_exhaustive, PyObject *__pyx_v_start, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin, PyObject *__pyx_v_estimates, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta, PyObject *__pyx_v_itemsestimate) {
  struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *__pyx_v_chart = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("parse", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("discodop.plcfrs.parse", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_chart);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__65 = PyTuple_Pack(13, __pyx_n_s_sent, __pyx_n_s_grammar, __pyx_n_s_tags, __pyx_n_s_exhaustive, __pyx_n_s_start, __pyx_n_s_whitelist, __pyx_n_s_splitprune, __pyx_n_s_markorigin, __pyx_n_s_estimates, __pyx_n_s_beam_beta, __pyx_n_s_beam_delta, __pyx_n_s_itemsestimate, __pyx_n_s_chart); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__65);
  __Pyx_GIVEREF(__pyx_tuple__65);
/* … */
  __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_8discodop_6plcfrs_1parse, NULL, __pyx_n_s_discodop_plcfrs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_parse, __pyx_t_4) < 0) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__66 = (PyObject*)__Pyx_PyCode_New(12, 0, 13, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__65, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_discodop_plcfrs_pyx, __pyx_n_s_parse, 260, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__66)) __PYX_ERR(0, 260, __pyx_L1_error)
+0261: 		start=None, Whitelist whitelist=None, bint splitprune=False,
    values[4] = ((PyObject *)Py_None);
    values[5] = (PyObject *)((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None);
/* … */
      __pyx_v_splitprune = ((int)0);
    }
    if (values[7]) {
      __pyx_v_markorigin = __Pyx_PyObject_IsTrue(values[7]); if (unlikely((__pyx_v_markorigin == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 262, __pyx_L3_error)
    } else {
+0262: 		bint markorigin=False, estimates=None,
    values[8] = ((PyObject *)Py_None);
/* … */
      __pyx_v_markorigin = ((int)0);
    }
    __pyx_v_estimates = values[8];
    if (values[9]) {
      __pyx_v_beam_beta = __pyx_PyFloat_AsDouble(values[9]); if (unlikely((__pyx_v_beam_beta == ((Prob)-1)) && PyErr_Occurred())) __PYX_ERR(0, 263, __pyx_L3_error)
    } else {
      __pyx_v_beam_beta = ((Prob)0.0);
    }
    if (values[10]) {
      __pyx_v_beam_delta = __Pyx_PyInt_As_int(values[10]); if (unlikely((__pyx_v_beam_delta == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 263, __pyx_L3_error)
    } else {
      __pyx_v_beam_delta = ((int)50);
    }
    __pyx_v_itemsestimate = values[11];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("parse", 0, 2, 12, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 260, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.parse", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_grammar), __pyx_ptype_8discodop_10containers_Grammar, 1, "grammar", 0))) __PYX_ERR(0, 260, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_whitelist), __pyx_ptype_8discodop_10containers_Whitelist, 1, "whitelist", 0))) __PYX_ERR(0, 261, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_6plcfrs_parse(__pyx_self, __pyx_v_sent, __pyx_v_grammar, __pyx_v_tags, __pyx_v_exhaustive, __pyx_v_start, __pyx_v_whitelist, __pyx_v_splitprune, __pyx_v_markorigin, __pyx_v_estimates, __pyx_v_beam_beta, __pyx_v_beam_delta, __pyx_v_itemsestimate);
+0263: 		Prob beam_beta=0.0, int beam_delta=50, itemsestimate=None):
    values[11] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sent)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grammar)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("parse", 0, 2, 12, 1); __PYX_ERR(0, 260, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_tags);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_exhaustive);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_start);
          if (value) { values[4] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_whitelist);
          if (value) { values[5] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_splitprune);
          if (value) { values[6] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_markorigin);
          if (value) { values[7] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  8:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_estimates);
          if (value) { values[8] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  9:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_beam_beta);
          if (value) { values[9] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 10:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_beam_delta);
          if (value) { values[10] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case 11:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_itemsestimate);
          if (value) { values[11] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "parse") < 0)) __PYX_ERR(0, 260, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11);
        CYTHON_FALLTHROUGH;
        case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10);
        CYTHON_FALLTHROUGH;
        case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9);
        CYTHON_FALLTHROUGH;
        case  9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8);
        CYTHON_FALLTHROUGH;
        case  8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7);
        CYTHON_FALLTHROUGH;
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_sent = values[0];
    __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)values[1]);
    __pyx_v_tags = values[2];
    if (values[3]) {
      __pyx_v_exhaustive = __Pyx_PyObject_IsTrue(values[3]); if (unlikely((__pyx_v_exhaustive == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 260, __pyx_L3_error)
    } else {
 0264: 	"""Parse sentence and produce a chart.
 0265: 
 0266: 	:param sent: A sequence of tokens that will be parsed.
 0267: 	:param grammar: A ``Grammar`` object.
 0268: 	:returns: a tuple (chart, msg); a ``Chart`` object and status message.
 0269: 	:param tags: Optionally, a sequence of POS tags to use instead of
 0270: 		attempting to apply all possible POS tags.
 0271: 	:param exhaustive: don't stop at viterbi parse, return a full chart
 0272: 	:param start: integer corresponding to the start symbol that complete
 0273: 		derivations should be headed by; e.g., ``grammar.toid['ROOT']``.
 0274: 		If not given, the default specified by ``grammar`` is used.
 0275: 	:param whitelist: a whitelist of allowed ChartItems. Anything else is not
 0276: 		added to the agenda.
 0277: 	:param splitprune: coarse stage used a split-PCFG where discontinuous node
 0278: 		appear as multiple CFG nodes. Every discontinuous node will result
 0279: 		in multiple lookups into whitelist to see whether it should be
 0280: 		allowed on the agenda.
 0281: 	:param markorigin: in combination with splitprune, coarse labels include an
 0282: 		integer to distinguish components; e.g., CFG nodes NP*0 and NP*1
 0283: 		map to the discontinuous node NP_2
 0284: 	:param estimates: use context-summary estimates (heuristics, figures of
 0285: 		merit) to order agenda. should be a tuple with the kind of
 0286: 		estimates ('SX' or 'SXlrgaps'), and the estimates themselves in a
 0287: 		4-dimensional numpy matrix. If estimates are not consistent, it is
 0288: 		no longer guaranteed that the optimal parse will be found.
 0289: 		experimental.
 0290: 	:param beam_beta: keep track of the best score in each cell and only allow
 0291: 		items which are within a multiple of ``beam_beta`` of the best score.
 0292: 		Should be a negative log probability. Pass ``0.0`` to disable.
 0293: 	:param beam_delta: the maximum span length to which beam search is applied.
 0294: 	:param itemsestimate: the number of chart items to pre-allocate.
 0295: 	"""
+0296: 	if <unsigned>len(sent) < sizeof(COMPONENT.vec) * 8:
  __pyx_t_1 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 296, __pyx_L1_error)
  __pyx_t_2 = ((((unsigned int)__pyx_t_1) < ((sizeof(__pyx_v_8discodop_6plcfrs_COMPONENT.vec)) * 8)) != 0);
  if (__pyx_t_2) {
/* … */
  }
+0297: 		chart = SmallLCFRSChart(grammar, list(sent), start,
    __pyx_t_3 = PySequence_List(__pyx_v_sent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_grammar));
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
    __Pyx_INCREF(__pyx_v_start);
    __Pyx_GIVEREF(__pyx_v_start);
    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_start);
    __pyx_t_3 = 0;
/* … */
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_8discodop_6plcfrs_SmallLCFRSChart), __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_chart = ((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_t_5);
    __pyx_t_5 = 0;
+0298: 			itemsestimate=itemsestimate)
    __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 298, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_itemsestimate, __pyx_v_itemsestimate) < 0) __PYX_ERR(0, 298, __pyx_L1_error)
+0299: 		return parse_main[SmallLCFRSChart, SmallChartItem](
    __Pyx_XDECREF(__pyx_r);
/* … */
    __pyx_t_5 = __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_parse_main(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_chart), ((SmallChartItem)__pyx_f_8discodop_6plcfrs_15SmallLCFRSChart__root(((struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_chart))), __pyx_v_sent, __pyx_v_grammar, __pyx_v_tags, __pyx_v_exhaustive, __pyx_v_whitelist, __pyx_v_splitprune, __pyx_v_markorigin, __pyx_v_estimates, __pyx_v_beam_beta, __pyx_v_beam_delta); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 299, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
 0300: 				<SmallLCFRSChart>chart,
 0301: 				<SmallChartItem>(<SmallLCFRSChart>chart)._root(),
 0302: 				sent, grammar, tags, exhaustive, whitelist,
 0303: 				splitprune, markorigin, estimates, beam_beta, beam_delta)
+0304: 	chart = FatLCFRSChart(grammar, list(sent), start,
  __pyx_t_5 = PySequence_List(__pyx_v_sent); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_5);
  __Pyx_INCREF(__pyx_v_start);
  __Pyx_GIVEREF(__pyx_v_start);
  PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_start);
  __pyx_t_5 = 0;
/* … */
  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_8discodop_6plcfrs_FatLCFRSChart), __pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_chart = ((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_t_4);
  __pyx_t_4 = 0;
+0305: 			itemsestimate=itemsestimate)
  __pyx_t_5 = PyDict_New(); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 305, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_itemsestimate, __pyx_v_itemsestimate) < 0) __PYX_ERR(0, 305, __pyx_L1_error)
+0306: 	return parse_main[FatLCFRSChart, FatChartItem](
  __Pyx_XDECREF(__pyx_r);
/* … */
  __pyx_t_4 = __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_parse_main(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_chart), ((FatChartItem)__pyx_f_8discodop_6plcfrs_13FatLCFRSChart__root(((struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_chart))), __pyx_v_sent, __pyx_v_grammar, __pyx_v_tags, __pyx_v_exhaustive, __pyx_v_whitelist, __pyx_v_splitprune, __pyx_v_markorigin, __pyx_v_estimates, __pyx_v_beam_beta, __pyx_v_beam_delta); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 0307: 			<FatLCFRSChart>chart, <FatChartItem>(<FatLCFRSChart>chart)._root(),
 0308: 			sent, grammar, tags, exhaustive, whitelist,
 0309: 			splitprune, markorigin, estimates, beam_beta, beam_delta)
 0310: 
 0311: 
+0312: cdef parse_main(LCFRSChart_fused chart, LCFRSItem_fused goal, sent,
static PyObject *__pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_parse_main(struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_chart, SmallChartItem __pyx_v_goal, PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_tags, int __pyx_v_exhaustive, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin, PyObject *__pyx_v_estimates, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta) {
  Agenda<ItemNo,std::pair<Prob,Prob> >  __pyx_v_agenda;
  std::pair<ItemNo,std::pair<Prob,Prob> >  __pyx_v_entry;
  std::vector<ItemNo>  __pyx_v_sibvec;
  ProbRule *__pyx_v_rule;
  SmallChartItem __pyx_v_item;
  SmallChartItem __pyx_v_sib;
  SmallChartItem __pyx_v_newitem;
  SmallChartItem __pyx_v_tmpitem;
  __Pyx_memviewslice __pyx_v_outside = { 0, 0, { 0 }, { 0 }, { 0 } };
  Prob __pyx_v_siblingprob;
  Prob __pyx_v_score;
  Prob __pyx_v_prob;
  Prob __pyx_v_newprob;
  short __pyx_v_lensent;
  short __pyx_v_estimatetype;
  int __pyx_v_length;
  int __pyx_v_left;
  int __pyx_v_right;
  int __pyx_v_gaps;
  ItemNo __pyx_v_itemidx;
  ItemNo __pyx_v_sibidx;
  size_t __pyx_v_blocked;
  size_t __pyx_v_maxA;
  size_t __pyx_v_n;
  PyObject *__pyx_v_estimatetypestr = NULL;
  PyObject *__pyx_v_covered = NULL;
  PyObject *__pyx_v_msg = NULL;
  SmallChartItemBtreeMap<ItemNo> ::iterator __pyx_v_itemidxit;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0parse_main", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_43);
  __Pyx_AddTraceback("discodop.plcfrs.parse_main", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
  __Pyx_XDECREF(__pyx_v_estimatetypestr);
  __Pyx_XDECREF(__pyx_v_covered);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_parse_main(struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_chart, FatChartItem __pyx_v_goal, PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_tags, int __pyx_v_exhaustive, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin, PyObject *__pyx_v_estimates, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta) {
  Agenda<ItemNo,std::pair<Prob,Prob> >  __pyx_v_agenda;
  std::pair<ItemNo,std::pair<Prob,Prob> >  __pyx_v_entry;
  std::vector<ItemNo>  __pyx_v_sibvec;
  ProbRule *__pyx_v_rule;
  FatChartItem __pyx_v_item;
  FatChartItem __pyx_v_sib;
  FatChartItem __pyx_v_newitem;
  FatChartItem __pyx_v_tmpitem;
  __Pyx_memviewslice __pyx_v_outside = { 0, 0, { 0 }, { 0 }, { 0 } };
  Prob __pyx_v_siblingprob;
  Prob __pyx_v_score;
  Prob __pyx_v_prob;
  Prob __pyx_v_newprob;
  short __pyx_v_lensent;
  short __pyx_v_estimatetype;
  int __pyx_v_length;
  int __pyx_v_left;
  int __pyx_v_right;
  int __pyx_v_gaps;
  ItemNo __pyx_v_itemidx;
  ItemNo __pyx_v_sibidx;
  size_t __pyx_v_blocked;
  size_t __pyx_v_maxA;
  size_t __pyx_v_n;
  PyObject *__pyx_v_estimatetypestr = NULL;
  PyObject *__pyx_v_covered = NULL;
  PyObject *__pyx_v_msg = NULL;
  FatChartItemBtreeMap<ItemNo> ::iterator __pyx_v_itemidxit;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1parse_main", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_42);
  __Pyx_AddTraceback("discodop.plcfrs.parse_main", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
  __Pyx_XDECREF(__pyx_v_estimatetypestr);
  __Pyx_XDECREF(__pyx_v_covered);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0313: 		Grammar grammar, tags, bint exhaustive, Whitelist whitelist,
 0314: 		bint splitprune, bint markorigin, estimates,
 0315: 		Prob beam_beta, int beam_delta):
 0316: 	cdef:
 0317: 		Agenda[ItemNo, pair[Prob, Prob]] agenda  # prioritized items to explore
 0318: 		pair[ItemNo, pair[Prob, Prob]] entry
 0319: 		vector[ItemNo] sibvec
 0320: 		ProbRule *rule
 0321: 		LCFRSItem_fused item, sib, newitem, tmpitem
+0322: 		double [:, :, :, :] outside = None  # outside estimates, if provided
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(Py_None);
  if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 322, __pyx_L1_error)
  __pyx_v_outside = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
/* … */
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(Py_None);
  if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 322, __pyx_L1_error)
  __pyx_v_outside = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
 0323: 		Prob siblingprob, score, prob, newprob
+0324: 		short lensent = len(sent), estimatetype = 0
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 324, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
  __pyx_v_estimatetype = 0;
/* … */
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 324, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
  __pyx_v_estimatetype = 0;
+0325: 		int length = 1, left = 0, right = 0, gaps = 0
  __pyx_v_length = 1;
  __pyx_v_left = 0;
  __pyx_v_right = 0;
  __pyx_v_gaps = 0;
/* … */
  __pyx_v_length = 1;
  __pyx_v_left = 0;
  __pyx_v_right = 0;
  __pyx_v_gaps = 0;
 0326: 		ItemNo itemidx, sibidx
+0327: 		size_t blocked = 0, maxA = 0, n
  __pyx_v_blocked = 0;
  __pyx_v_maxA = 0;
/* … */
  __pyx_v_blocked = 0;
  __pyx_v_maxA = 0;
 0328: 	# avoid generating code for spurious fused type combinations
 0329: 	if ((LCFRSItem_fused is SmallChartItem
 0330: 			and LCFRSChart_fused is FatLCFRSChart)
 0331: 			or (LCFRSItem_fused is FatChartItem
 0332: 			and LCFRSChart_fused is SmallLCFRSChart)):
 0333: 		return
+0334: 	if estimates is not None:
  __pyx_t_3 = (__pyx_v_estimates != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
/* … */
  }
/* … */
  __pyx_t_3 = (__pyx_v_estimates != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
/* … */
  }
+0335: 		estimatetypestr, outside = estimates
    if ((likely(PyTuple_CheckExact(__pyx_v_estimates))) || (PyList_CheckExact(__pyx_v_estimates))) {
      PyObject* sequence = __pyx_v_estimates;
      #if !CYTHON_COMPILING_IN_PYPY
      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_ERR(0, 335, __pyx_L1_error)
      }
      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __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_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      #endif
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_v_estimates); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __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_L4_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_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 335, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 335, __pyx_L1_error)
      __pyx_L5_unpacking_done:;
    }
    __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(__pyx_t_6);
    if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 335, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_estimatetypestr = __pyx_t_5;
    __pyx_t_5 = 0;
    __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
    __pyx_v_outside = __pyx_t_1;
    __pyx_t_1.memview = NULL;
    __pyx_t_1.data = NULL;
/* … */
    if ((likely(PyTuple_CheckExact(__pyx_v_estimates))) || (PyList_CheckExact(__pyx_v_estimates))) {
      PyObject* sequence = __pyx_v_estimates;
      #if !CYTHON_COMPILING_IN_PYPY
      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_ERR(0, 335, __pyx_L1_error)
      }
      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __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_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      #endif
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_v_estimates); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 335, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __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_L4_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_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 335, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 335, __pyx_L1_error)
      __pyx_L5_unpacking_done:;
    }
    __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(__pyx_t_6);
    if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 335, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_estimatetypestr = __pyx_t_5;
    __pyx_t_5 = 0;
    __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
    __pyx_v_outside = __pyx_t_1;
    __pyx_t_1.memview = NULL;
    __pyx_t_1.data = NULL;
+0336: 		estimatetype = {'SX': SX, 'SXlrgaps': SXlrgaps}[estimatetypestr]
    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SX, __pyx_int_1) < 0) __PYX_ERR(0, 336, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SXlrgaps, __pyx_int_2) < 0) __PYX_ERR(0, 336, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyDict_GetItem(__pyx_t_6, __pyx_v_estimatetypestr); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_9 = __Pyx_PyInt_As_short(__pyx_t_5); if (unlikely((__pyx_t_9 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_estimatetype = __pyx_t_9;
/* … */
    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SX, __pyx_int_1) < 0) __PYX_ERR(0, 336, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SXlrgaps, __pyx_int_2) < 0) __PYX_ERR(0, 336, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyDict_GetItem(__pyx_t_6, __pyx_v_estimatetypestr); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_9 = __Pyx_PyInt_As_short(__pyx_t_5); if (unlikely((__pyx_t_9 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 336, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_estimatetype = __pyx_t_9;
 0337: 	if LCFRSItem_fused is SmallChartItem:
+0338: 		newitem = SmallChartItem(0, 0)
  __pyx_v_newitem = SmallChartItem(0, 0);
+0339: 		tmpitem = SmallChartItem(0, 0)
  __pyx_v_tmpitem = SmallChartItem(0, 0);
 0340: 	elif LCFRSItem_fused is FatChartItem:
+0341: 		newitem = FatChartItem(0)
  __pyx_v_newitem = FatChartItem(0);
+0342: 		tmpitem = FatChartItem(0)
  __pyx_v_tmpitem = FatChartItem(0);
 0343: 
 0344: 	# assign POS tags
+0345: 	covered, msg = populatepos[LCFRSChart_fused, LCFRSItem_fused](
  __pyx_t_5 = __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_populatepos(__pyx_v_grammar, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_newitem, __pyx_v_sent, __pyx_v_tags, __pyx_v_whitelist, __pyx_v_estimates); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if !CYTHON_COMPILING_IN_PYPY
    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_ERR(0, 345, __pyx_L1_error)
    }
    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    #else
    __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_10 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_8 = Py_TYPE(__pyx_t_10)->tp_iternext;
    index = 0; __pyx_t_6 = __pyx_t_8(__pyx_t_10); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    index = 1; __pyx_t_7 = __pyx_t_8(__pyx_t_10); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_10), 2) < 0) __PYX_ERR(0, 345, __pyx_L1_error)
    __pyx_t_8 = NULL;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    goto __pyx_L7_unpacking_done;
    __pyx_L6_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_8 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 345, __pyx_L1_error)
    __pyx_L7_unpacking_done:;
  }
  __pyx_v_covered = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_msg = __pyx_t_7;
  __pyx_t_7 = 0;
/* … */
  __pyx_t_5 = __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_populatepos(__pyx_v_grammar, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_newitem, __pyx_v_sent, __pyx_v_tags, __pyx_v_whitelist, __pyx_v_estimates); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
    PyObject* sequence = __pyx_t_5;
    #if !CYTHON_COMPILING_IN_PYPY
    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_ERR(0, 345, __pyx_L1_error)
    }
    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    #else
    __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    #endif
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_10 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_8 = Py_TYPE(__pyx_t_10)->tp_iternext;
    index = 0; __pyx_t_6 = __pyx_t_8(__pyx_t_10); if (unlikely(!__pyx_t_6)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    index = 1; __pyx_t_7 = __pyx_t_8(__pyx_t_10); if (unlikely(!__pyx_t_7)) goto __pyx_L6_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_7);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_10), 2) < 0) __PYX_ERR(0, 345, __pyx_L1_error)
    __pyx_t_8 = NULL;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    goto __pyx_L7_unpacking_done;
    __pyx_L6_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_8 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 345, __pyx_L1_error)
    __pyx_L7_unpacking_done:;
  }
  __pyx_v_covered = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_msg = __pyx_t_7;
  __pyx_t_7 = 0;
 0346: 			grammar, agenda, chart, newitem,
 0347: 			sent, tags, whitelist, estimates)
+0348: 	if not covered:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_covered); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 348, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  if (__pyx_t_3) {
/* … */
  }
/* … */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_covered); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 348, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_4) != 0);
  if (__pyx_t_3) {
/* … */
  }
+0349: 		return chart, msg
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 349, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_INCREF(__pyx_v_msg);
    __Pyx_GIVEREF(__pyx_v_msg);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_msg);
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 349, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_INCREF(__pyx_v_msg);
    __Pyx_GIVEREF(__pyx_v_msg);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_msg);
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
+0350: 	assert not agenda.empty()
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((!(__pyx_v_agenda.empty() != 0)) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 350, __pyx_L1_error)
    }
  }
  #endif
/* … */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((!(__pyx_v_agenda.empty() != 0)) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 350, __pyx_L1_error)
    }
  }
  #endif
 0351: 
+0352: 	while not agenda.empty():  # main parsing loop
  while (1) {
    __pyx_t_3 = ((!(__pyx_v_agenda.empty() != 0)) != 0);
    if (!__pyx_t_3) break;
/* … */
  while (1) {
    __pyx_t_3 = ((!(__pyx_v_agenda.empty() != 0)) != 0);
    if (!__pyx_t_3) break;
+0353: 		entry = agenda.pop()
    __pyx_v_entry = __pyx_v_agenda.pop();
/* … */
    __pyx_v_entry = __pyx_v_agenda.pop();
+0354: 		itemidx = entry.first
    __pyx_t_11 = __pyx_v_entry.first;
    __pyx_v_itemidx = __pyx_t_11;
/* … */
    __pyx_t_11 = __pyx_v_entry.first;
    __pyx_v_itemidx = __pyx_t_11;
+0355: 		prob = entry.second.second
    __pyx_t_12 = __pyx_v_entry.second.second;
    __pyx_v_prob = __pyx_t_12;
/* … */
    __pyx_t_12 = __pyx_v_entry.second.second;
    __pyx_v_prob = __pyx_t_12;
+0356: 		item = chart.items[itemidx]
    __pyx_v_item = (__pyx_v_chart->items[__pyx_v_itemidx]);
/* … */
    __pyx_v_item = (__pyx_v_chart->items[__pyx_v_itemidx]);
 0357: 		# store viterbi probability; cannot do this when this item is added to
 0358: 		# the agenda because that would give rise to duplicate edges.
+0359: 		chart.updateprob(itemidx, prob)
    ((struct __pyx_vtabstruct_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.updateprob(((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_v_chart), __pyx_v_itemidx, __pyx_v_prob);
/* … */
    ((struct __pyx_vtabstruct_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.updateprob(((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_v_chart), __pyx_v_itemidx, __pyx_v_prob);
+0360: 		if item == goal:
    __pyx_t_3 = ((__pyx_v_item == __pyx_v_goal) != 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L11;
    }
/* … */
    __pyx_t_3 = ((__pyx_v_item == __pyx_v_goal) != 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L11;
    }
+0361: 			if not exhaustive:
      __pyx_t_3 = ((!(__pyx_v_exhaustive != 0)) != 0);
      if (__pyx_t_3) {
/* … */
      }
/* … */
      __pyx_t_3 = ((!(__pyx_v_exhaustive != 0)) != 0);
      if (__pyx_t_3) {
/* … */
      }
+0362: 				break
        goto __pyx_L10_break;
/* … */
        goto __pyx_L10_break;
 0363: 		else:
 0364: 			# unary
+0365: 			if LCFRSItem_fused is SmallChartItem:
    /*else*/ {
/* … */
    /*else*/ {
+0366: 				length = bitcount(item.vec)
      __pyx_v_length = __pyx_f_8discodop_3bit_bitcount(__pyx_v_item.vec, 0);
+0367: 				newitem.vec = item.vec
      __pyx_t_13 = __pyx_v_item.vec;
      __pyx_v_newitem.vec = __pyx_t_13;
 0368: 			elif LCFRSItem_fused is FatChartItem:
+0369: 				length = abitcount(item.vec, SLOTS)
      __pyx_v_length = __pyx_f_8discodop_3bit_abitcount(__pyx_v_item.vec, 2);
+0370: 				memcpy(<void *>newitem.vec, <void *>item.vec,
      memcpy(((void *)__pyx_v_newitem.vec), ((void *)__pyx_v_item.vec), (2 * (sizeof(uint64_t))));
 0371: 						SLOTS * sizeof(uint64_t))
+0372: 			if estimates is not None:
      __pyx_t_3 = (__pyx_v_estimates != Py_None);
      __pyx_t_4 = (__pyx_t_3 != 0);
      if (__pyx_t_4) {
/* … */
      }
/* … */
      __pyx_t_3 = (__pyx_v_estimates != Py_None);
      __pyx_t_4 = (__pyx_t_3 != 0);
      if (__pyx_t_4) {
/* … */
      }
 0373: 				if LCFRSItem_fused is SmallChartItem:
+0374: 					left = nextset(item.vec, 0)
        __pyx_v_left = __pyx_f_8discodop_3bit_nextset(__pyx_v_item.vec, 0);
+0375: 					gaps = bitlength(item.vec) - length - left
        __pyx_v_gaps = ((__pyx_f_8discodop_3bit_bitlength(__pyx_v_item.vec) - __pyx_v_length) - __pyx_v_left);
+0376: 					right = lensent - length - left - gaps
        __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
 0377: 				elif LCFRSItem_fused is FatChartItem:
+0378: 					left = anextset(item.vec, 0, SLOTS)
        __pyx_v_left = __pyx_f_8discodop_3bit_anextset(__pyx_v_item.vec, 0, 2);
+0379: 					gaps = abitlength(item.vec, SLOTS) - length - left
        __pyx_v_gaps = ((__pyx_f_8discodop_3bit_abitlength(__pyx_v_item.vec, 2) - __pyx_v_length) - __pyx_v_left);
+0380: 					right = lensent - length - left - gaps
        __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
+0381: 			for n in range(grammar.numunary):
      __pyx_t_14 = __pyx_v_grammar->numunary;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_n = __pyx_t_15;
/* … */
      __pyx_t_13 = __pyx_v_grammar->numunary;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_n = __pyx_t_14;
+0382: 				rule = &(grammar.unary[item.label][n])
        __pyx_v_rule = (&((__pyx_v_grammar->unary[__pyx_v_item.label])[__pyx_v_n]));
/* … */
        __pyx_v_rule = (&((__pyx_v_grammar->unary[__pyx_v_item.label])[__pyx_v_n]));
+0383: 				if rule.rhs1 != item.label:
        __pyx_t_4 = ((__pyx_v_rule->rhs1 != __pyx_v_item.label) != 0);
        if (__pyx_t_4) {
/* … */
        }
/* … */
        __pyx_t_4 = ((__pyx_v_rule->rhs1 != __pyx_v_item.label) != 0);
        if (__pyx_t_4) {
/* … */
        }
+0384: 					break
          goto __pyx_L15_break;
/* … */
          goto __pyx_L15_break;
+0385: 				elif TESTBIT(grammar.mask, rule.no):
        __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_4) {
/* … */
        }
/* … */
        __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_4) {
/* … */
        }
+0386: 					continue
          goto __pyx_L14_continue;
/* … */
          goto __pyx_L14_continue;
+0387: 				score = newprob = prob + rule.prob
        __pyx_t_12 = (__pyx_v_prob + __pyx_v_rule->prob);
        __pyx_v_score = __pyx_t_12;
        __pyx_v_newprob = __pyx_t_12;
/* … */
        __pyx_t_12 = (__pyx_v_prob + __pyx_v_rule->prob);
        __pyx_v_score = __pyx_t_12;
        __pyx_v_newprob = __pyx_t_12;
+0388: 				if estimatetype == SX:
        switch (__pyx_v_estimatetype) {
          case 1:
/* … */
          break;
/* … */
        switch (__pyx_v_estimatetype) {
          case 1:
/* … */
          break;
+0389: 					score += outside[rule.lhs, left, right, 0]
          __pyx_t_16 = __pyx_v_rule->lhs;
          __pyx_t_17 = __pyx_v_left;
          __pyx_t_18 = __pyx_v_right;
          __pyx_t_19 = 0;
          __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_16 * __pyx_v_outside.strides[0]) ) + __pyx_t_17 * __pyx_v_outside.strides[1]) ) + __pyx_t_18 * __pyx_v_outside.strides[2]) ) + __pyx_t_19 * __pyx_v_outside.strides[3]) ))));
/* … */
          __pyx_t_15 = __pyx_v_rule->lhs;
          __pyx_t_16 = __pyx_v_left;
          __pyx_t_17 = __pyx_v_right;
          __pyx_t_18 = 0;
          __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_15 * __pyx_v_outside.strides[0]) ) + __pyx_t_16 * __pyx_v_outside.strides[1]) ) + __pyx_t_17 * __pyx_v_outside.strides[2]) ) + __pyx_t_18 * __pyx_v_outside.strides[3]) ))));
+0390: 					if score > MAX_LOGPROB:
          __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
          if (__pyx_t_4) {
/* … */
          }
/* … */
          __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
          if (__pyx_t_4) {
/* … */
          }
+0391: 						continue
            goto __pyx_L14_continue;
/* … */
            goto __pyx_L14_continue;
+0392: 				elif estimatetype == SXlrgaps:
          case 2:
/* … */
          break;
          default:
/* … */
          case 2:
/* … */
          break;
          default:
+0393: 					score += outside[
          __pyx_t_20 = __pyx_v_rule->lhs;
          __pyx_t_21 = __pyx_v_length;
          __pyx_t_22 = (__pyx_v_left + __pyx_v_right);
          __pyx_t_23 = __pyx_v_gaps;
          __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_20 * __pyx_v_outside.strides[0]) ) + __pyx_t_21 * __pyx_v_outside.strides[1]) ) + __pyx_t_22 * __pyx_v_outside.strides[2]) ) + __pyx_t_23 * __pyx_v_outside.strides[3]) ))));
/* … */
          __pyx_t_19 = __pyx_v_rule->lhs;
          __pyx_t_20 = __pyx_v_length;
          __pyx_t_21 = (__pyx_v_left + __pyx_v_right);
          __pyx_t_22 = __pyx_v_gaps;
          __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_19 * __pyx_v_outside.strides[0]) ) + __pyx_t_20 * __pyx_v_outside.strides[1]) ) + __pyx_t_21 * __pyx_v_outside.strides[2]) ) + __pyx_t_22 * __pyx_v_outside.strides[3]) ))));
 0394: 							rule.lhs, length, left + right, gaps]
+0395: 					if score > MAX_LOGPROB:
          __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
          if (__pyx_t_4) {
/* … */
          }
/* … */
          __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
          if (__pyx_t_4) {
/* … */
          }
+0396: 						continue
            goto __pyx_L14_continue;
/* … */
            goto __pyx_L14_continue;
 0397: 				else:
 0398: 					# add length of span to score so that all items of length n
 0399: 					# have a strictly lower score than items with length n + 1.
+0400: 					score += length * MAX_LOGPROB
          __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
          break;
        }
/* … */
          __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
          break;
        }
+0401: 				newitem.label = rule.lhs
        __pyx_t_24 = __pyx_v_rule->lhs;
        __pyx_v_newitem.label = __pyx_t_24;
/* … */
        __pyx_t_23 = __pyx_v_rule->lhs;
        __pyx_v_newitem.label = __pyx_t_23;
+0402: 				if process_edge[LCFRSItem_fused, LCFRSChart_fused](
        __pyx_t_3 = (__pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_itemidx, __pyx_v_item, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_4, __pyx_v_markorigin, 0.0) != 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L19;
        }
/* … */
        __pyx_t_3 = (__pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_itemidx, __pyx_v_item, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_4, __pyx_v_markorigin, 0.0) != 0);
        if (__pyx_t_3) {
/* … */
          goto __pyx_L19;
        }
 0403: 						newitem, newprob, score, rule, itemidx, item,
 0404: 						agenda, chart, estimatetype, whitelist,
+0405: 						splitprune and grammar.fanout[rule.lhs] != 1,
        __pyx_t_3 = (__pyx_v_splitprune != 0);
        if (__pyx_t_3) {
        } else {
          __pyx_t_4 = __pyx_t_3;
          goto __pyx_L20_bool_binop_done;
        }
        __pyx_t_3 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
        __pyx_t_4 = __pyx_t_3;
        __pyx_L20_bool_binop_done:;
/* … */
        __pyx_t_3 = (__pyx_v_splitprune != 0);
        if (__pyx_t_3) {
        } else {
          __pyx_t_4 = __pyx_t_3;
          goto __pyx_L20_bool_binop_done;
        }
        __pyx_t_3 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
        __pyx_t_4 = __pyx_t_3;
        __pyx_L20_bool_binop_done:;
 0406: 						markorigin, 0.0):
 0407: 					if LCFRSItem_fused is SmallChartItem:
+0408: 						newitem.vec = item.vec
          __pyx_t_13 = __pyx_v_item.vec;
          __pyx_v_newitem.vec = __pyx_t_13;
 0409: 					elif LCFRSItem_fused is FatChartItem:
+0410: 						memcpy(<void *>newitem.vec, <void *>item.vec,
          memcpy(((void *)__pyx_v_newitem.vec), ((void *)__pyx_v_item.vec), (2 * (sizeof(uint64_t))));
 0411: 								SLOTS * sizeof(uint64_t))
 0412: 				else:
+0413: 					blocked += 1
        /*else*/ {
          __pyx_v_blocked = (__pyx_v_blocked + 1);
        }
        __pyx_L19:;
        __pyx_L14_continue:;
      }
      __pyx_L15_break:;
/* … */
        /*else*/ {
          __pyx_v_blocked = (__pyx_v_blocked + 1);
        }
        __pyx_L19:;
        __pyx_L14_continue:;
      }
      __pyx_L15_break:;
 0414: 			# binary production, item from agenda is on the right
+0415: 			for n in range(grammar.numbinary):
      __pyx_t_14 = __pyx_v_grammar->numbinary;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_n = __pyx_t_15;
/* … */
      __pyx_t_13 = __pyx_v_grammar->numbinary;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_n = __pyx_t_14;
+0416: 				rule = &(grammar.rbinary[item.label][n])
        __pyx_v_rule = (&((__pyx_v_grammar->rbinary[__pyx_v_item.label])[__pyx_v_n]));
/* … */
        __pyx_v_rule = (&((__pyx_v_grammar->rbinary[__pyx_v_item.label])[__pyx_v_n]));
+0417: 				if rule.rhs2 != item.label:
        __pyx_t_3 = ((__pyx_v_rule->rhs2 != __pyx_v_item.label) != 0);
        if (__pyx_t_3) {
/* … */
        }
/* … */
        __pyx_t_3 = ((__pyx_v_rule->rhs2 != __pyx_v_item.label) != 0);
        if (__pyx_t_3) {
/* … */
        }
+0418: 					break
          goto __pyx_L23_break;
/* … */
          goto __pyx_L23_break;
 0419: 				# elif chart.probs[rule.rhs1] is None:
 0420: 				# 	continue
+0421: 				elif TESTBIT(grammar.mask, rule.no):
        __pyx_t_3 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_3) {
/* … */
        }
/* … */
        __pyx_t_3 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_3) {
/* … */
        }
+0422: 					continue
          goto __pyx_L22_continue;
/* … */
          goto __pyx_L22_continue;
+0423: 				tmpitem.label = rule.rhs1
        __pyx_t_24 = __pyx_v_rule->rhs1;
        __pyx_v_tmpitem.label = __pyx_t_24;
/* … */
        __pyx_t_23 = __pyx_v_rule->rhs1;
        __pyx_v_tmpitem.label = __pyx_t_23;
+0424: 				itemidxit = chart.itemindex.lower_bound(tmpitem)
        __pyx_v_itemidxit = __pyx_v_chart->itemindex.lower_bound(__pyx_v_tmpitem);
/* … */
        __pyx_v_itemidxit = __pyx_v_chart->itemindex.lower_bound(__pyx_v_tmpitem);
+0425: 				sibvec.clear()
        __pyx_v_sibvec.clear();
/* … */
        __pyx_v_sibvec.clear();
+0426: 				while (itemidxit != chart.itemindex.end()
        while (1) {
/* … */
          __pyx_t_4 = ((__pyx_v_itemidxit != __pyx_v_chart->itemindex.end()) != 0);
          if (__pyx_t_4) {
          } else {
            __pyx_t_3 = __pyx_t_4;
            goto __pyx_L27_bool_binop_done;
          }
/* … */
        while (1) {
/* … */
          __pyx_t_4 = ((__pyx_v_itemidxit != __pyx_v_chart->itemindex.end()) != 0);
          if (__pyx_t_4) {
          } else {
            __pyx_t_3 = __pyx_t_4;
            goto __pyx_L27_bool_binop_done;
          }
+0427: 						and dereference(itemidxit).first.label == rule.rhs1):
          __pyx_t_4 = (((*__pyx_v_itemidxit).first.label == __pyx_v_rule->rhs1) != 0);
          __pyx_t_3 = __pyx_t_4;
          __pyx_L27_bool_binop_done:;
          if (!__pyx_t_3) break;
          __pyx_t_4 = (((*__pyx_v_itemidxit).first.label == __pyx_v_rule->rhs1) != 0);
          __pyx_t_3 = __pyx_t_4;
          __pyx_L27_bool_binop_done:;
          if (!__pyx_t_3) break;
+0428: 					sib = dereference(itemidxit).first
          __pyx_t_25 = (*__pyx_v_itemidxit).first;
          __pyx_v_sib = __pyx_t_25;
/* … */
          __pyx_t_24 = (*__pyx_v_itemidxit).first;
          __pyx_v_sib = __pyx_t_24;
+0429: 					sibidx = dereference(itemidxit).second
          __pyx_t_11 = (*__pyx_v_itemidxit).second;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_t_11 = (*__pyx_v_itemidxit).second;
          __pyx_v_sibidx = __pyx_t_11;
+0430: 					sibvec.push_back(sibidx)
          try {
            __pyx_v_sibvec.push_back(__pyx_v_sibidx);
          } catch(...) {
            __Pyx_CppExn2PyErr();
            __PYX_ERR(0, 430, __pyx_L1_error)
          }
/* … */
          try {
            __pyx_v_sibvec.push_back(__pyx_v_sibidx);
          } catch(...) {
            __Pyx_CppExn2PyErr();
            __PYX_ERR(0, 430, __pyx_L1_error)
          }
+0431: 					postincrement(itemidxit)
          (__pyx_v_itemidxit++);
        }
/* … */
          (__pyx_v_itemidxit++);
        }
+0432: 				for sibidx in sibvec:
        __pyx_t_26 = __pyx_v_sibvec.begin();
        for (;;) {
          if (!(__pyx_t_26 != __pyx_v_sibvec.end())) break;
          __pyx_t_11 = *__pyx_t_26;
          ++__pyx_t_26;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_L29_continue:;
        }
        __pyx_L22_continue:;
      }
      __pyx_L23_break:;
/* … */
        __pyx_t_25 = __pyx_v_sibvec.begin();
        for (;;) {
          if (!(__pyx_t_25 != __pyx_v_sibvec.end())) break;
          __pyx_t_11 = *__pyx_t_25;
          ++__pyx_t_25;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_L29_continue:;
        }
        __pyx_L22_continue:;
      }
      __pyx_L23_break:;
+0433: 					sib = chart.items[sibidx]
          __pyx_v_sib = (__pyx_v_chart->items[__pyx_v_sibidx]);
/* … */
          __pyx_v_sib = (__pyx_v_chart->items[__pyx_v_sibidx]);
+0434: 					postincrement(itemidxit)
          (__pyx_v_itemidxit++);
/* … */
          (__pyx_v_itemidxit++);
+0435: 					if concat[LCFRSItem_fused](rule, &sib, &item):
          __pyx_t_3 = (__pyx_fuse_0__pyx_f_8discodop_6plcfrs_concat(__pyx_v_rule, (&__pyx_v_sib), (&__pyx_v_item)) != 0);
          if (__pyx_t_3) {
/* … */
          }
/* … */
          __pyx_t_3 = (__pyx_fuse_1__pyx_f_8discodop_6plcfrs_concat(__pyx_v_rule, (&__pyx_v_sib), (&__pyx_v_item)) != 0);
          if (__pyx_t_3) {
/* … */
          }
+0436: 						newitem.label = rule.lhs
            __pyx_t_24 = __pyx_v_rule->lhs;
            __pyx_v_newitem.label = __pyx_t_24;
/* … */
            __pyx_t_23 = __pyx_v_rule->lhs;
            __pyx_v_newitem.label = __pyx_t_23;
+0437: 						combine_item[LCFRSItem_fused](&newitem, &sib, &item)
            __pyx_fuse_0__pyx_f_8discodop_6plcfrs_combine_item((&__pyx_v_newitem), (&__pyx_v_sib), (&__pyx_v_item));
/* … */
            __pyx_fuse_1__pyx_f_8discodop_6plcfrs_combine_item((&__pyx_v_newitem), (&__pyx_v_sib), (&__pyx_v_item));
+0438: 						siblingprob = chart.probs[sibidx]
            __pyx_v_siblingprob = (__pyx_v_chart->__pyx_base.__pyx_base.probs[__pyx_v_sibidx]);
/* … */
            __pyx_v_siblingprob = (__pyx_v_chart->__pyx_base.__pyx_base.probs[__pyx_v_sibidx]);
+0439: 						if siblingprob == INFINITY:
            __pyx_t_3 = ((__pyx_v_siblingprob == HUGE_VAL) != 0);
            if (__pyx_t_3) {
/* … */
            }
/* … */
            __pyx_t_3 = ((__pyx_v_siblingprob == HUGE_VAL) != 0);
            if (__pyx_t_3) {
/* … */
            }
+0440: 							continue
              goto __pyx_L29_continue;
/* … */
              goto __pyx_L29_continue;
+0441: 						score = newprob = prob + siblingprob + rule.prob
            __pyx_t_12 = ((__pyx_v_prob + __pyx_v_siblingprob) + __pyx_v_rule->prob);
            __pyx_v_score = __pyx_t_12;
            __pyx_v_newprob = __pyx_t_12;
/* … */
            __pyx_t_12 = ((__pyx_v_prob + __pyx_v_siblingprob) + __pyx_v_rule->prob);
            __pyx_v_score = __pyx_t_12;
            __pyx_v_newprob = __pyx_t_12;
 0442: 						if LCFRSItem_fused is SmallChartItem:
+0443: 							length = bitcount(newitem.vec)
            __pyx_v_length = __pyx_f_8discodop_3bit_bitcount(__pyx_v_newitem.vec, 0);
 0444: 						elif LCFRSItem_fused is FatChartItem:
+0445: 							length = abitcount(newitem.vec, SLOTS)
            __pyx_v_length = __pyx_f_8discodop_3bit_abitcount(__pyx_v_newitem.vec, 2);
+0446: 						if estimatetype == SX or estimatetype == SXlrgaps:
            switch (__pyx_v_estimatetype) {
              case 1:
              case 2:
/* … */
              break;
              default: break;
            }
/* … */
            switch (__pyx_v_estimatetype) {
              case 1:
              case 2:
/* … */
              break;
              default: break;
            }
 0447: 							if LCFRSItem_fused is SmallChartItem:
+0448: 								left = nextset(newitem.vec, 0)
              __pyx_v_left = __pyx_f_8discodop_3bit_nextset(__pyx_v_newitem.vec, 0);
 0449: 							elif LCFRSItem_fused is FatChartItem:
+0450: 								left = anextset(newitem.vec, 0, SLOTS)
              __pyx_v_left = __pyx_f_8discodop_3bit_anextset(__pyx_v_newitem.vec, 0, 2);
+0451: 						if estimatetype == SX:
            switch (__pyx_v_estimatetype) {
              case 1:
/* … */
              break;
/* … */
            switch (__pyx_v_estimatetype) {
              case 1:
/* … */
              break;
+0452: 							right = lensent - length - left
              __pyx_v_right = ((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left);
/* … */
              __pyx_v_right = ((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left);
+0453: 							score += outside[rule.lhs, left, right, 0]
              __pyx_t_27 = __pyx_v_rule->lhs;
              __pyx_t_28 = __pyx_v_left;
              __pyx_t_29 = __pyx_v_right;
              __pyx_t_30 = 0;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_27 * __pyx_v_outside.strides[0]) ) + __pyx_t_28 * __pyx_v_outside.strides[1]) ) + __pyx_t_29 * __pyx_v_outside.strides[2]) ) + __pyx_t_30 * __pyx_v_outside.strides[3]) ))));
/* … */
              __pyx_t_26 = __pyx_v_rule->lhs;
              __pyx_t_27 = __pyx_v_left;
              __pyx_t_28 = __pyx_v_right;
              __pyx_t_29 = 0;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_26 * __pyx_v_outside.strides[0]) ) + __pyx_t_27 * __pyx_v_outside.strides[1]) ) + __pyx_t_28 * __pyx_v_outside.strides[2]) ) + __pyx_t_29 * __pyx_v_outside.strides[3]) ))));
+0454: 							if score > MAX_LOGPROB:
              __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_3) {
/* … */
              }
/* … */
              __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_3) {
/* … */
              }
+0455: 								continue
                goto __pyx_L29_continue;
/* … */
                goto __pyx_L29_continue;
+0456: 						elif estimatetype == SXlrgaps:
              case 2:
/* … */
              break;
              default:
/* … */
              case 2:
/* … */
              break;
              default:
 0457: 							if LCFRSItem_fused is SmallChartItem:
+0458: 								gaps = bitlength(newitem.vec) - length - left
              __pyx_v_gaps = ((__pyx_f_8discodop_3bit_bitlength(__pyx_v_newitem.vec) - __pyx_v_length) - __pyx_v_left);
 0459: 							elif LCFRSItem_fused is FatChartItem:
 0460: 								gaps = abitlength(newitem.vec, SLOTS
+0461: 										) - length - left
              __pyx_v_gaps = ((__pyx_f_8discodop_3bit_abitlength(__pyx_v_newitem.vec, 2) - __pyx_v_length) - __pyx_v_left);
+0462: 							right = lensent - length - left - gaps
              __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
/* … */
              __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
+0463: 							score += outside[
              __pyx_t_31 = __pyx_v_rule->lhs;
              __pyx_t_32 = __pyx_v_length;
              __pyx_t_33 = (__pyx_v_left + __pyx_v_right);
              __pyx_t_34 = __pyx_v_gaps;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_31 * __pyx_v_outside.strides[0]) ) + __pyx_t_32 * __pyx_v_outside.strides[1]) ) + __pyx_t_33 * __pyx_v_outside.strides[2]) ) + __pyx_t_34 * __pyx_v_outside.strides[3]) ))));
/* … */
              __pyx_t_30 = __pyx_v_rule->lhs;
              __pyx_t_31 = __pyx_v_length;
              __pyx_t_32 = (__pyx_v_left + __pyx_v_right);
              __pyx_t_33 = __pyx_v_gaps;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_30 * __pyx_v_outside.strides[0]) ) + __pyx_t_31 * __pyx_v_outside.strides[1]) ) + __pyx_t_32 * __pyx_v_outside.strides[2]) ) + __pyx_t_33 * __pyx_v_outside.strides[3]) ))));
 0464: 									rule.lhs, length, left + right, gaps]
+0465: 							if score > MAX_LOGPROB:
              __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_3) {
/* … */
              }
/* … */
              __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_3) {
/* … */
              }
+0466: 								continue
                goto __pyx_L29_continue;
/* … */
                goto __pyx_L29_continue;
 0467: 						else:
+0468: 							score += length * MAX_LOGPROB
              __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
              break;
            }
/* … */
              __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
              break;
            }
+0469: 						if process_edge[LCFRSItem_fused, LCFRSChart_fused](
            __pyx_t_4 = (__pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_sibidx, __pyx_v_sib, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_3, __pyx_v_markorigin, __pyx_t_12) != 0);
            if (__pyx_t_4) {
              goto __pyx_L35;
            }
/* … */
            __pyx_t_4 = (__pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_sibidx, __pyx_v_sib, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_3, __pyx_v_markorigin, __pyx_t_12) != 0);
            if (__pyx_t_4) {
              goto __pyx_L35;
            }
 0470: 								newitem, newprob, score, rule, sibidx, sib,
 0471: 								agenda, chart, estimatetype, whitelist,
+0472: 								splitprune and grammar.fanout[rule.lhs] != 1,
            __pyx_t_4 = (__pyx_v_splitprune != 0);
            if (__pyx_t_4) {
            } else {
              __pyx_t_3 = __pyx_t_4;
              goto __pyx_L36_bool_binop_done;
            }
            __pyx_t_4 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
            __pyx_t_3 = __pyx_t_4;
            __pyx_L36_bool_binop_done:;
/* … */
            __pyx_t_4 = (__pyx_v_splitprune != 0);
            if (__pyx_t_4) {
            } else {
              __pyx_t_3 = __pyx_t_4;
              goto __pyx_L36_bool_binop_done;
            }
            __pyx_t_4 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
            __pyx_t_3 = __pyx_t_4;
            __pyx_L36_bool_binop_done:;
 0473: 								markorigin,
+0474: 								beam_beta if length <= beam_delta else 0.0):
            if (((__pyx_v_length <= __pyx_v_beam_delta) != 0)) {
              __pyx_t_12 = __pyx_v_beam_beta;
            } else {
              __pyx_t_12 = 0.0;
            }
/* … */
            if (((__pyx_v_length <= __pyx_v_beam_delta) != 0)) {
              __pyx_t_12 = __pyx_v_beam_beta;
            } else {
              __pyx_t_12 = 0.0;
            }
 0475: 							pass
 0476: 						else:
+0477: 							blocked += 1
            /*else*/ {
              __pyx_v_blocked = (__pyx_v_blocked + 1);
            }
            __pyx_L35:;
/* … */
            /*else*/ {
              __pyx_v_blocked = (__pyx_v_blocked + 1);
            }
            __pyx_L35:;
 0478: 			# binary production, item from agenda is on the left
+0479: 			for n in range(grammar.numbinary):
      __pyx_t_14 = __pyx_v_grammar->numbinary;
      for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_n = __pyx_t_15;
/* … */
      __pyx_t_13 = __pyx_v_grammar->numbinary;
      for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
        __pyx_v_n = __pyx_t_14;
+0480: 				rule = &(grammar.lbinary[item.label][n])
        __pyx_v_rule = (&((__pyx_v_grammar->lbinary[__pyx_v_item.label])[__pyx_v_n]));
/* … */
        __pyx_v_rule = (&((__pyx_v_grammar->lbinary[__pyx_v_item.label])[__pyx_v_n]));
+0481: 				if rule.rhs1 != item.label:
        __pyx_t_4 = ((__pyx_v_rule->rhs1 != __pyx_v_item.label) != 0);
        if (__pyx_t_4) {
/* … */
        }
/* … */
        __pyx_t_4 = ((__pyx_v_rule->rhs1 != __pyx_v_item.label) != 0);
        if (__pyx_t_4) {
/* … */
        }
+0482: 					break
          goto __pyx_L39_break;
/* … */
          goto __pyx_L39_break;
 0483: 				# elif chart.probs[rule.rhs2] is None:
 0484: 				# 	continue
+0485: 				elif TESTBIT(grammar.mask, rule.no):
        __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_4) {
/* … */
        }
/* … */
        __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
        if (__pyx_t_4) {
/* … */
        }
+0486: 					continue
          goto __pyx_L38_continue;
/* … */
          goto __pyx_L38_continue;
+0487: 				tmpitem.label = rule.rhs2
        __pyx_t_24 = __pyx_v_rule->rhs2;
        __pyx_v_tmpitem.label = __pyx_t_24;
/* … */
        __pyx_t_23 = __pyx_v_rule->rhs2;
        __pyx_v_tmpitem.label = __pyx_t_23;
+0488: 				itemidxit = chart.itemindex.lower_bound(tmpitem)
        __pyx_v_itemidxit = __pyx_v_chart->itemindex.lower_bound(__pyx_v_tmpitem);
/* … */
        __pyx_v_itemidxit = __pyx_v_chart->itemindex.lower_bound(__pyx_v_tmpitem);
+0489: 				sibvec.clear()
        __pyx_v_sibvec.clear();
/* … */
        __pyx_v_sibvec.clear();
+0490: 				while (itemidxit != chart.itemindex.end()
        while (1) {
/* … */
          __pyx_t_3 = ((__pyx_v_itemidxit != __pyx_v_chart->itemindex.end()) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_4 = __pyx_t_3;
            goto __pyx_L43_bool_binop_done;
          }
/* … */
        while (1) {
/* … */
          __pyx_t_3 = ((__pyx_v_itemidxit != __pyx_v_chart->itemindex.end()) != 0);
          if (__pyx_t_3) {
          } else {
            __pyx_t_4 = __pyx_t_3;
            goto __pyx_L43_bool_binop_done;
          }
+0491: 						and dereference(itemidxit).first.label == rule.rhs2):
          __pyx_t_3 = (((*__pyx_v_itemidxit).first.label == __pyx_v_rule->rhs2) != 0);
          __pyx_t_4 = __pyx_t_3;
          __pyx_L43_bool_binop_done:;
          if (!__pyx_t_4) break;
          __pyx_t_3 = (((*__pyx_v_itemidxit).first.label == __pyx_v_rule->rhs2) != 0);
          __pyx_t_4 = __pyx_t_3;
          __pyx_L43_bool_binop_done:;
          if (!__pyx_t_4) break;
+0492: 					sib = dereference(itemidxit).first
          __pyx_t_25 = (*__pyx_v_itemidxit).first;
          __pyx_v_sib = __pyx_t_25;
/* … */
          __pyx_t_24 = (*__pyx_v_itemidxit).first;
          __pyx_v_sib = __pyx_t_24;
+0493: 					sibidx = dereference(itemidxit).second
          __pyx_t_11 = (*__pyx_v_itemidxit).second;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_t_11 = (*__pyx_v_itemidxit).second;
          __pyx_v_sibidx = __pyx_t_11;
+0494: 					sibvec.push_back(sibidx)
          try {
            __pyx_v_sibvec.push_back(__pyx_v_sibidx);
          } catch(...) {
            __Pyx_CppExn2PyErr();
            __PYX_ERR(0, 494, __pyx_L1_error)
          }
/* … */
          try {
            __pyx_v_sibvec.push_back(__pyx_v_sibidx);
          } catch(...) {
            __Pyx_CppExn2PyErr();
            __PYX_ERR(0, 494, __pyx_L1_error)
          }
+0495: 					postincrement(itemidxit)
          (__pyx_v_itemidxit++);
        }
/* … */
          (__pyx_v_itemidxit++);
        }
+0496: 				for sibidx in sibvec:
        __pyx_t_26 = __pyx_v_sibvec.begin();
        for (;;) {
          if (!(__pyx_t_26 != __pyx_v_sibvec.end())) break;
          __pyx_t_11 = *__pyx_t_26;
          ++__pyx_t_26;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_L45_continue:;
        }
        __pyx_L38_continue:;
      }
      __pyx_L39_break:;
    }
    __pyx_L11:;
/* … */
        __pyx_t_25 = __pyx_v_sibvec.begin();
        for (;;) {
          if (!(__pyx_t_25 != __pyx_v_sibvec.end())) break;
          __pyx_t_11 = *__pyx_t_25;
          ++__pyx_t_25;
          __pyx_v_sibidx = __pyx_t_11;
/* … */
          __pyx_L45_continue:;
        }
        __pyx_L38_continue:;
      }
      __pyx_L39_break:;
    }
    __pyx_L11:;
+0497: 					sib = chart.items[sibidx]
          __pyx_v_sib = (__pyx_v_chart->items[__pyx_v_sibidx]);
/* … */
          __pyx_v_sib = (__pyx_v_chart->items[__pyx_v_sibidx]);
+0498: 					if concat[LCFRSItem_fused](rule, &item, &sib):
          __pyx_t_4 = (__pyx_fuse_0__pyx_f_8discodop_6plcfrs_concat(__pyx_v_rule, (&__pyx_v_item), (&__pyx_v_sib)) != 0);
          if (__pyx_t_4) {
/* … */
          }
/* … */
          __pyx_t_4 = (__pyx_fuse_1__pyx_f_8discodop_6plcfrs_concat(__pyx_v_rule, (&__pyx_v_item), (&__pyx_v_sib)) != 0);
          if (__pyx_t_4) {
/* … */
          }
+0499: 						newitem.label = rule.lhs
            __pyx_t_24 = __pyx_v_rule->lhs;
            __pyx_v_newitem.label = __pyx_t_24;
/* … */
            __pyx_t_23 = __pyx_v_rule->lhs;
            __pyx_v_newitem.label = __pyx_t_23;
+0500: 						combine_item[LCFRSItem_fused](&newitem, &item, &sib)
            __pyx_fuse_0__pyx_f_8discodop_6plcfrs_combine_item((&__pyx_v_newitem), (&__pyx_v_item), (&__pyx_v_sib));
/* … */
            __pyx_fuse_1__pyx_f_8discodop_6plcfrs_combine_item((&__pyx_v_newitem), (&__pyx_v_item), (&__pyx_v_sib));
+0501: 						siblingprob = chart.probs[sibidx]
            __pyx_v_siblingprob = (__pyx_v_chart->__pyx_base.__pyx_base.probs[__pyx_v_sibidx]);
/* … */
            __pyx_v_siblingprob = (__pyx_v_chart->__pyx_base.__pyx_base.probs[__pyx_v_sibidx]);
+0502: 						if siblingprob == INFINITY:
            __pyx_t_4 = ((__pyx_v_siblingprob == HUGE_VAL) != 0);
            if (__pyx_t_4) {
/* … */
            }
/* … */
            __pyx_t_4 = ((__pyx_v_siblingprob == HUGE_VAL) != 0);
            if (__pyx_t_4) {
/* … */
            }
+0503: 							continue
              goto __pyx_L45_continue;
/* … */
              goto __pyx_L45_continue;
+0504: 						score = newprob = prob + siblingprob + rule.prob
            __pyx_t_12 = ((__pyx_v_prob + __pyx_v_siblingprob) + __pyx_v_rule->prob);
            __pyx_v_score = __pyx_t_12;
            __pyx_v_newprob = __pyx_t_12;
/* … */
            __pyx_t_12 = ((__pyx_v_prob + __pyx_v_siblingprob) + __pyx_v_rule->prob);
            __pyx_v_score = __pyx_t_12;
            __pyx_v_newprob = __pyx_t_12;
 0505: 						if LCFRSItem_fused is SmallChartItem:
+0506: 							length = bitcount(newitem.vec)
            __pyx_v_length = __pyx_f_8discodop_3bit_bitcount(__pyx_v_newitem.vec, 0);
 0507: 						elif LCFRSItem_fused is FatChartItem:
+0508: 							length = abitcount(newitem.vec, SLOTS)
            __pyx_v_length = __pyx_f_8discodop_3bit_abitcount(__pyx_v_newitem.vec, 2);
+0509: 						if estimatetype == SX or estimatetype == SXlrgaps:
            switch (__pyx_v_estimatetype) {
              case 1:
              case 2:
/* … */
              break;
              default: break;
            }
/* … */
            switch (__pyx_v_estimatetype) {
              case 1:
              case 2:
/* … */
              break;
              default: break;
            }
 0510: 							if LCFRSItem_fused is SmallChartItem:
+0511: 								left = nextset(newitem.vec, 0)
              __pyx_v_left = __pyx_f_8discodop_3bit_nextset(__pyx_v_newitem.vec, 0);
 0512: 							elif LCFRSItem_fused is FatChartItem:
+0513: 								left = anextset(newitem.vec, 0, SLOTS)
              __pyx_v_left = __pyx_f_8discodop_3bit_anextset(__pyx_v_newitem.vec, 0, 2);
+0514: 						if estimatetype == SX:
            switch (__pyx_v_estimatetype) {
              case 1:
/* … */
              break;
/* … */
            switch (__pyx_v_estimatetype) {
              case 1:
/* … */
              break;
+0515: 							right = lensent - length - left
              __pyx_v_right = ((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left);
/* … */
              __pyx_v_right = ((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left);
+0516: 							score += outside[rule.lhs, left, right, 0]
              __pyx_t_35 = __pyx_v_rule->lhs;
              __pyx_t_36 = __pyx_v_left;
              __pyx_t_37 = __pyx_v_right;
              __pyx_t_38 = 0;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_35 * __pyx_v_outside.strides[0]) ) + __pyx_t_36 * __pyx_v_outside.strides[1]) ) + __pyx_t_37 * __pyx_v_outside.strides[2]) ) + __pyx_t_38 * __pyx_v_outside.strides[3]) ))));
/* … */
              __pyx_t_34 = __pyx_v_rule->lhs;
              __pyx_t_35 = __pyx_v_left;
              __pyx_t_36 = __pyx_v_right;
              __pyx_t_37 = 0;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_34 * __pyx_v_outside.strides[0]) ) + __pyx_t_35 * __pyx_v_outside.strides[1]) ) + __pyx_t_36 * __pyx_v_outside.strides[2]) ) + __pyx_t_37 * __pyx_v_outside.strides[3]) ))));
+0517: 							if score > MAX_LOGPROB:
              __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_4) {
/* … */
              }
/* … */
              __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_4) {
/* … */
              }
+0518: 								continue
                goto __pyx_L45_continue;
/* … */
                goto __pyx_L45_continue;
+0519: 						elif estimatetype == SXlrgaps:
              case 2:
/* … */
              break;
              default:
/* … */
              case 2:
/* … */
              break;
              default:
 0520: 							if LCFRSItem_fused is SmallChartItem:
+0521: 								gaps = bitlength(newitem.vec) - length - left
              __pyx_v_gaps = ((__pyx_f_8discodop_3bit_bitlength(__pyx_v_newitem.vec) - __pyx_v_length) - __pyx_v_left);
 0522: 							elif LCFRSItem_fused is FatChartItem:
 0523: 								gaps = abitlength(newitem.vec, SLOTS
+0524: 										) - length - left
              __pyx_v_gaps = ((__pyx_f_8discodop_3bit_abitlength(__pyx_v_newitem.vec, 2) - __pyx_v_length) - __pyx_v_left);
+0525: 							right = lensent - length - left - gaps
              __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
/* … */
              __pyx_v_right = (((__pyx_v_lensent - __pyx_v_length) - __pyx_v_left) - __pyx_v_gaps);
+0526: 							score += outside[rule.lhs, length,
              __pyx_t_39 = __pyx_v_rule->lhs;
              __pyx_t_40 = __pyx_v_length;
              __pyx_t_41 = (__pyx_v_left + __pyx_v_right);
              __pyx_t_42 = __pyx_v_gaps;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_39 * __pyx_v_outside.strides[0]) ) + __pyx_t_40 * __pyx_v_outside.strides[1]) ) + __pyx_t_41 * __pyx_v_outside.strides[2]) ) + __pyx_t_42 * __pyx_v_outside.strides[3]) ))));
/* … */
              __pyx_t_38 = __pyx_v_rule->lhs;
              __pyx_t_39 = __pyx_v_length;
              __pyx_t_40 = (__pyx_v_left + __pyx_v_right);
              __pyx_t_41 = __pyx_v_gaps;
              __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_38 * __pyx_v_outside.strides[0]) ) + __pyx_t_39 * __pyx_v_outside.strides[1]) ) + __pyx_t_40 * __pyx_v_outside.strides[2]) ) + __pyx_t_41 * __pyx_v_outside.strides[3]) ))));
 0527: 									left + right, gaps]
+0528: 							if score > MAX_LOGPROB:
              __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_4) {
/* … */
              }
/* … */
              __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
              if (__pyx_t_4) {
/* … */
              }
+0529: 								continue
                goto __pyx_L45_continue;
/* … */
                goto __pyx_L45_continue;
 0530: 						else:
+0531: 							score += length * MAX_LOGPROB
              __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
              break;
            }
/* … */
              __pyx_v_score = (__pyx_v_score + (__pyx_v_length * 300.0));
              break;
            }
+0532: 						if process_edge[LCFRSItem_fused, LCFRSChart_fused](
            __pyx_t_3 = (__pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_itemidx, __pyx_v_item, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_4, __pyx_v_markorigin, __pyx_t_12) != 0);
            if (__pyx_t_3) {
              goto __pyx_L51;
            }
/* … */
            __pyx_t_3 = (__pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_edge(__pyx_v_newitem, __pyx_v_newprob, __pyx_v_score, __pyx_v_rule, __pyx_v_itemidx, __pyx_v_item, ((Agenda<ItemNo,std::pair<Prob,Prob> >  &)__pyx_v_agenda), __pyx_v_chart, __pyx_v_estimatetype, __pyx_v_whitelist, __pyx_t_4, __pyx_v_markorigin, __pyx_t_12) != 0);
            if (__pyx_t_3) {
              goto __pyx_L51;
            }
 0533: 								newitem, newprob, score, rule, itemidx, item,
 0534: 								agenda, chart, estimatetype, whitelist,
+0535: 								splitprune and grammar.fanout[rule.lhs] != 1,
            __pyx_t_3 = (__pyx_v_splitprune != 0);
            if (__pyx_t_3) {
            } else {
              __pyx_t_4 = __pyx_t_3;
              goto __pyx_L52_bool_binop_done;
            }
            __pyx_t_3 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
            __pyx_t_4 = __pyx_t_3;
            __pyx_L52_bool_binop_done:;
/* … */
            __pyx_t_3 = (__pyx_v_splitprune != 0);
            if (__pyx_t_3) {
            } else {
              __pyx_t_4 = __pyx_t_3;
              goto __pyx_L52_bool_binop_done;
            }
            __pyx_t_3 = (((__pyx_v_grammar->fanout[__pyx_v_rule->lhs]) != 1) != 0);
            __pyx_t_4 = __pyx_t_3;
            __pyx_L52_bool_binop_done:;
 0536: 								markorigin,
+0537: 								beam_beta if length <= beam_delta else 0.0):
            if (((__pyx_v_length <= __pyx_v_beam_delta) != 0)) {
              __pyx_t_12 = __pyx_v_beam_beta;
            } else {
              __pyx_t_12 = 0.0;
            }
/* … */
            if (((__pyx_v_length <= __pyx_v_beam_delta) != 0)) {
              __pyx_t_12 = __pyx_v_beam_beta;
            } else {
              __pyx_t_12 = 0.0;
            }
 0538: 							pass
 0539: 						else:
+0540: 							blocked += 1
            /*else*/ {
              __pyx_v_blocked = (__pyx_v_blocked + 1);
            }
            __pyx_L51:;
/* … */
            /*else*/ {
              __pyx_v_blocked = (__pyx_v_blocked + 1);
            }
            __pyx_L51:;
+0541: 		if agenda.size() > maxA:
    __pyx_t_3 = ((__pyx_v_agenda.size() > __pyx_v_maxA) != 0);
    if (__pyx_t_3) {
/* … */
    }
  }
  __pyx_L10_break:;
/* … */
    __pyx_t_3 = ((__pyx_v_agenda.size() > __pyx_v_maxA) != 0);
    if (__pyx_t_3) {
/* … */
    }
  }
  __pyx_L10_break:;
+0542: 			maxA = agenda.size()
      __pyx_v_maxA = __pyx_v_agenda.size();
/* … */
      __pyx_v_maxA = __pyx_v_agenda.size();
+0543: 	msg = ('%s, blocked %d, agenda max %d, now %d' % (
  __pyx_t_10 = PyUnicode_Format(__pyx_kp_u_s_blocked_d_agenda_max_d_now_d, __pyx_t_43); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 543, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_43); __pyx_t_43 = 0;
  __Pyx_DECREF_SET(__pyx_v_msg, __pyx_t_10);
  __pyx_t_10 = 0;
/* … */
  __pyx_t_10 = PyUnicode_Format(__pyx_kp_u_s_blocked_d_agenda_max_d_now_d, __pyx_t_42); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 543, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_42); __pyx_t_42 = 0;
  __Pyx_DECREF_SET(__pyx_v_msg, __pyx_t_10);
  __pyx_t_10 = 0;
+0544: 			chart.stats(), blocked, maxA, agenda.size()))
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_stats); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
    }
  }
  if (__pyx_t_6) {
    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  } else {
    __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_blocked); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_maxA); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_10 = __Pyx_PyInt_FromSize_t(__pyx_v_agenda.size()); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_43 = PyTuple_New(4); if (unlikely(!__pyx_t_43)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_43);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_43, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_43, 1, __pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_43, 2, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_43, 3, __pyx_t_10);
  __pyx_t_5 = 0;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_10 = 0;
/* … */
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_stats); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
    }
  }
  if (__pyx_t_6) {
    __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  } else {
    __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 544, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_blocked); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_maxA); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_10 = __Pyx_PyInt_FromSize_t(__pyx_v_agenda.size()); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_42 = PyTuple_New(4); if (unlikely(!__pyx_t_42)) __PYX_ERR(0, 544, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_42);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_42, 0, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_42, 1, __pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_42, 2, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_10);
  PyTuple_SET_ITEM(__pyx_t_42, 3, __pyx_t_10);
  __pyx_t_5 = 0;
  __pyx_t_7 = 0;
  __pyx_t_6 = 0;
  __pyx_t_10 = 0;
+0545: 	if not chart:
  __pyx_t_3 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_chart)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 545, __pyx_L1_error)
  __pyx_t_4 = ((!__pyx_t_3) != 0);
  if (__pyx_t_4) {
/* … */
  }
/* … */
  __pyx_t_3 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_chart)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 545, __pyx_L1_error)
  __pyx_t_4 = ((!__pyx_t_3) != 0);
  if (__pyx_t_4) {
/* … */
  }
+0546: 		return chart, 'no parse; ' + msg
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_10 = PyNumber_Add(__pyx_kp_u_no_parse, __pyx_v_msg); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_43 = PyTuple_New(2); if (unlikely(!__pyx_t_43)) __PYX_ERR(0, 546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_43);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_43, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_43, 1, __pyx_t_10);
    __pyx_t_10 = 0;
    __pyx_r = __pyx_t_43;
    __pyx_t_43 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_10 = PyNumber_Add(__pyx_kp_u_no_parse, __pyx_v_msg); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_42 = PyTuple_New(2); if (unlikely(!__pyx_t_42)) __PYX_ERR(0, 546, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_42);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_42, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(__pyx_t_10);
    PyTuple_SET_ITEM(__pyx_t_42, 1, __pyx_t_10);
    __pyx_t_10 = 0;
    __pyx_r = __pyx_t_42;
    __pyx_t_42 = 0;
    goto __pyx_L0;
+0547: 	return chart, msg
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_43 = PyTuple_New(2); if (unlikely(!__pyx_t_43)) __PYX_ERR(0, 547, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_43);
  __Pyx_INCREF(((PyObject *)__pyx_v_chart));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
  PyTuple_SET_ITEM(__pyx_t_43, 0, ((PyObject *)__pyx_v_chart));
  __Pyx_INCREF(__pyx_v_msg);
  __Pyx_GIVEREF(__pyx_v_msg);
  PyTuple_SET_ITEM(__pyx_t_43, 1, __pyx_v_msg);
  __pyx_r = __pyx_t_43;
  __pyx_t_43 = 0;
  goto __pyx_L0;
/* … */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_42 = PyTuple_New(2); if (unlikely(!__pyx_t_42)) __PYX_ERR(0, 547, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_42);
  __Pyx_INCREF(((PyObject *)__pyx_v_chart));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
  PyTuple_SET_ITEM(__pyx_t_42, 0, ((PyObject *)__pyx_v_chart));
  __Pyx_INCREF(__pyx_v_msg);
  __Pyx_GIVEREF(__pyx_v_msg);
  PyTuple_SET_ITEM(__pyx_t_42, 1, __pyx_v_msg);
  __pyx_r = __pyx_t_42;
  __pyx_t_42 = 0;
  goto __pyx_L0;
 0548: 
 0549: 
+0550: cdef inline bint process_edge(LCFRSItem_fused newitem,
static CYTHON_INLINE int __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_edge(SmallChartItem __pyx_v_newitem, Prob __pyx_v_prob, Prob __pyx_v_score, ProbRule *__pyx_v_rule, ItemNo __pyx_v_leftitemidx, SmallChartItem &__pyx_v_left, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_chart, int __pyx_v_estimatetype, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin, Prob __pyx_v_beam) {
  Label __pyx_v_label;
  ItemNo __pyx_v_itemidx;
  int __pyx_v_inagenda;
  int __pyx_v_inchart;
  std::pair<Prob,Prob>  __pyx_v_scoreprob;
  Prob __pyx_v_curprob;
  SmallChartItemBtreeMap<ItemNo> ::iterator __pyx_v_itemidxit;
  CYTHON_UNUSED double __pyx_v_cuprob;
  SmallChartItemBtreeMap<Prob> ::iterator __pyx_v_it;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0process_edge", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_WriteUnraisable("discodop.plcfrs.process_edge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_edge(FatChartItem __pyx_v_newitem, Prob __pyx_v_prob, Prob __pyx_v_score, ProbRule *__pyx_v_rule, ItemNo __pyx_v_leftitemidx, FatChartItem &__pyx_v_left, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_chart, int __pyx_v_estimatetype, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin, Prob __pyx_v_beam) {
  Label __pyx_v_label;
  ItemNo __pyx_v_itemidx;
  int __pyx_v_inagenda;
  int __pyx_v_inchart;
  std::pair<Prob,Prob>  __pyx_v_scoreprob;
  Prob __pyx_v_curprob;
  FatChartItemBtreeMap<ItemNo> ::iterator __pyx_v_itemidxit;
  CYTHON_UNUSED double __pyx_v_cuprob;
  FatChartItemBtreeMap<Prob> ::iterator __pyx_v_it;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1process_edge", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_WriteUnraisable("discodop.plcfrs.process_edge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0551: 		Prob prob, Prob score, ProbRule *rule,
 0552: 		ItemNo leftitemidx, LCFRSItem_fused& left,
 0553: 		Agenda[ItemNo, pair[Prob, Prob]]& agenda, LCFRSChart_fused chart,
 0554: 		int estimatetype, Whitelist whitelist, bint splitprune,
 0555: 		bint markorigin, Prob beam):
 0556: 	"""Decide what to do with a newly derived edge.
 0557: 
 0558: 	:returns: ``True`` when edge is accepted in the chart, ``False`` when
 0559: 		blocked. When ``False``, ``newitem`` may be reused."""
 0560: 	cdef Label label
 0561: 	cdef ItemNo itemidx
 0562: 	cdef bint inagenda, inchart
 0563: 	cdef pair[Prob, Prob] scoreprob
 0564: 	cdef Prob curprob
 0565: 	# avoid generating code for spurious fused type combinations
 0566: 	if ((LCFRSItem_fused is SmallChartItem
 0567: 			and LCFRSChart_fused is FatLCFRSChart)
 0568: 			or (LCFRSItem_fused is FatChartItem
 0569: 			and LCFRSChart_fused is SmallLCFRSChart)):
 0570: 		return False
+0571: 	itemidxit = chart.itemindex.find(newitem)
  __pyx_v_itemidxit = __pyx_v_chart->itemindex.find(__pyx_v_newitem);
/* … */
  __pyx_v_itemidxit = __pyx_v_chart->itemindex.find(__pyx_v_newitem);
+0572: 	if itemidxit == chart.itemindex.end():
  __pyx_t_1 = ((__pyx_v_itemidxit == __pyx_v_chart->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_itemidxit == __pyx_v_chart->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+0573: 		cuprob = INFINITY
    __pyx_v_cuprob = HUGE_VAL;
/* … */
    __pyx_v_cuprob = HUGE_VAL;
+0574: 		inagenda = inchart = False
    __pyx_v_inagenda = 0;
    __pyx_v_inchart = 0;
/* … */
    __pyx_v_inagenda = 0;
    __pyx_v_inchart = 0;
+0575: 		itemidx = curprob = 0
    __pyx_v_itemidx = 0;
    __pyx_v_curprob = 0.0;
/* … */
    __pyx_v_itemidx = 0;
    __pyx_v_curprob = 0.0;
 0576: 	else:
+0577: 		itemidx = dereference(itemidxit).second
  /*else*/ {
    __pyx_t_2 = (*__pyx_v_itemidxit).second;
    __pyx_v_itemidx = __pyx_t_2;
/* … */
  /*else*/ {
    __pyx_t_2 = (*__pyx_v_itemidxit).second;
    __pyx_v_itemidx = __pyx_t_2;
+0578: 		curprob = chart.subtreeprob(itemidx)
    __pyx_v_curprob = ((struct __pyx_vtabstruct_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.subtreeprob(((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart), __pyx_v_itemidx);
/* … */
    __pyx_v_curprob = ((struct __pyx_vtabstruct_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.subtreeprob(((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart), __pyx_v_itemidx);
+0579: 		inagenda = agenda.member(itemidx)
    __pyx_v_inagenda = __pyx_v_agenda.member(__pyx_v_itemidx);
/* … */
    __pyx_v_inagenda = __pyx_v_agenda.member(__pyx_v_itemidx);
+0580: 		inchart = chart.parseforest[itemidx].size() != 0
    __pyx_v_inchart = ((__pyx_v_chart->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).size() != 0);
  }
  __pyx_L3:;
/* … */
    __pyx_v_inchart = ((__pyx_v_chart->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).size() != 0);
  }
  __pyx_L3:;
+0581: 	scoreprob.first = score
  __pyx_v_scoreprob.first = __pyx_v_score;
/* … */
  __pyx_v_scoreprob.first = __pyx_v_score;
+0582: 	scoreprob.second = prob
  __pyx_v_scoreprob.second = __pyx_v_prob;
/* … */
  __pyx_v_scoreprob.second = __pyx_v_prob;
+0583: 	if not inagenda and not inchart:
  __pyx_t_3 = ((!(__pyx_v_inagenda != 0)) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L5_bool_binop_done;
  }
  __pyx_t_3 = ((!(__pyx_v_inchart != 0)) != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L5_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
/* … */
  __pyx_t_3 = ((!(__pyx_v_inagenda != 0)) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L5_bool_binop_done;
  }
  __pyx_t_3 = ((!(__pyx_v_inchart != 0)) != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L5_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
 0584: 		# check if we need to prune this item
+0585: 		if whitelist is not None and not checkwhitelist(
    __pyx_t_3 = (((PyObject *)__pyx_v_whitelist) != Py_None);
    __pyx_t_4 = (__pyx_t_3 != 0);
    if (__pyx_t_4) {
    } else {
      __pyx_t_1 = __pyx_t_4;
      goto __pyx_L8_bool_binop_done;
    }
/* … */
    __pyx_t_4 = ((!(__pyx_fuse_0__pyx_f_8discodop_6plcfrs_checkwhitelist(__pyx_v_newitem, __pyx_v_whitelist, __pyx_v_splitprune, __pyx_v_markorigin) != 0)) != 0);
    __pyx_t_1 = __pyx_t_4;
    __pyx_L8_bool_binop_done:;
/* … */
    if (__pyx_t_1) {
/* … */
    }
/* … */
    __pyx_t_3 = (((PyObject *)__pyx_v_whitelist) != Py_None);
    __pyx_t_4 = (__pyx_t_3 != 0);
    if (__pyx_t_4) {
    } else {
      __pyx_t_1 = __pyx_t_4;
      goto __pyx_L8_bool_binop_done;
    }
/* … */
    __pyx_t_4 = ((!(__pyx_fuse_1__pyx_f_8discodop_6plcfrs_checkwhitelist(__pyx_v_newitem, __pyx_v_whitelist, __pyx_v_splitprune, __pyx_v_markorigin) != 0)) != 0);
    __pyx_t_1 = __pyx_t_4;
    __pyx_L8_bool_binop_done:;
/* … */
    if (__pyx_t_1) {
/* … */
    }
 0586: 				newitem, whitelist, splitprune, markorigin):
+0587: 			return False
      __pyx_r = 0;
      goto __pyx_L0;
/* … */
      __pyx_r = 0;
      goto __pyx_L0;
+0588: 		elif beam:
    __pyx_t_1 = (__pyx_v_beam != 0);
    if (__pyx_t_1) {
/* … */
    }
/* … */
    __pyx_t_1 = (__pyx_v_beam != 0);
    if (__pyx_t_1) {
/* … */
    }
+0589: 			label = newitem.label
      __pyx_t_5 = __pyx_v_newitem.label;
      __pyx_v_label = __pyx_t_5;
/* … */
      __pyx_t_5 = __pyx_v_newitem.label;
      __pyx_v_label = __pyx_t_5;
+0590: 			newitem.label = 0
      __pyx_v_newitem.label = 0;
/* … */
      __pyx_v_newitem.label = 0;
+0591: 			it = chart.beambuckets.find(newitem)
      __pyx_v_it = __pyx_v_chart->beambuckets.find(__pyx_v_newitem);
/* … */
      __pyx_v_it = __pyx_v_chart->beambuckets.find(__pyx_v_newitem);
+0592: 			if (it == chart.beambuckets.end()
      __pyx_t_4 = ((__pyx_v_it == __pyx_v_chart->beambuckets.end()) != 0);
      if (!__pyx_t_4) {
      } else {
        __pyx_t_1 = __pyx_t_4;
        goto __pyx_L11_bool_binop_done;
      }
/* … */
      if (__pyx_t_1) {
/* … */
        goto __pyx_L10;
      }
/* … */
      __pyx_t_4 = ((__pyx_v_it == __pyx_v_chart->beambuckets.end()) != 0);
      if (!__pyx_t_4) {
      } else {
        __pyx_t_1 = __pyx_t_4;
        goto __pyx_L11_bool_binop_done;
      }
/* … */
      if (__pyx_t_1) {
/* … */
        goto __pyx_L10;
      }
+0593: 					or prob + beam < dereference(it).second):
      __pyx_t_4 = (((__pyx_v_prob + __pyx_v_beam) < (*__pyx_v_it).second) != 0);
      __pyx_t_1 = __pyx_t_4;
      __pyx_L11_bool_binop_done:;
/* … */
      __pyx_t_4 = (((__pyx_v_prob + __pyx_v_beam) < (*__pyx_v_it).second) != 0);
      __pyx_t_1 = __pyx_t_4;
      __pyx_L11_bool_binop_done:;
+0594: 				chart.beambuckets[newitem] = prob + beam
        (__pyx_v_chart->beambuckets[__pyx_v_newitem]) = (__pyx_v_prob + __pyx_v_beam);
/* … */
        (__pyx_v_chart->beambuckets[__pyx_v_newitem]) = (__pyx_v_prob + __pyx_v_beam);
+0595: 			elif prob > dereference(it).second:
      __pyx_t_1 = ((__pyx_v_prob > (*__pyx_v_it).second) != 0);
      if (__pyx_t_1) {
/* … */
      }
      __pyx_L10:;
/* … */
      __pyx_t_1 = ((__pyx_v_prob > (*__pyx_v_it).second) != 0);
      if (__pyx_t_1) {
/* … */
      }
      __pyx_L10:;
+0596: 				return False
        __pyx_r = 0;
        goto __pyx_L0;
/* … */
        __pyx_r = 0;
        goto __pyx_L0;
+0597: 			newitem.label = label
      __pyx_v_newitem.label = __pyx_v_label;
/* … */
      __pyx_v_newitem.label = __pyx_v_label;
 0598: 		# haven't seen this item before, won't prune, add to agenda
+0599: 		itemidx = chart.itemindex[newitem] = chart.items.size()
    __pyx_t_6 = __pyx_v_chart->items.size();
    __pyx_v_itemidx = __pyx_t_6;
    (__pyx_v_chart->itemindex[__pyx_v_newitem]) = __pyx_t_6;
/* … */
    __pyx_t_6 = __pyx_v_chart->items.size();
    __pyx_v_itemidx = __pyx_t_6;
    (__pyx_v_chart->itemindex[__pyx_v_newitem]) = __pyx_t_6;
+0600: 		chart.items.push_back(newitem)
    try {
      __pyx_v_chart->items.push_back(__pyx_v_newitem);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 600, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->items.push_back(__pyx_v_newitem);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 600, __pyx_L1_error)
    }
+0601: 		chart.parseforest.resize(chart.items.size())
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_chart->items.size());
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 601, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_chart->items.size());
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 601, __pyx_L1_error)
    }
+0602: 		chart.probs.push_back(INFINITY)
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 602, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 602, __pyx_L1_error)
    }
+0603: 		agenda.setitem(itemidx, scoreprob)
    __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
/* … */
    __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
 0604: 	# in agenda (maybe in chart)
+0605: 	elif inagenda:
  __pyx_t_1 = (__pyx_v_inagenda != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
/* … */
  __pyx_t_1 = (__pyx_v_inagenda != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L4;
  }
 0606: 		# lower score? => decrease-key in agenda
+0607: 		agenda.setifbetter(itemidx, scoreprob)
    __pyx_v_agenda.setifbetter(__pyx_v_itemidx, __pyx_v_scoreprob);
/* … */
    __pyx_v_agenda.setifbetter(__pyx_v_itemidx, __pyx_v_scoreprob);
 0608: 	# not in agenda => must be in chart
+0609: 	elif not inagenda and prob < curprob:
  __pyx_t_4 = ((!(__pyx_v_inagenda != 0)) != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_1 = __pyx_t_4;
    goto __pyx_L13_bool_binop_done;
  }
  __pyx_t_4 = ((__pyx_v_prob < __pyx_v_curprob) != 0);
  __pyx_t_1 = __pyx_t_4;
  __pyx_L13_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L4:;
/* … */
  __pyx_t_4 = ((!(__pyx_v_inagenda != 0)) != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_1 = __pyx_t_4;
    goto __pyx_L13_bool_binop_done;
  }
  __pyx_t_4 = ((__pyx_v_prob < __pyx_v_curprob) != 0);
  __pyx_t_1 = __pyx_t_4;
  __pyx_L13_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L4:;
 0610: 		# re-add to agenda because we found a better score.
+0611: 		agenda.setitem(itemidx, scoreprob)
    __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
/* … */
    __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
+0612: 		if estimatetype != SXlrgaps:
    __pyx_t_1 = ((__pyx_v_estimatetype != 2) != 0);
    if (__pyx_t_1) {
/* … */
    }
/* … */
    __pyx_t_1 = ((__pyx_v_estimatetype != 2) != 0);
    if (__pyx_t_1) {
/* … */
    }
 0613: 			# This should only happen because of an inconsistent or
 0614: 			# non-monotonic estimate.
+0615: 			logging.warning('WARN: re-adding item to agenda already in chart:'
      __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 615, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_warning); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 615, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
/* … */
      __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_logging); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 615, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_8, __pyx_n_s_warning); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 615, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+0616: 					' %s', chart.itemstr(itemidx))
      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 616, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_11 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 616, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
        if (likely(__pyx_t_12)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_10, function);
        }
      }
      if (!__pyx_t_12) {
        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_GOTREF(__pyx_t_8);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
          __Pyx_GIVEREF(__pyx_t_11);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_11);
          __pyx_t_11 = 0;
          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __pyx_t_10 = NULL;
      __pyx_t_14 = 0;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
        if (likely(__pyx_t_10)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_10);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_9, function);
          __pyx_t_14 = 1;
        }
      }
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_9)) {
        PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_kp_u_WARN_re_adding_item_to_agenda_al, __pyx_t_8};
        __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_9)) {
        PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_kp_u_WARN_re_adding_item_to_agenda_al, __pyx_t_8};
        __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      } else
      #endif
      {
        __pyx_t_13 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        if (__pyx_t_10) {
          __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_10); __pyx_t_10 = NULL;
        }
        __Pyx_INCREF(__pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        __Pyx_GIVEREF(__pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_14, __pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        __Pyx_GIVEREF(__pyx_t_8);
        PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_14, __pyx_t_8);
        __pyx_t_8 = 0;
        __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_13, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      }
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
/* … */
      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 616, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_11 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 616, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = NULL;
      if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_10))) {
        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
        if (likely(__pyx_t_12)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_10, function);
        }
      }
      if (!__pyx_t_12) {
        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __Pyx_GOTREF(__pyx_t_8);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_11};
          __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
          __Pyx_GIVEREF(__pyx_t_11);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_11);
          __pyx_t_11 = 0;
          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 616, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __pyx_t_10 = NULL;
      __pyx_t_14 = 0;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9);
        if (likely(__pyx_t_10)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
          __Pyx_INCREF(__pyx_t_10);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_9, function);
          __pyx_t_14 = 1;
        }
      }
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_9)) {
        PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_kp_u_WARN_re_adding_item_to_agenda_al, __pyx_t_8};
        __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_9)) {
        PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_kp_u_WARN_re_adding_item_to_agenda_al, __pyx_t_8};
        __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_14, 2+__pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      } else
      #endif
      {
        __pyx_t_13 = PyTuple_New(2+__pyx_t_14); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        if (__pyx_t_10) {
          __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_10); __pyx_t_10 = NULL;
        }
        __Pyx_INCREF(__pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        __Pyx_GIVEREF(__pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_14, __pyx_kp_u_WARN_re_adding_item_to_agenda_al);
        __Pyx_GIVEREF(__pyx_t_8);
        PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_14, __pyx_t_8);
        __pyx_t_8 = 0;
        __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_13, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 615, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      }
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
 0617: 	# store this edge, regardless of whether the item was new (unary chains)
+0618: 	chart.addedge(itemidx, leftitemidx, left, rule)
  __pyx_f_8discodop_6plcfrs_15SmallLCFRSChart_addedge(__pyx_v_chart, __pyx_v_itemidx, __pyx_v_leftitemidx, __pyx_v_left, __pyx_v_rule);
/* … */
  __pyx_f_8discodop_6plcfrs_13FatLCFRSChart_addedge(__pyx_v_chart, __pyx_v_itemidx, __pyx_v_leftitemidx, __pyx_v_left, __pyx_v_rule);
+0619: 	return True
  __pyx_r = 1;
  goto __pyx_L0;
/* … */
  __pyx_r = 1;
  goto __pyx_L0;
 0620: 
 0621: 
+0622: cdef populatepos(Grammar grammar,
static PyObject *__pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_populatepos(struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_chart, CYTHON_UNUSED SmallChartItem __pyx_v_item, PyObject *__pyx_v_sent, PyObject *__pyx_v_tags, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, PyObject *__pyx_v_estimates) {
  LexicalRule __pyx_v_lexrule;
  SmallChartItem __pyx_v_newitem;
  __Pyx_memviewslice __pyx_v_outside = { 0, 0, { 0 }, { 0 }, { 0 } };
  Prob __pyx_v_score;
  short __pyx_v_wordidx;
  short __pyx_v_lensent;
  short __pyx_v_estimatetype;
  int __pyx_v_length;
  int __pyx_v_left;
  int __pyx_v_right;
  int __pyx_v_gaps;
  Label __pyx_v_lhs;
  int __pyx_v_recognized;
  PyObject *__pyx_v_estimatetypestr = NULL;
  PyObject *__pyx_v_word = NULL;
  PyObject *__pyx_v_tag = NULL;
  PyObject *__pyx_v_tagre = NULL;
  spp::sparse_hash_map<std::string,std::vector<uint32_t> > ::iterator __pyx_v_it;
  uint32_t __pyx_v_n;
  std::pair<Label,spp::sparse_hash_map<std::string,uint32_t> >  __pyx_v_x;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0populatepos", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("discodop.plcfrs.populatepos", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
  __Pyx_XDECREF(__pyx_v_estimatetypestr);
  __Pyx_XDECREF(__pyx_v_word);
  __Pyx_XDECREF(__pyx_v_tag);
  __Pyx_XDECREF(__pyx_v_tagre);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_populatepos(struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_chart, FatChartItem __pyx_v_item, PyObject *__pyx_v_sent, PyObject *__pyx_v_tags, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, PyObject *__pyx_v_estimates) {
  LexicalRule __pyx_v_lexrule;
  FatChartItem __pyx_v_newitem;
  __Pyx_memviewslice __pyx_v_outside = { 0, 0, { 0 }, { 0 }, { 0 } };
  Prob __pyx_v_score;
  short __pyx_v_wordidx;
  short __pyx_v_lensent;
  short __pyx_v_estimatetype;
  int __pyx_v_length;
  int __pyx_v_left;
  int __pyx_v_right;
  int __pyx_v_gaps;
  Label __pyx_v_lhs;
  int __pyx_v_recognized;
  PyObject *__pyx_v_estimatetypestr = NULL;
  PyObject *__pyx_v_word = NULL;
  PyObject *__pyx_v_tag = NULL;
  PyObject *__pyx_v_tagre = NULL;
  spp::sparse_hash_map<std::string,std::vector<uint32_t> > ::iterator __pyx_v_it;
  uint32_t __pyx_v_n;
  std::pair<Label,spp::sparse_hash_map<std::string,uint32_t> >  __pyx_v_x;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1populatepos", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __PYX_XDEC_MEMVIEW(&__pyx_t_1, 1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_14);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("discodop.plcfrs.populatepos", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
  __Pyx_XDECREF(__pyx_v_estimatetypestr);
  __Pyx_XDECREF(__pyx_v_word);
  __Pyx_XDECREF(__pyx_v_tag);
  __Pyx_XDECREF(__pyx_v_tagre);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0623: 		Agenda[ItemNo, pair[Prob, Prob]]& agenda, LCFRSChart_fused chart,
 0624: 		LCFRSItem_fused item, sent, tags, Whitelist whitelist, estimates):
 0625: 	"""Apply all possible lexical and unary rules on each lexical span.
 0626: 
 0627: 	:returns: a tuple ``(success, msg)`` where ``success`` is True if a POS tag
 0628: 		was found for every word in the sentence."""
 0629: 	cdef:
 0630: 		LexicalRule lexrule
 0631: 		LCFRSItem_fused newitem
+0632: 		double [:, :, :, :] outside = None  # outside estimates, if provided
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(Py_None);
  if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 632, __pyx_L1_error)
  __pyx_v_outside = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
/* … */
  __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(Py_None);
  if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 632, __pyx_L1_error)
  __pyx_v_outside = __pyx_t_1;
  __pyx_t_1.memview = NULL;
  __pyx_t_1.data = NULL;
 0633: 		Prob score
+0634: 		short wordidx, lensent = len(sent), estimatetype = 0
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 634, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
  __pyx_v_estimatetype = 0;
/* … */
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 634, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
  __pyx_v_estimatetype = 0;
+0635: 		int length = 1, left = 0, right = 0, gaps = 0
  __pyx_v_length = 1;
  __pyx_v_left = 0;
  __pyx_v_right = 0;
  __pyx_v_gaps = 0;
/* … */
  __pyx_v_length = 1;
  __pyx_v_left = 0;
  __pyx_v_right = 0;
  __pyx_v_gaps = 0;
 0636: 		Label lhs
 0637: 		bint recognized
+0638: 	if estimates is not None:
  __pyx_t_3 = (__pyx_v_estimates != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
/* … */
  }
/* … */
  __pyx_t_3 = (__pyx_v_estimates != Py_None);
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
/* … */
  }
+0639: 		estimatetypestr, outside = estimates
    if ((likely(PyTuple_CheckExact(__pyx_v_estimates))) || (PyList_CheckExact(__pyx_v_estimates))) {
      PyObject* sequence = __pyx_v_estimates;
      #if !CYTHON_COMPILING_IN_PYPY
      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_ERR(0, 639, __pyx_L1_error)
      }
      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __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_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      #endif
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_v_estimates); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __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_L4_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_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 639, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 639, __pyx_L1_error)
      __pyx_L5_unpacking_done:;
    }
    __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(__pyx_t_6);
    if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 639, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_estimatetypestr = __pyx_t_5;
    __pyx_t_5 = 0;
    __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
    __pyx_v_outside = __pyx_t_1;
    __pyx_t_1.memview = NULL;
    __pyx_t_1.data = NULL;
/* … */
    if ((likely(PyTuple_CheckExact(__pyx_v_estimates))) || (PyList_CheckExact(__pyx_v_estimates))) {
      PyObject* sequence = __pyx_v_estimates;
      #if !CYTHON_COMPILING_IN_PYPY
      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_ERR(0, 639, __pyx_L1_error)
      }
      #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __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_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      #endif
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_v_estimates); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 639, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __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_L4_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_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 639, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 639, __pyx_L1_error)
      __pyx_L5_unpacking_done:;
    }
    __pyx_t_1 = __Pyx_PyObject_to_MemoryviewSlice_dsdsdsds_double(__pyx_t_6);
    if (unlikely(!__pyx_t_1.memview)) __PYX_ERR(0, 639, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_estimatetypestr = __pyx_t_5;
    __pyx_t_5 = 0;
    __PYX_XDEC_MEMVIEW(&__pyx_v_outside, 1);
    __pyx_v_outside = __pyx_t_1;
    __pyx_t_1.memview = NULL;
    __pyx_t_1.data = NULL;
+0640: 		estimatetype = {'SX': SX, 'SXlrgaps': SXlrgaps}[estimatetypestr]
    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SX, __pyx_int_1) < 0) __PYX_ERR(0, 640, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SXlrgaps, __pyx_int_2) < 0) __PYX_ERR(0, 640, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyDict_GetItem(__pyx_t_6, __pyx_v_estimatetypestr); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_9 = __Pyx_PyInt_As_short(__pyx_t_5); if (unlikely((__pyx_t_9 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_estimatetype = __pyx_t_9;
/* … */
    __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SX, __pyx_int_1) < 0) __PYX_ERR(0, 640, __pyx_L1_error)
    if (PyDict_SetItem(__pyx_t_6, __pyx_n_u_SXlrgaps, __pyx_int_2) < 0) __PYX_ERR(0, 640, __pyx_L1_error)
    __pyx_t_5 = __Pyx_PyDict_GetItem(__pyx_t_6, __pyx_v_estimatetypestr); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_9 = __Pyx_PyInt_As_short(__pyx_t_5); if (unlikely((__pyx_t_9 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 640, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_estimatetype = __pyx_t_9;
 0641: 	# newitem will be recycled until it is added to the chart
 0642: 	if LCFRSItem_fused is SmallChartItem:
+0643: 		newitem = SmallChartItem(0, 0)
  __pyx_v_newitem = SmallChartItem(0, 0);
 0644: 	elif LCFRSItem_fused is FatChartItem:
+0645: 		newitem = FatChartItem(0)
  __pyx_v_newitem = FatChartItem(0);
 0646: 
+0647: 	for wordidx, word in enumerate(sent):  # add preterminals to chart
  __pyx_t_9 = 0;
  if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) {
    __pyx_t_5 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
    __pyx_t_10 = NULL;
  } else {
    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 647, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 647, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_10)) {
      if (likely(PyList_CheckExact(__pyx_t_5))) {
        if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 647, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 647, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      } else {
        if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 647, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 647, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      }
    } else {
      __pyx_t_6 = __pyx_t_10(__pyx_t_5);
      if (unlikely(!__pyx_t_6)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 647, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_6);
    }
    __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_wordidx = __pyx_t_9;
    __pyx_t_9 = (__pyx_t_9 + 1);
/* … */
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
  __pyx_t_9 = 0;
  if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) {
    __pyx_t_5 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_5); __pyx_t_2 = 0;
    __pyx_t_10 = NULL;
  } else {
    __pyx_t_2 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 647, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_10 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 647, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_10)) {
      if (likely(PyList_CheckExact(__pyx_t_5))) {
        if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 647, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 647, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      } else {
        if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_2); __Pyx_INCREF(__pyx_t_6); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 647, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 647, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      }
    } else {
      __pyx_t_6 = __pyx_t_10(__pyx_t_5);
      if (unlikely(!__pyx_t_6)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 647, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_6);
    }
    __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_wordidx = __pyx_t_9;
    __pyx_t_9 = (__pyx_t_9 + 1);
/* … */
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+0648: 		recognized = False
    __pyx_v_recognized = 0;
/* … */
    __pyx_v_recognized = 0;
 0649: 		if LCFRSItem_fused is SmallChartItem:
+0650: 			item = SmallChartItem(0, wordidx)
    __pyx_v_item = SmallChartItem(0, __pyx_v_wordidx);
 0651: 		elif LCFRSItem_fused is FatChartItem:
+0652: 			item = FatChartItem(0)
    __pyx_v_item = FatChartItem(0);
+0653: 			item.vec[0] = wordidx
    (__pyx_v_item.vec[0]) = __pyx_v_wordidx;
+0654: 		tag = tags[wordidx] if tags else None
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 654, __pyx_L1_error)
    if (__pyx_t_4) {
      __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_tags, __pyx_v_wordidx, short, 1, __Pyx_PyInt_From_short, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 654, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_6 = __pyx_t_7;
      __pyx_t_7 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tag, __pyx_t_6);
    __pyx_t_6 = 0;
/* … */
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 654, __pyx_L1_error)
    if (__pyx_t_4) {
      __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_tags, __pyx_v_wordidx, short, 1, __Pyx_PyInt_From_short, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 654, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_6 = __pyx_t_7;
      __pyx_t_7 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tag, __pyx_t_6);
    __pyx_t_6 = 0;
 0655: 		# if we are given gold tags, make sure we only allow matching
 0656: 		# tags - after removing addresses introduced by the DOP reduction
 0657: 		# and other state splits.
+0658: 		tagre = re.compile('%s($|[-@^/])' % re.escape(tag)) if tags else None
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 658, __pyx_L1_error)
    if (__pyx_t_4) {
      __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_compile); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_13 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_escape); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __pyx_t_13 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_14))) {
        __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_14);
        if (likely(__pyx_t_13)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14);
          __Pyx_INCREF(__pyx_t_13);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_14, function);
        }
      }
      if (!__pyx_t_13) {
        __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_v_tag); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_14)) {
          PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_v_tag};
          __pyx_t_11 = __Pyx_PyFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
          __Pyx_GOTREF(__pyx_t_11);
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_14)) {
          PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_v_tag};
          __pyx_t_11 = __Pyx_PyCFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
          __Pyx_GOTREF(__pyx_t_11);
        } else
        #endif
        {
          __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_15);
          __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL;
          __Pyx_INCREF(__pyx_v_tag);
          __Pyx_GIVEREF(__pyx_v_tag);
          PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_v_tag);
          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_14, __pyx_t_15, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
      __pyx_t_14 = PyUnicode_Format(__pyx_kp_u_s, __pyx_t_11); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
        if (likely(__pyx_t_11)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_12, function);
        }
      }
      if (!__pyx_t_11) {
        __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __Pyx_GOTREF(__pyx_t_7);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_t_14};
          __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_t_14};
          __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        } else
        #endif
        {
          __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_15);
          __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_11); __pyx_t_11 = NULL;
          __Pyx_GIVEREF(__pyx_t_14);
          PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_t_14);
          __pyx_t_14 = 0;
          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_15, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_6 = __pyx_t_7;
      __pyx_t_7 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tagre, __pyx_t_6);
    __pyx_t_6 = 0;
/* … */
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 658, __pyx_L1_error)
    if (__pyx_t_4) {
      __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_compile); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_13 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_escape); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __pyx_t_13 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_14))) {
        __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_14);
        if (likely(__pyx_t_13)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14);
          __Pyx_INCREF(__pyx_t_13);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_14, function);
        }
      }
      if (!__pyx_t_13) {
        __pyx_t_11 = __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_v_tag); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_14)) {
          PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_v_tag};
          __pyx_t_11 = __Pyx_PyFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
          __Pyx_GOTREF(__pyx_t_11);
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_14)) {
          PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_v_tag};
          __pyx_t_11 = __Pyx_PyCFunction_FastCall(__pyx_t_14, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
          __Pyx_GOTREF(__pyx_t_11);
        } else
        #endif
        {
          __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_15);
          __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL;
          __Pyx_INCREF(__pyx_v_tag);
          __Pyx_GIVEREF(__pyx_v_tag);
          PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_v_tag);
          __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_14, __pyx_t_15, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
      __pyx_t_14 = PyUnicode_Format(__pyx_kp_u_s, __pyx_t_11); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 658, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_14);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_12))) {
        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_12);
        if (likely(__pyx_t_11)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_12, function);
        }
      }
      if (!__pyx_t_11) {
        __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        __Pyx_GOTREF(__pyx_t_7);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_t_14};
          __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_t_14};
          __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
        } else
        #endif
        {
          __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_15);
          __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_11); __pyx_t_11 = NULL;
          __Pyx_GIVEREF(__pyx_t_14);
          PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_t_14);
          __pyx_t_14 = 0;
          __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_15, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 658, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_7);
          __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_6 = __pyx_t_7;
      __pyx_t_7 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tagre, __pyx_t_6);
    __pyx_t_6 = 0;
+0659: 		if estimates is not None:
    __pyx_t_4 = (__pyx_v_estimates != Py_None);
    __pyx_t_3 = (__pyx_t_4 != 0);
    if (__pyx_t_3) {
/* … */
    }
/* … */
    __pyx_t_4 = (__pyx_v_estimates != Py_None);
    __pyx_t_3 = (__pyx_t_4 != 0);
    if (__pyx_t_3) {
/* … */
    }
+0660: 			left = wordidx
      __pyx_v_left = __pyx_v_wordidx;
/* … */
      __pyx_v_left = __pyx_v_wordidx;
+0661: 			gaps = 0
      __pyx_v_gaps = 0;
/* … */
      __pyx_v_gaps = 0;
+0662: 			right = lensent - 1 - wordidx
      __pyx_v_right = ((__pyx_v_lensent - 1) - __pyx_v_wordidx);
/* … */
      __pyx_v_right = ((__pyx_v_lensent - 1) - __pyx_v_wordidx);
 0663: 		# for n in grammar.lexicalbyword.get(word, ()):
+0664: 		it = grammar.lexicalbyword.find(word.encode('utf8'))
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_16 = __pyx_convert_string_from_py_std__in_string(__pyx_t_7); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_it = __pyx_v_grammar->lexicalbyword.find(__pyx_t_16);
/* … */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_n_u_utf8); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
/* … */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_16 = __pyx_convert_string_from_py_std__in_string(__pyx_t_7); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 664, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_v_it = __pyx_v_grammar->lexicalbyword.find(__pyx_t_16);
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_n_u_utf8); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 664, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
+0665: 		if it != grammar.lexicalbyword.end():
    __pyx_t_3 = ((__pyx_v_it != __pyx_v_grammar->lexicalbyword.end()) != 0);
    if (__pyx_t_3) {
/* … */
    }
/* … */
    __pyx_t_3 = ((__pyx_v_it != __pyx_v_grammar->lexicalbyword.end()) != 0);
    if (__pyx_t_3) {
/* … */
    }
+0666: 			for n in dereference(it).second:
      __pyx_t_18 = &(*__pyx_v_it).second;
      __pyx_t_17 = __pyx_t_18->begin();
      for (;;) {
        if (!(__pyx_t_17 != __pyx_t_18->end())) break;
        __pyx_t_19 = *__pyx_t_17;
        ++__pyx_t_17;
        __pyx_v_n = __pyx_t_19;
/* … */
        __pyx_L10_continue:;
      }
/* … */
      __pyx_t_18 = &(*__pyx_v_it).second;
      __pyx_t_17 = __pyx_t_18->begin();
      for (;;) {
        if (!(__pyx_t_17 != __pyx_t_18->end())) break;
        __pyx_t_19 = *__pyx_t_17;
        ++__pyx_t_17;
        __pyx_v_n = __pyx_t_19;
/* … */
        __pyx_L10_continue:;
      }
+0667: 				lexrule = grammar.lexical[n]
        __pyx_v_lexrule = (__pyx_v_grammar->lexical[__pyx_v_n]);
/* … */
        __pyx_v_lexrule = (__pyx_v_grammar->lexical[__pyx_v_n]);
+0668: 				if not tags or tagre.match(grammar.tolabel[lexrule.lhs]):
        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 668, __pyx_L1_error)
        __pyx_t_20 = ((!__pyx_t_4) != 0);
        if (!__pyx_t_20) {
        } else {
          __pyx_t_3 = __pyx_t_20;
          goto __pyx_L13_bool_binop_done;
        }
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 668, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_12 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lexrule.lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 668, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_15 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_15)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_15);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_15) {
          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_12); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_7);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_15, __pyx_t_12};
            __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_15, __pyx_t_12};
            __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          {
            __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_14);
            __Pyx_GIVEREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_15); __pyx_t_15 = NULL;
            __Pyx_GIVEREF(__pyx_t_12);
            PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_12);
            __pyx_t_12 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          }
        }
        __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_ERR(0, 668, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_3 = __pyx_t_20;
        __pyx_L13_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
        }
/* … */
        __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 668, __pyx_L1_error)
        __pyx_t_20 = ((!__pyx_t_4) != 0);
        if (!__pyx_t_20) {
        } else {
          __pyx_t_3 = __pyx_t_20;
          goto __pyx_L13_bool_binop_done;
        }
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 668, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_12 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lexrule.lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 668, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_15 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_15)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_15);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_15) {
          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_12); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_7);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_15, __pyx_t_12};
            __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_15, __pyx_t_12};
            __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          {
            __pyx_t_14 = PyTuple_New(1+1); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_14);
            __Pyx_GIVEREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_14, 0, __pyx_t_15); __pyx_t_15 = NULL;
            __Pyx_GIVEREF(__pyx_t_12);
            PyTuple_SET_ITEM(__pyx_t_14, 0+1, __pyx_t_12);
            __pyx_t_12 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_14, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 668, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          }
        }
        __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_ERR(0, 668, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_3 = __pyx_t_20;
        __pyx_L13_bool_binop_done:;
        if (__pyx_t_3) {
/* … */
        }
+0669: 					score = lexrule.prob
          __pyx_t_21 = __pyx_v_lexrule.prob;
          __pyx_v_score = __pyx_t_21;
/* … */
          __pyx_t_21 = __pyx_v_lexrule.prob;
          __pyx_v_score = __pyx_t_21;
+0670: 					if estimatetype == SX:
          switch (__pyx_v_estimatetype) {
            case 1:
/* … */
            break;
/* … */
          switch (__pyx_v_estimatetype) {
            case 1:
/* … */
            break;
+0671: 						score += outside[lexrule.lhs, left, right, 0]
            __pyx_t_22 = __pyx_v_lexrule.lhs;
            __pyx_t_23 = __pyx_v_left;
            __pyx_t_24 = __pyx_v_right;
            __pyx_t_25 = 0;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_22 * __pyx_v_outside.strides[0]) ) + __pyx_t_23 * __pyx_v_outside.strides[1]) ) + __pyx_t_24 * __pyx_v_outside.strides[2]) ) + __pyx_t_25 * __pyx_v_outside.strides[3]) ))));
/* … */
            __pyx_t_22 = __pyx_v_lexrule.lhs;
            __pyx_t_23 = __pyx_v_left;
            __pyx_t_24 = __pyx_v_right;
            __pyx_t_25 = 0;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_22 * __pyx_v_outside.strides[0]) ) + __pyx_t_23 * __pyx_v_outside.strides[1]) ) + __pyx_t_24 * __pyx_v_outside.strides[2]) ) + __pyx_t_25 * __pyx_v_outside.strides[3]) ))));
+0672: 						if score > MAX_LOGPROB:
            __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_3) {
/* … */
            }
/* … */
            __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_3) {
/* … */
            }
+0673: 							continue
              goto __pyx_L10_continue;
/* … */
              goto __pyx_L10_continue;
+0674: 					elif estimatetype == SXlrgaps:
            case 2:
/* … */
            break;
            default: break;
          }
/* … */
            case 2:
/* … */
            break;
            default: break;
          }
+0675: 						score += outside[
            __pyx_t_26 = __pyx_v_lexrule.lhs;
            __pyx_t_27 = __pyx_v_length;
            __pyx_t_28 = (__pyx_v_left + __pyx_v_right);
            __pyx_t_29 = __pyx_v_gaps;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_26 * __pyx_v_outside.strides[0]) ) + __pyx_t_27 * __pyx_v_outside.strides[1]) ) + __pyx_t_28 * __pyx_v_outside.strides[2]) ) + __pyx_t_29 * __pyx_v_outside.strides[3]) ))));
/* … */
            __pyx_t_26 = __pyx_v_lexrule.lhs;
            __pyx_t_27 = __pyx_v_length;
            __pyx_t_28 = (__pyx_v_left + __pyx_v_right);
            __pyx_t_29 = __pyx_v_gaps;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_26 * __pyx_v_outside.strides[0]) ) + __pyx_t_27 * __pyx_v_outside.strides[1]) ) + __pyx_t_28 * __pyx_v_outside.strides[2]) ) + __pyx_t_29 * __pyx_v_outside.strides[3]) ))));
 0676: 								lexrule.lhs, length, left + right, gaps]
+0677: 						if score > MAX_LOGPROB:
            __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_3) {
/* … */
            }
/* … */
            __pyx_t_3 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_3) {
/* … */
            }
+0678: 							continue
              goto __pyx_L10_continue;
/* … */
              goto __pyx_L10_continue;
 0679: 					# NB: do NOT add length of span to score, so that the
 0680: 					# scores of POS tags are all strictly smaller than any
 0681: 					# unaries on them.
+0682: 					newitem.label = lexrule.lhs
          __pyx_t_30 = __pyx_v_lexrule.lhs;
          __pyx_v_newitem.label = __pyx_t_30;
/* … */
          __pyx_t_30 = __pyx_v_lexrule.lhs;
          __pyx_v_newitem.label = __pyx_t_30;
 0683: 					if LCFRSItem_fused is SmallChartItem:
+0684: 						newitem.vec = 1UL << wordidx
          __pyx_v_newitem.vec = (1UL << __pyx_v_wordidx);
 0685: 					elif LCFRSItem_fused is FatChartItem:
+0686: 						memset(<void *>newitem.vec, 0, SLOTS * sizeof(uint64_t))
          memset(((void *)__pyx_v_newitem.vec), 0, (2 * (sizeof(uint64_t))));
+0687: 						SETBIT(newitem.vec, wordidx)
          SETBIT(__pyx_v_newitem.vec, __pyx_v_wordidx);
+0688: 					if process_lexedge[LCFRSItem_fused, LCFRSChart_fused](
          __pyx_t_31 = __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_lexedge(__pyx_v_newitem, __pyx_v_lexrule.prob, __pyx_v_score, __pyx_v_wordidx, __pyx_v_agenda, __pyx_v_chart, __pyx_v_whitelist); if (unlikely(__pyx_t_31 == -1)) __PYX_ERR(0, 688, __pyx_L1_error)
          __pyx_t_3 = (__pyx_t_31 != 0);
          if (__pyx_t_3) {
/* … */
          }
/* … */
          __pyx_t_31 = __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_lexedge(__pyx_v_newitem, __pyx_v_lexrule.prob, __pyx_v_score, __pyx_v_wordidx, __pyx_v_agenda, __pyx_v_chart, __pyx_v_whitelist); if (unlikely(__pyx_t_31 == -1)) __PYX_ERR(0, 688, __pyx_L1_error)
          __pyx_t_3 = (__pyx_t_31 != 0);
          if (__pyx_t_3) {
/* … */
          }
 0689: 							newitem, lexrule.prob, score, wordidx, agenda, chart,
 0690: 							whitelist):
 0691: 						if LCFRSItem_fused is SmallChartItem:
+0692: 							newitem = SmallChartItem(0, 0)
            __pyx_v_newitem = SmallChartItem(0, 0);
 0693: 						elif LCFRSItem_fused is FatChartItem:
+0694: 							newitem = FatChartItem(0)
            __pyx_v_newitem = FatChartItem(0);
+0695: 						recognized = True
            __pyx_v_recognized = 1;
/* … */
            __pyx_v_recognized = 1;
 0696: 		# NB: use gold tags if given, even if (word, tag) was not part of
 0697: 		# training data, modulo state splits etc.
+0698: 		if not recognized and tag is not None:
    __pyx_t_20 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_20) {
    } else {
      __pyx_t_3 = __pyx_t_20;
      goto __pyx_L19_bool_binop_done;
    }
    __pyx_t_20 = (__pyx_v_tag != Py_None);
    __pyx_t_4 = (__pyx_t_20 != 0);
    __pyx_t_3 = __pyx_t_4;
    __pyx_L19_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
/* … */
    __pyx_t_20 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_20) {
    } else {
      __pyx_t_3 = __pyx_t_20;
      goto __pyx_L19_bool_binop_done;
    }
    __pyx_t_20 = (__pyx_v_tag != Py_None);
    __pyx_t_4 = (__pyx_t_20 != 0);
    __pyx_t_3 = __pyx_t_4;
    __pyx_L19_bool_binop_done:;
    if (__pyx_t_3) {
/* … */
    }
+0699: 			for x in grammar.lexicalbylhs:
      __pyx_t_33 = &__pyx_v_grammar->lexicalbylhs;
      __pyx_t_32 = __pyx_t_33->begin();
      for (;;) {
        if (!(__pyx_t_32 != __pyx_t_33->end())) break;
        __pyx_t_34 = *__pyx_t_32;
        ++__pyx_t_32;
        __pyx_v_x = __pyx_t_34;
/* … */
        __pyx_L21_continue:;
      }
/* … */
      __pyx_t_33 = &__pyx_v_grammar->lexicalbylhs;
      __pyx_t_32 = __pyx_t_33->begin();
      for (;;) {
        if (!(__pyx_t_32 != __pyx_t_33->end())) break;
        __pyx_t_34 = *__pyx_t_32;
        ++__pyx_t_32;
        __pyx_v_x = __pyx_t_34;
/* … */
        __pyx_L21_continue:;
      }
+0700: 				lhs = x.first
        __pyx_t_30 = __pyx_v_x.first;
        __pyx_v_lhs = __pyx_t_30;
/* … */
        __pyx_t_30 = __pyx_v_x.first;
        __pyx_v_lhs = __pyx_t_30;
+0701: 				if tagre.match(grammar.tolabel[lhs]) is not None:
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 701, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_14 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 701, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_12 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_12)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_12);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_12) {
          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_GOTREF(__pyx_t_7);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_14};
            __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_14};
            __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          } else
          #endif
          {
            __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_15);
            __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_12); __pyx_t_12 = NULL;
            __Pyx_GIVEREF(__pyx_t_14);
            PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_t_14);
            __pyx_t_14 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_15, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = (__pyx_t_7 != Py_None);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_4 = (__pyx_t_3 != 0);
        if (__pyx_t_4) {
/* … */
        }
/* … */
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 701, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_14 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_14)) __PYX_ERR(0, 701, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_14);
        __pyx_t_12 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_12)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_12);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_12) {
          __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_14); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          __Pyx_GOTREF(__pyx_t_7);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_14};
            __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_12, __pyx_t_14};
            __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0;
          } else
          #endif
          {
            __pyx_t_15 = PyTuple_New(1+1); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_15);
            __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_12); __pyx_t_12 = NULL;
            __Pyx_GIVEREF(__pyx_t_14);
            PyTuple_SET_ITEM(__pyx_t_15, 0+1, __pyx_t_14);
            __pyx_t_14 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_15, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 701, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_3 = (__pyx_t_7 != Py_None);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_4 = (__pyx_t_3 != 0);
        if (__pyx_t_4) {
/* … */
        }
+0702: 					score = 0.0
          __pyx_v_score = 0.0;
/* … */
          __pyx_v_score = 0.0;
+0703: 					if estimatetype == SX:
          switch (__pyx_v_estimatetype) {
            case 1:
/* … */
            break;
/* … */
          switch (__pyx_v_estimatetype) {
            case 1:
/* … */
            break;
+0704: 						score += outside[lhs, left, right, 0]
            __pyx_t_35 = __pyx_v_lhs;
            __pyx_t_36 = __pyx_v_left;
            __pyx_t_37 = __pyx_v_right;
            __pyx_t_38 = 0;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_35 * __pyx_v_outside.strides[0]) ) + __pyx_t_36 * __pyx_v_outside.strides[1]) ) + __pyx_t_37 * __pyx_v_outside.strides[2]) ) + __pyx_t_38 * __pyx_v_outside.strides[3]) ))));
/* … */
            __pyx_t_35 = __pyx_v_lhs;
            __pyx_t_36 = __pyx_v_left;
            __pyx_t_37 = __pyx_v_right;
            __pyx_t_38 = 0;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_35 * __pyx_v_outside.strides[0]) ) + __pyx_t_36 * __pyx_v_outside.strides[1]) ) + __pyx_t_37 * __pyx_v_outside.strides[2]) ) + __pyx_t_38 * __pyx_v_outside.strides[3]) ))));
+0705: 						if score > MAX_LOGPROB:
            __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_4) {
/* … */
            }
/* … */
            __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_4) {
/* … */
            }
+0706: 							continue
              goto __pyx_L21_continue;
/* … */
              goto __pyx_L21_continue;
+0707: 					elif estimatetype == SXlrgaps:
            case 2:
/* … */
            break;
            default: break;
          }
/* … */
            case 2:
/* … */
            break;
            default: break;
          }
+0708: 						score += outside[lhs, length, left + right, gaps]
            __pyx_t_39 = __pyx_v_lhs;
            __pyx_t_40 = __pyx_v_length;
            __pyx_t_41 = (__pyx_v_left + __pyx_v_right);
            __pyx_t_42 = __pyx_v_gaps;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_39 * __pyx_v_outside.strides[0]) ) + __pyx_t_40 * __pyx_v_outside.strides[1]) ) + __pyx_t_41 * __pyx_v_outside.strides[2]) ) + __pyx_t_42 * __pyx_v_outside.strides[3]) ))));
/* … */
            __pyx_t_39 = __pyx_v_lhs;
            __pyx_t_40 = __pyx_v_length;
            __pyx_t_41 = (__pyx_v_left + __pyx_v_right);
            __pyx_t_42 = __pyx_v_gaps;
            __pyx_v_score = (__pyx_v_score + (*((double *) ( /* dim=3 */ (( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_outside.data + __pyx_t_39 * __pyx_v_outside.strides[0]) ) + __pyx_t_40 * __pyx_v_outside.strides[1]) ) + __pyx_t_41 * __pyx_v_outside.strides[2]) ) + __pyx_t_42 * __pyx_v_outside.strides[3]) ))));
+0709: 						if score > MAX_LOGPROB:
            __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_4) {
/* … */
            }
/* … */
            __pyx_t_4 = ((__pyx_v_score > 300.0) != 0);
            if (__pyx_t_4) {
/* … */
            }
+0710: 							continue
              goto __pyx_L21_continue;
/* … */
              goto __pyx_L21_continue;
+0711: 					newitem.label = lhs
          __pyx_v_newitem.label = __pyx_v_lhs;
/* … */
          __pyx_v_newitem.label = __pyx_v_lhs;
 0712: 					if LCFRSItem_fused is SmallChartItem:
+0713: 						newitem.vec = 1UL << wordidx
          __pyx_v_newitem.vec = (1UL << __pyx_v_wordidx);
 0714: 					elif LCFRSItem_fused is FatChartItem:
+0715: 						memset(
          memset(((void *)__pyx_v_newitem.vec), 0, (2 * (sizeof(uint64_t))));
 0716: 								<void *>newitem.vec, 0,
 0717: 								SLOTS * sizeof(uint64_t))
+0718: 						SETBIT(newitem.vec, wordidx)
          SETBIT(__pyx_v_newitem.vec, __pyx_v_wordidx);
 0719: 					# prevent pruning of provided tags in whitelist
+0720: 					if process_lexedge[LCFRSItem_fused, LCFRSChart_fused](
          __pyx_t_31 = __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_lexedge(__pyx_v_newitem, 0.0, __pyx_v_score, __pyx_v_wordidx, __pyx_v_agenda, __pyx_v_chart, ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None)); if (unlikely(__pyx_t_31 == -1)) __PYX_ERR(0, 720, __pyx_L1_error)
          __pyx_t_4 = (__pyx_t_31 != 0);
          if (__pyx_t_4) {
/* … */
            goto __pyx_L26;
          }
/* … */
          __pyx_t_31 = __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_lexedge(__pyx_v_newitem, 0.0, __pyx_v_score, __pyx_v_wordidx, __pyx_v_agenda, __pyx_v_chart, ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None)); if (unlikely(__pyx_t_31 == -1)) __PYX_ERR(0, 720, __pyx_L1_error)
          __pyx_t_4 = (__pyx_t_31 != 0);
          if (__pyx_t_4) {
/* … */
            goto __pyx_L26;
          }
+0721: 							newitem, 0.0, score, wordidx, agenda, chart, None):
          if (!(likely(((Py_None) == Py_None) || likely(__Pyx_TypeTest(Py_None, __pyx_ptype_8discodop_10containers_Whitelist))))) __PYX_ERR(0, 721, __pyx_L1_error)
/* … */
          if (!(likely(((Py_None) == Py_None) || likely(__Pyx_TypeTest(Py_None, __pyx_ptype_8discodop_10containers_Whitelist))))) __PYX_ERR(0, 721, __pyx_L1_error)
 0722: 						if LCFRSItem_fused is SmallChartItem:
+0723: 							newitem = SmallChartItem(0, 0)
            __pyx_v_newitem = SmallChartItem(0, 0);
 0724: 						elif LCFRSItem_fused is FatChartItem:
+0725: 							newitem = FatChartItem(0)
            __pyx_v_newitem = FatChartItem(0);
+0726: 						recognized = True
            __pyx_v_recognized = 1;
/* … */
            __pyx_v_recognized = 1;
 0727: 					else:
+0728: 						raise ValueError('tag %r is blocked.' % tag)
          /*else*/ {
            __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_tag_r_is_blocked, __pyx_v_tag); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_6);
            __Pyx_GIVEREF(__pyx_t_7);
            PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7);
            __pyx_t_7 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            __Pyx_Raise(__pyx_t_7, 0, 0, 0);
            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
            __PYX_ERR(0, 728, __pyx_L1_error)
          }
          __pyx_L26:;
/* … */
          /*else*/ {
            __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_tag_r_is_blocked, __pyx_v_tag); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_6);
            __Pyx_GIVEREF(__pyx_t_7);
            PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7);
            __pyx_t_7 = 0;
            __pyx_t_7 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_6, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 728, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_7);
            __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
            __Pyx_Raise(__pyx_t_7, 0, 0, 0);
            __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
            __PYX_ERR(0, 728, __pyx_L1_error)
          }
          __pyx_L26:;
+0729: 		if not recognized:
    __pyx_t_4 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_4) {
/* … */
    }
/* … */
    __pyx_t_4 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_4) {
/* … */
    }
+0730: 			if tag is None and it == grammar.lexicalbyword.end():
      __pyx_t_3 = (__pyx_v_tag == Py_None);
      __pyx_t_20 = (__pyx_t_3 != 0);
      if (__pyx_t_20) {
      } else {
        __pyx_t_4 = __pyx_t_20;
        goto __pyx_L29_bool_binop_done;
      }
      __pyx_t_20 = ((__pyx_v_it == __pyx_v_grammar->lexicalbyword.end()) != 0);
      __pyx_t_4 = __pyx_t_20;
      __pyx_L29_bool_binop_done:;
      if (__pyx_t_4) {
/* … */
      }
/* … */
      __pyx_t_3 = (__pyx_v_tag == Py_None);
      __pyx_t_20 = (__pyx_t_3 != 0);
      if (__pyx_t_20) {
      } else {
        __pyx_t_4 = __pyx_t_20;
        goto __pyx_L29_bool_binop_done;
      }
      __pyx_t_20 = ((__pyx_v_it == __pyx_v_grammar->lexicalbyword.end()) != 0);
      __pyx_t_4 = __pyx_t_20;
      __pyx_L29_bool_binop_done:;
      if (__pyx_t_4) {
/* … */
      }
+0731: 				return False, ('no parse: no gold POS tag given '
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 731, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_6, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
        __pyx_t_7 = 0;
        __pyx_r = __pyx_t_6;
        __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        goto __pyx_L0;
/* … */
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 731, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_6, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
        __pyx_t_7 = 0;
        __pyx_r = __pyx_t_6;
        __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        goto __pyx_L0;
+0732: 						'and word %r not in lexicon' % word)
        __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_no_parse_no_gold_POS_tag_given_a, __pyx_v_word); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 732, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
/* … */
        __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_no_parse_no_gold_POS_tag_given_a, __pyx_v_word); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 732, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
+0733: 			elif tag is not None and tag not in grammar.toid:
      __pyx_t_20 = (__pyx_v_tag != Py_None);
      __pyx_t_3 = (__pyx_t_20 != 0);
      if (__pyx_t_3) {
      } else {
        __pyx_t_4 = __pyx_t_3;
        goto __pyx_L31_bool_binop_done;
      }
      __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_v_tag, ((PyObject *)__pyx_v_grammar->toid), Py_NE)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 733, __pyx_L1_error)
      __pyx_t_20 = (__pyx_t_3 != 0);
      __pyx_t_4 = __pyx_t_20;
      __pyx_L31_bool_binop_done:;
      if (__pyx_t_4) {
/* … */
      }
/* … */
      __pyx_t_20 = (__pyx_v_tag != Py_None);
      __pyx_t_3 = (__pyx_t_20 != 0);
      if (__pyx_t_3) {
      } else {
        __pyx_t_4 = __pyx_t_3;
        goto __pyx_L31_bool_binop_done;
      }
      __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_v_tag, ((PyObject *)__pyx_v_grammar->toid), Py_NE)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 733, __pyx_L1_error)
      __pyx_t_20 = (__pyx_t_3 != 0);
      __pyx_t_4 = __pyx_t_20;
      __pyx_L31_bool_binop_done:;
      if (__pyx_t_4) {
/* … */
      }
+0734: 				return False, ('no parse: gold POS tag given '
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 734, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_7, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_6);
        PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
        __pyx_t_6 = 0;
        __pyx_r = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        goto __pyx_L0;
/* … */
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 734, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_7, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_6);
        PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
        __pyx_t_6 = 0;
        __pyx_r = __pyx_t_7;
        __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        goto __pyx_L0;
+0735: 						'but tag %r not in grammar' % tag)
        __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_no_parse_gold_POS_tag_given_but, __pyx_v_tag); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 735, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
/* … */
        __pyx_t_6 = PyUnicode_Format(__pyx_kp_u_no_parse_gold_POS_tag_given_but, __pyx_v_tag); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 735, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
+0736: 			return False, 'no parse: all tags for word %r blocked' % word
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_no_parse_all_tags_for_word_r_blo, __pyx_v_word); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 736, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 736, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(Py_False);
      __Pyx_GIVEREF(Py_False);
      PyTuple_SET_ITEM(__pyx_t_6, 0, Py_False);
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      goto __pyx_L0;
/* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_7 = PyUnicode_Format(__pyx_kp_u_no_parse_all_tags_for_word_r_blo, __pyx_v_word); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 736, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 736, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_INCREF(Py_False);
      __Pyx_GIVEREF(Py_False);
      PyTuple_SET_ITEM(__pyx_t_6, 0, Py_False);
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      goto __pyx_L0;
+0737: 	return True, ''
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_tuple__7);
  __pyx_r = __pyx_tuple__7;
  goto __pyx_L0;
/* … */
  __pyx_tuple__7 = PyTuple_Pack(2, Py_True, __pyx_kp_u__3); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 737, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
/* … */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_tuple__9);
  __pyx_r = __pyx_tuple__9;
  goto __pyx_L0;
/* … */
  __pyx_tuple__9 = PyTuple_Pack(2, Py_True, __pyx_kp_u__3); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 737, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
 0738: 
 0739: 
+0740: cdef inline int process_lexedge(LCFRSItem_fused newitem,
static CYTHON_INLINE int __pyx_fuse_0_0__pyx_f_8discodop_6plcfrs_process_lexedge(SmallChartItem __pyx_v_newitem, Prob __pyx_v_prob, Prob __pyx_v_score, short __pyx_v_wordidx, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_chart, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  int __pyx_v_inagenda;
  int __pyx_v_inchart;
  ItemNo __pyx_v_itemidx;
  std::pair<Prob,Prob>  __pyx_v_scoreprob;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_0process_lexedge", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.process_lexedge", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_0_1__pyx_f_8discodop_6plcfrs_process_lexedge(CYTHON_UNUSED SmallChartItem __pyx_v_newitem, CYTHON_UNUSED Prob __pyx_v_prob, CYTHON_UNUSED Prob __pyx_v_score, CYTHON_UNUSED short __pyx_v_wordidx, CYTHON_UNUSED Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_chart, CYTHON_UNUSED struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0_1process_lexedge", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_1_0__pyx_f_8discodop_6plcfrs_process_lexedge(CYTHON_UNUSED FatChartItem __pyx_v_newitem, CYTHON_UNUSED Prob __pyx_v_prob, CYTHON_UNUSED Prob __pyx_v_score, CYTHON_UNUSED short __pyx_v_wordidx, CYTHON_UNUSED Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, CYTHON_UNUSED struct __pyx_obj_8discodop_6plcfrs_SmallLCFRSChart *__pyx_v_chart, CYTHON_UNUSED struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_0process_lexedge", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_1_1__pyx_f_8discodop_6plcfrs_process_lexedge(FatChartItem __pyx_v_newitem, Prob __pyx_v_prob, Prob __pyx_v_score, short __pyx_v_wordidx, Agenda<ItemNo,std::pair<Prob,Prob> >  &__pyx_v_agenda, struct __pyx_obj_8discodop_6plcfrs_FatLCFRSChart *__pyx_v_chart, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  int __pyx_v_inagenda;
  int __pyx_v_inchart;
  ItemNo __pyx_v_itemidx;
  std::pair<Prob,Prob>  __pyx_v_scoreprob;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1_1process_lexedge", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.process_lexedge", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0741: 		Prob prob, Prob score, short wordidx,
 0742: 		Agenda[ItemNo, pair[Prob, Prob]]& agenda, LCFRSChart_fused chart,
 0743: 		Whitelist whitelist) except -1:
 0744: 	"""Decide whether to accept a lexical edge ``(POS, word)``.
 0745: 
 0746: 	:returns: ``True`` when edge is accepted in the chart, ``False`` when
 0747: 		blocked. When ``False``, ``newitem`` may be reused."""
 0748: 	cdef bint inagenda, inchart
 0749: 	cdef ItemNo itemidx
 0750: 	cdef pair[Prob, Prob] scoreprob
 0751: 	# avoid generating code for spurious fused type combinations
 0752: 	if LCFRSItem_fused is SmallChartItem and LCFRSChart_fused is FatLCFRSChart:
+0753: 		return -1
  __pyx_r = -1;
  goto __pyx_L0;
 0754: 	elif (LCFRSItem_fused is FatChartItem
 0755: 			and LCFRSChart_fused is SmallLCFRSChart):
+0756: 		return -1
  __pyx_r = -1;
  goto __pyx_L0;
+0757: 	if chart.itemindex.find(newitem) == chart.itemindex.end():
  __pyx_t_1 = ((__pyx_v_chart->itemindex.find(__pyx_v_newitem) == __pyx_v_chart->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
/* … */
  __pyx_t_1 = ((__pyx_v_chart->itemindex.find(__pyx_v_newitem) == __pyx_v_chart->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+0758: 		itemidx = chart.itemindex[newitem] = chart.itemindex.size()
    __pyx_t_2 = __pyx_v_chart->itemindex.size();
    __pyx_v_itemidx = __pyx_t_2;
    (__pyx_v_chart->itemindex[__pyx_v_newitem]) = __pyx_t_2;
/* … */
    __pyx_t_2 = __pyx_v_chart->itemindex.size();
    __pyx_v_itemidx = __pyx_t_2;
    (__pyx_v_chart->itemindex[__pyx_v_newitem]) = __pyx_t_2;
+0759: 		chart.items.push_back(newitem)
    try {
      __pyx_v_chart->items.push_back(__pyx_v_newitem);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 759, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->items.push_back(__pyx_v_newitem);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 759, __pyx_L1_error)
    }
+0760: 		chart.parseforest.resize(chart.itemindex.size())
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_chart->itemindex.size());
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 760, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_chart->itemindex.size());
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 760, __pyx_L1_error)
    }
 0761: 		# chart.probs.resize(chart.itemindex.size())
+0762: 		chart.probs.push_back(INFINITY)
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 762, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 762, __pyx_L1_error)
    }
+0763: 		inagenda = inchart = False
    __pyx_v_inagenda = 0;
    __pyx_v_inchart = 0;
/* … */
    __pyx_v_inagenda = 0;
    __pyx_v_inchart = 0;
 0764: 	else:
+0765: 		itemidx = chart.itemindex[newitem]
  /*else*/ {
    __pyx_v_itemidx = (__pyx_v_chart->itemindex[__pyx_v_newitem]);
/* … */
  /*else*/ {
    __pyx_v_itemidx = (__pyx_v_chart->itemindex[__pyx_v_newitem]);
+0766: 		inchart = chart.parseforest[itemidx].size() != 0
    __pyx_v_inchart = ((__pyx_v_chart->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).size() != 0);
/* … */
    __pyx_v_inchart = ((__pyx_v_chart->__pyx_base.__pyx_base.parseforest[__pyx_v_itemidx]).size() != 0);
+0767: 		inagenda = agenda.member(itemidx)
    __pyx_v_inagenda = __pyx_v_agenda.member(__pyx_v_itemidx);
  }
  __pyx_L3:;
/* … */
    __pyx_v_inagenda = __pyx_v_agenda.member(__pyx_v_itemidx);
  }
  __pyx_L3:;
+0768: 	if inagenda:
  __pyx_t_1 = (__pyx_v_inagenda != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_inagenda != 0);
  if (__pyx_t_1) {
/* … */
  }
+0769: 		raise ValueError('lexical edge already in agenda: %s' %
    __pyx_t_4 = PyUnicode_Format(__pyx_kp_u_lexical_edge_already_in_agenda_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __PYX_ERR(0, 769, __pyx_L1_error)
/* … */
    __pyx_t_4 = PyUnicode_Format(__pyx_kp_u_lexical_edge_already_in_agenda_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 769, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __PYX_ERR(0, 769, __pyx_L1_error)
+0770: 				chart.itemstr(itemidx))
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 770, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 770, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_4)) {
        PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
        __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
        PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
        __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      } else
      #endif
      {
        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
        __Pyx_GIVEREF(__pyx_t_5);
        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5);
        __pyx_t_5 = 0;
        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 770, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 770, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_4)) {
        PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
        __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) {
        PyObject *__pyx_temp[2] = {__pyx_t_6, __pyx_t_5};
        __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      } else
      #endif
      {
        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
        __Pyx_GIVEREF(__pyx_t_5);
        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_t_5);
        __pyx_t_5 = 0;
        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 770, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+0771: 	elif inchart:
  __pyx_t_1 = (__pyx_v_inchart != 0);
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_1 = (__pyx_v_inchart != 0);
  if (__pyx_t_1) {
/* … */
  }
+0772: 		raise ValueError('lexical edge already in chart: %s' %
    __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_lexical_edge_already_in_chart_s, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 772, __pyx_L1_error)
/* … */
    __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_lexical_edge_already_in_chart_s, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 772, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 772, __pyx_L1_error)
+0773: 				chart.itemstr(itemidx))
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 773, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_7 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 773, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_7};
        __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_7};
        __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      } else
      #endif
      {
        __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
        __Pyx_GIVEREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_7);
        __pyx_t_7 = 0;
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
/* … */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_itemstr); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 773, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_7 = __Pyx_PyInt_From_uint32_t(__pyx_v_itemidx); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 773, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_7};
        __pyx_t_4 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
        PyObject *__pyx_temp[2] = {__pyx_t_5, __pyx_t_7};
        __pyx_t_4 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      } else
      #endif
      {
        __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
        __Pyx_GIVEREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_7);
        __pyx_t_7 = 0;
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 773, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 0774: 	# check if we need to prune this item
+0775: 	elif whitelist is not None and not checkwhitelist(
  __pyx_t_8 = (((PyObject *)__pyx_v_whitelist) != Py_None);
  __pyx_t_9 = (__pyx_t_8 != 0);
  if (__pyx_t_9) {
  } else {
    __pyx_t_1 = __pyx_t_9;
    goto __pyx_L5_bool_binop_done;
  }
/* … */
  __pyx_t_9 = ((!(__pyx_fuse_0__pyx_f_8discodop_6plcfrs_checkwhitelist(__pyx_v_newitem, __pyx_v_whitelist, 0, 0) != 0)) != 0);
  __pyx_t_1 = __pyx_t_9;
  __pyx_L5_bool_binop_done:;
/* … */
  if (__pyx_t_1) {
/* … */
  }
/* … */
  __pyx_t_8 = (((PyObject *)__pyx_v_whitelist) != Py_None);
  __pyx_t_9 = (__pyx_t_8 != 0);
  if (__pyx_t_9) {
  } else {
    __pyx_t_1 = __pyx_t_9;
    goto __pyx_L5_bool_binop_done;
  }
/* … */
  __pyx_t_9 = ((!(__pyx_fuse_1__pyx_f_8discodop_6plcfrs_checkwhitelist(__pyx_v_newitem, __pyx_v_whitelist, 0, 0) != 0)) != 0);
  __pyx_t_1 = __pyx_t_9;
  __pyx_L5_bool_binop_done:;
/* … */
  if (__pyx_t_1) {
/* … */
  }
 0776: 			newitem, whitelist, False, False):
+0777: 		return False
    __pyx_r = 0;
    goto __pyx_L0;
/* … */
    __pyx_r = 0;
    goto __pyx_L0;
 0778: 	# haven't seen this item before, won't prune
+0779: 	scoreprob.first = score
  __pyx_v_scoreprob.first = __pyx_v_score;
/* … */
  __pyx_v_scoreprob.first = __pyx_v_score;
+0780: 	scoreprob.second = prob
  __pyx_v_scoreprob.second = __pyx_v_prob;
/* … */
  __pyx_v_scoreprob.second = __pyx_v_prob;
+0781: 	agenda.setitem(itemidx, scoreprob)
  __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
/* … */
  __pyx_v_agenda.setitem(__pyx_v_itemidx, __pyx_v_scoreprob);
+0782: 	assert not agenda.empty(), agenda.size()
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((!(__pyx_v_agenda.empty() != 0)) != 0))) {
      __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_v_agenda.size()); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 782, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 782, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_3);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
      __pyx_t_3 = 0;
      PyErr_SetObject(PyExc_AssertionError, __pyx_t_4);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __PYX_ERR(0, 782, __pyx_L1_error)
    }
  }
  #endif
/* … */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    if (unlikely(!((!(__pyx_v_agenda.empty() != 0)) != 0))) {
      __pyx_t_3 = __Pyx_PyInt_FromSize_t(__pyx_v_agenda.size()); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 782, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 782, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_3);
      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
      __pyx_t_3 = 0;
      PyErr_SetObject(PyExc_AssertionError, __pyx_t_4);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __PYX_ERR(0, 782, __pyx_L1_error)
    }
  }
  #endif
+0783: 	chart.addlexedge(itemidx, wordidx)
  ((struct __pyx_vtabstruct_8discodop_6plcfrs_SmallLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.addlexedge(((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_v_chart), __pyx_v_itemidx, __pyx_v_wordidx);
/* … */
  ((struct __pyx_vtabstruct_8discodop_6plcfrs_FatLCFRSChart *)__pyx_v_chart->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.addlexedge(((struct __pyx_obj_8discodop_6plcfrs_LCFRSChart *)__pyx_v_chart), __pyx_v_itemidx, __pyx_v_wordidx);
+0784: 	return True
  __pyx_r = 1;
  goto __pyx_L0;
/* … */
  __pyx_r = 1;
  goto __pyx_L0;
 0785: 
 0786: 
+0787: cdef inline bint checkwhitelist(LCFRSItem_fused newitem, Whitelist whitelist,
static CYTHON_INLINE int __pyx_fuse_0__pyx_f_8discodop_6plcfrs_checkwhitelist(SmallChartItem __pyx_v_newitem, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin) {
  uint32_t __pyx_v_cnt;
  Label __pyx_v_label;
  int __pyx_v_a;
  int __pyx_v_b;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0checkwhitelist", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_1__pyx_f_8discodop_6plcfrs_checkwhitelist(FatChartItem __pyx_v_newitem, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, int __pyx_v_splitprune, int __pyx_v_markorigin) {
  uint32_t __pyx_v_n;
  uint32_t __pyx_v_cnt;
  Label __pyx_v_label;
  int __pyx_v_a;
  int __pyx_v_b;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1checkwhitelist", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0788: 		bint splitprune, bint markorigin):
 0789: 	"""Return False if item is not on whitelist."""
 0790: 	cdef uint32_t n, cnt
 0791: 	cdef Label label
 0792: 	cdef int a, b
+0793: 	if whitelist is None:
  __pyx_t_1 = (((PyObject *)__pyx_v_whitelist) == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
/* … */
  __pyx_t_1 = (((PyObject *)__pyx_v_whitelist) == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
+0794: 		return True
    __pyx_r = 1;
    goto __pyx_L0;
/* … */
    __pyx_r = 1;
    goto __pyx_L0;
+0795: 	elif splitprune:  # disc. item to be treated as several split items?
  __pyx_t_2 = (__pyx_v_splitprune != 0);
  if (__pyx_t_2) {
/* … */
    goto __pyx_L3;
  }
/* … */
  __pyx_t_2 = (__pyx_v_splitprune != 0);
  if (__pyx_t_2) {
/* … */
    goto __pyx_L3;
  }
+0796: 		b = cnt = 0
    __pyx_v_b = 0;
    __pyx_v_cnt = 0;
/* … */
    __pyx_v_b = 0;
    __pyx_v_cnt = 0;
+0797: 		if markorigin:
    __pyx_t_2 = (__pyx_v_markorigin != 0);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
/* … */
    __pyx_t_2 = (__pyx_v_markorigin != 0);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L4;
    }
+0798: 			if whitelist.splitmapping[newitem.label] is NULL:
      __pyx_t_2 = (((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label]) == NULL) != 0);
      if (__pyx_t_2) {
/* … */
      }
/* … */
      __pyx_t_2 = (((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label]) == NULL) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0799: 				return True
        __pyx_r = 1;
        goto __pyx_L0;
/* … */
        __pyx_r = 1;
        goto __pyx_L0;
 0800: 		else:
+0801: 			if whitelist.mapping[newitem.label] != 0:
    /*else*/ {
      __pyx_t_2 = (((__pyx_v_whitelist->mapping[__pyx_v_newitem.label]) != 0) != 0);
      if (__pyx_t_2) {
/* … */
      }
/* … */
    /*else*/ {
      __pyx_t_2 = (((__pyx_v_whitelist->mapping[__pyx_v_newitem.label]) != 0) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0802: 				return True
        __pyx_r = 1;
        goto __pyx_L0;
/* … */
        __pyx_r = 1;
        goto __pyx_L0;
 0803: 			if LCFRSItem_fused is SmallChartItem:
+0804: 				COMPONENT.label = whitelist.splitmapping[
      __pyx_v_8discodop_6plcfrs_COMPONENT.label = ((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label])[__pyx_v_cnt]);
    }
    __pyx_L4:;
 0805: 						newitem.label][cnt]
 0806: 			elif LCFRSItem_fused is FatChartItem:
+0807: 				FATCOMPONENT.label = whitelist.splitmapping[
      __pyx_v_8discodop_6plcfrs_FATCOMPONENT.label = ((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label])[__pyx_v_cnt]);
    }
    __pyx_L4:;
 0808: 						newitem.label][cnt]
 0809: 		if LCFRSItem_fused is SmallChartItem:
+0810: 			a = nextset(newitem.vec, b)
    __pyx_v_a = __pyx_f_8discodop_3bit_nextset(__pyx_v_newitem.vec, __pyx_v_b);
 0811: 		elif LCFRSItem_fused is FatChartItem:
+0812: 			a = anextset(newitem.vec, b, SLOTS)
    __pyx_v_a = __pyx_f_8discodop_3bit_anextset(__pyx_v_newitem.vec, __pyx_v_b, 2);
+0813: 		while a != -1:
    while (1) {
      __pyx_t_2 = ((__pyx_v_a != -1L) != 0);
      if (!__pyx_t_2) break;
/* … */
    while (1) {
      __pyx_t_2 = ((__pyx_v_a != -1L) != 0);
      if (!__pyx_t_2) break;
 0814: 			if LCFRSItem_fused is SmallChartItem:
+0815: 				b = nextunset(newitem.vec, a)
      __pyx_v_b = __pyx_f_8discodop_3bit_nextunset(__pyx_v_newitem.vec, __pyx_v_a);
 0816: 				# given a=3, b=6, make bitvector: 1000000 - 1000 = 111000
+0817: 				COMPONENT.vec = (1UL << b) - (1UL << a)
      __pyx_v_8discodop_6plcfrs_COMPONENT.vec = ((1UL << __pyx_v_b) - (1UL << __pyx_v_a));
+0818: 				if markorigin:
      __pyx_t_2 = (__pyx_v_markorigin != 0);
      if (__pyx_t_2) {
/* … */
      }
+0819: 					COMPONENT.label = whitelist.splitmapping[
        __pyx_v_8discodop_6plcfrs_COMPONENT.label = ((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label])[__pyx_v_cnt]);
 0820: 							newitem.label][cnt]
+0821: 				if whitelist.small[COMPONENT.label].count(COMPONENT) == 0:
      __pyx_t_2 = (((__pyx_v_whitelist->small[__pyx_v_8discodop_6plcfrs_COMPONENT.label]).count(__pyx_v_8discodop_6plcfrs_COMPONENT) == 0) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0822: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
+0823: 				a = nextset(newitem.vec, b)
      __pyx_v_a = __pyx_f_8discodop_3bit_nextset(__pyx_v_newitem.vec, __pyx_v_b);
 0824: 			elif LCFRSItem_fused is FatChartItem:
+0825: 				b = anextunset(newitem.vec, a, SLOTS)
      __pyx_v_b = __pyx_f_8discodop_3bit_anextunset(__pyx_v_newitem.vec, __pyx_v_a, 2);
 0826: 				# given a=3, b=6, make bitvector: 1000000 - 1000 = 111000
+0827: 				memset(<void *>FATCOMPONENT.vec, 0, SLOTS * sizeof(uint64_t))
      memset(((void *)__pyx_v_8discodop_6plcfrs_FATCOMPONENT.vec), 0, (2 * (sizeof(uint64_t))));
+0828: 				for n in range(a, b):
      __pyx_t_3 = __pyx_v_b;
      for (__pyx_t_4 = __pyx_v_a; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
        __pyx_v_n = __pyx_t_4;
+0829: 					SETBIT(FATCOMPONENT.vec, n)
        SETBIT(__pyx_v_8discodop_6plcfrs_FATCOMPONENT.vec, __pyx_v_n);
      }
+0830: 				if markorigin:
      __pyx_t_2 = (__pyx_v_markorigin != 0);
      if (__pyx_t_2) {
/* … */
      }
+0831: 					FATCOMPONENT.label = whitelist.splitmapping[
        __pyx_v_8discodop_6plcfrs_FATCOMPONENT.label = ((__pyx_v_whitelist->splitmapping[__pyx_v_newitem.label])[__pyx_v_cnt]);
 0832: 							newitem.label][cnt]
+0833: 				if whitelist.fat[FATCOMPONENT.label].count(
      if (__pyx_t_2) {
/* … */
      }
+0834: 						FATCOMPONENT) == 0:
      __pyx_t_2 = (((__pyx_v_whitelist->fat[__pyx_v_8discodop_6plcfrs_FATCOMPONENT.label]).count(__pyx_v_8discodop_6plcfrs_FATCOMPONENT) == 0) != 0);
+0835: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
+0836: 				a = anextset(newitem.vec, b, SLOTS)
      __pyx_v_a = __pyx_f_8discodop_3bit_anextset(__pyx_v_newitem.vec, __pyx_v_b, 2);
+0837: 			cnt += 1
      __pyx_v_cnt = (__pyx_v_cnt + 1);
    }
/* … */
      __pyx_v_cnt = (__pyx_v_cnt + 1);
    }
+0838: 	elif whitelist.mapping[newitem.label] != 0:
  __pyx_t_2 = (((__pyx_v_whitelist->mapping[__pyx_v_newitem.label]) != 0) != 0);
  if (__pyx_t_2) {
/* … */
  }
  __pyx_L3:;
/* … */
  __pyx_t_2 = (((__pyx_v_whitelist->mapping[__pyx_v_newitem.label]) != 0) != 0);
  if (__pyx_t_2) {
/* … */
  }
  __pyx_L3:;
+0839: 		label = newitem.label
    __pyx_t_3 = __pyx_v_newitem.label;
    __pyx_v_label = __pyx_t_3;
/* … */
    __pyx_t_5 = __pyx_v_newitem.label;
    __pyx_v_label = __pyx_t_5;
+0840: 		newitem.label = whitelist.mapping[label]
    __pyx_v_newitem.label = (__pyx_v_whitelist->mapping[__pyx_v_label]);
/* … */
    __pyx_v_newitem.label = (__pyx_v_whitelist->mapping[__pyx_v_label]);
 0841: 		if LCFRSItem_fused is SmallChartItem:
+0842: 			if whitelist.small[newitem.label].count(newitem) == 0:
    __pyx_t_2 = (((__pyx_v_whitelist->small[__pyx_v_newitem.label]).count(__pyx_v_newitem) == 0) != 0);
    if (__pyx_t_2) {
/* … */
    }
+0843: 				return False
      __pyx_r = 0;
      goto __pyx_L0;
 0844: 		elif LCFRSItem_fused is FatChartItem:
+0845: 			if whitelist.fat[newitem.label].count(newitem) == 0:
    __pyx_t_2 = (((__pyx_v_whitelist->fat[__pyx_v_newitem.label]).count(__pyx_v_newitem) == 0) != 0);
    if (__pyx_t_2) {
/* … */
    }
+0846: 				return False
      __pyx_r = 0;
      goto __pyx_L0;
+0847: 		newitem.label = label
    __pyx_v_newitem.label = __pyx_v_label;
/* … */
    __pyx_v_newitem.label = __pyx_v_label;
+0848: 	return True
  __pyx_r = 1;
  goto __pyx_L0;
/* … */
  __pyx_r = 1;
  goto __pyx_L0;
 0849: 
 0850: 
+0851: cdef inline void combine_item(LCFRSItem_fused *newitem,
static CYTHON_INLINE void __pyx_fuse_0__pyx_f_8discodop_6plcfrs_combine_item(SmallChartItem *__pyx_v_newitem, SmallChartItem *__pyx_v_left, SmallChartItem *__pyx_v_right) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0combine_item", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}

static CYTHON_INLINE void __pyx_fuse_1__pyx_f_8discodop_6plcfrs_combine_item(FatChartItem *__pyx_v_newitem, FatChartItem *__pyx_v_left, FatChartItem *__pyx_v_right) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1combine_item", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
 0852: 		LCFRSItem_fused *left, LCFRSItem_fused *right):
 0853: 	if LCFRSItem_fused is SmallChartItem:
+0854: 		newitem[0].vec = left[0].vec ^ right[0].vec
  (__pyx_v_newitem[0]).vec = ((__pyx_v_left[0]).vec ^ (__pyx_v_right[0]).vec);
 0855: 	elif LCFRSItem_fused is FatChartItem:
+0856: 		setunion(newitem[0].vec, left[0].vec, right[0].vec, SLOTS)
  __pyx_f_8discodop_3bit_setunion((__pyx_v_newitem[0]).vec, (__pyx_v_left[0]).vec, (__pyx_v_right[0]).vec, 2);
 0857: 
 0858: 
+0859: cdef inline bint concat(ProbRule *rule,
static CYTHON_INLINE int __pyx_fuse_0__pyx_f_8discodop_6plcfrs_concat(ProbRule *__pyx_v_rule, SmallChartItem *__pyx_v_left, SmallChartItem *__pyx_v_right) {
  uint64_t __pyx_v_lvec;
  uint64_t __pyx_v_rvec;
  uint64_t __pyx_v_mask;
  int __pyx_v_n;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0concat", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static CYTHON_INLINE int __pyx_fuse_1__pyx_f_8discodop_6plcfrs_concat(ProbRule *__pyx_v_rule, FatChartItem *__pyx_v_left, FatChartItem *__pyx_v_right) {
  uint64_t *__pyx_v_alvec;
  uint64_t *__pyx_v_arvec;
  int __pyx_v_lpos;
  int __pyx_v_rpos;
  int __pyx_v_n;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1concat", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 0860: 		LCFRSItem_fused *left, LCFRSItem_fused *right):
 0861: 	"""Test whether two bitvectors combine according to a given rule.
 0862: 
 0863: 	Ranges should be non-overlapping, continuous when they are concatenated,
 0864: 	and adhere to the ordering in the yield function. The yield function
 0865: 	indicates for each span whether it should come from the left or right
 0866: 	non-terminal (0 meaning left and 1 right), and whether it is contiguous
 0867: 	with the previous span.
 0868: 
 0869: 	>>> lvec = 0b0011; rvec = 0b1000
 0870: 	>>> concat(((0, ), (1, )), lvec, rvec)
 0871: 	True		# discontinuous, non-overlapping, linearly ordered.
 0872: 	>>> concat(((0, 1), ), lvec, rvec)
 0873: 	False		# lvec and rvec are not contiguous
 0874: 	>>> concat(((1, ), (0, )), lvec, rvec)
 0875: 	False		# rvec's span should come after lvec's span
 0876: 
 0877: 	The actual yield functions are encoded in a binary format
 0878: 	(cf. containers.pyx)::
 0879: 		((0, 1, 0), (1, 0)) ==> args=0b10010; lengths=0b00101
 0880: 	NB: note reversal due to the way binary numbers are represented
 0881: 	the least significant bit (rightmost) corresponds to the lowest
 0882: 	index in the sentence / constituent (leftmost)."""
 0883: 	cdef uint64_t lvec, rvec, mask
 0884: 	cdef uint64_t *alvec
 0885: 	cdef uint64_t *arvec
 0886: 	cdef int lpos, rpos, n
 0887: 	if LCFRSItem_fused is SmallChartItem:
+0888: 		lvec = left[0].vec
  __pyx_t_1 = (__pyx_v_left[0]).vec;
  __pyx_v_lvec = __pyx_t_1;
+0889: 		rvec = right[0].vec
  __pyx_t_1 = (__pyx_v_right[0]).vec;
  __pyx_v_rvec = __pyx_t_1;
+0890: 		if lvec & rvec:
  __pyx_t_2 = ((__pyx_v_lvec & __pyx_v_rvec) != 0);
  if (__pyx_t_2) {
/* … */
  }
+0891: 			return False
    __pyx_r = 0;
    goto __pyx_L0;
+0892: 		mask = rvec if testbit(rule.args, 0) else lvec
  if ((__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->args, 0) != 0)) {
    __pyx_t_1 = __pyx_v_rvec;
  } else {
    __pyx_t_1 = __pyx_v_lvec;
  }
  __pyx_v_mask = __pyx_t_1;
+0893: 		for n in range(bitlength(rule.lengths)):
  __pyx_t_3 = __pyx_f_8discodop_3bit_bitlength(__pyx_v_rule->lengths);
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_n = __pyx_t_4;
+0894: 			if testbit(rule.args, n):  # component from right vector
    __pyx_t_2 = (__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->args, __pyx_v_n) != 0);
    if (__pyx_t_2) {
/* … */
      goto __pyx_L6;
    }
+0895: 				if rvec & mask == 0:
      __pyx_t_2 = (((__pyx_v_rvec & __pyx_v_mask) == 0) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0896: 					return False  # check for expected component
        __pyx_r = 0;
        goto __pyx_L0;
+0897: 				rvec |= rvec - 1  # trailing 0 bits => 1 bits
      __pyx_v_rvec = (__pyx_v_rvec | (__pyx_v_rvec - 1));
+0898: 				mask = rvec & (~rvec - 1)  # mask of 1 bits up to first 0 bit
      __pyx_v_mask = (__pyx_v_rvec & ((~__pyx_v_rvec) - 1));
 0899: 			else:  # component from left vector
+0900: 				if lvec & mask == 0:
    /*else*/ {
      __pyx_t_2 = (((__pyx_v_lvec & __pyx_v_mask) == 0) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0901: 					return False  # check for expected component
        __pyx_r = 0;
        goto __pyx_L0;
+0902: 				lvec |= lvec - 1  # trailing 0 bits => 1 bits
      __pyx_v_lvec = (__pyx_v_lvec | (__pyx_v_lvec - 1));
+0903: 				mask = lvec & (~lvec - 1)  # mask of 1 bits up to first 0 bit
      __pyx_v_mask = (__pyx_v_lvec & ((~__pyx_v_lvec) - 1));
    }
    __pyx_L6:;
 0904: 			# zero out component
+0905: 			lvec &= ~mask
    __pyx_v_lvec = (__pyx_v_lvec & (~__pyx_v_mask));
+0906: 			rvec &= ~mask
    __pyx_v_rvec = (__pyx_v_rvec & (~__pyx_v_mask));
+0907: 			if testbit(rule.lengths, n):  # a gap
    __pyx_t_2 = (__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->lengths, __pyx_v_n) != 0);
    if (__pyx_t_2) {
/* … */
    }
 0908: 				# check that there is a gap in both vectors
+0909: 				if (lvec ^ rvec) & (mask + 1):
      __pyx_t_2 = (((__pyx_v_lvec ^ __pyx_v_rvec) & (__pyx_v_mask + 1)) != 0);
      if (__pyx_t_2) {
/* … */
      }
+0910: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
 0911: 				# increase mask to cover gap
 0912: 				# get minimum of trailing zero bits of lvec & rvec
+0913: 				mask = (~lvec & (lvec - 1)) & (~rvec & (rvec - 1))
      __pyx_v_mask = (((~__pyx_v_lvec) & (__pyx_v_lvec - 1)) & ((~__pyx_v_rvec) & (__pyx_v_rvec - 1)));
+0914: 			mask += 1  # e.g., 00111 => 01000
    __pyx_v_mask = (__pyx_v_mask + 1);
  }
 0915: 		# success if we've reached the end of both left and right vector
+0916: 		return lvec == rvec == 0
  __pyx_t_2 = (__pyx_v_lvec == __pyx_v_rvec);
  if (__pyx_t_2) {
    __pyx_t_2 = (__pyx_v_rvec == 0);
  }
  __pyx_r = __pyx_t_2;
  goto __pyx_L0;
 0917: 	elif LCFRSItem_fused is FatChartItem:
+0918: 		alvec = left[0].vec
  __pyx_t_1 = (__pyx_v_left[0]).vec;
  __pyx_v_alvec = __pyx_t_1;
+0919: 		arvec = right[0].vec
  __pyx_t_1 = (__pyx_v_right[0]).vec;
  __pyx_v_arvec = __pyx_t_1;
+0920: 		for n in range(SLOTS):
  for (__pyx_t_2 = 0; __pyx_t_2 < 2; __pyx_t_2+=1) {
    __pyx_v_n = __pyx_t_2;
+0921: 			if alvec[n] & arvec[n]:
    __pyx_t_3 = (((__pyx_v_alvec[__pyx_v_n]) & (__pyx_v_arvec[__pyx_v_n])) != 0);
    if (__pyx_t_3) {
/* … */
    }
  }
+0922: 				return False
      __pyx_r = 0;
      goto __pyx_L0;
+0923: 		lpos = anextset(alvec, 0, SLOTS)
  __pyx_v_lpos = __pyx_f_8discodop_3bit_anextset(__pyx_v_alvec, 0, 2);
+0924: 		rpos = anextset(arvec, 0, SLOTS)
  __pyx_v_rpos = __pyx_f_8discodop_3bit_anextset(__pyx_v_arvec, 0, 2);
 0925: 		# this algorithm was adapted from rparse, FastYFComposer.
+0926: 		for n in range(bitlength(rule.lengths)):
  __pyx_t_2 = __pyx_f_8discodop_3bit_bitlength(__pyx_v_rule->lengths);
  for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_2; __pyx_t_4+=1) {
    __pyx_v_n = __pyx_t_4;
+0927: 			if testbit(rule.args, n):
    __pyx_t_3 = (__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->args, __pyx_v_n) != 0);
    if (__pyx_t_3) {
/* … */
      goto __pyx_L8;
    }
 0928: 				# check if there are any bits left, and
 0929: 				# if any bits on the right should have gone before
 0930: 				# ones on this side
+0931: 				if rpos == -1 or (lpos != -1 and lpos <= rpos):
      __pyx_t_5 = ((__pyx_v_rpos == -1L) != 0);
      if (!__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L10_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_lpos != -1L) != 0);
      if (__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L10_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_lpos <= __pyx_v_rpos) != 0);
      __pyx_t_3 = __pyx_t_5;
      __pyx_L10_bool_binop_done:;
      if (__pyx_t_3) {
/* … */
      }
+0932: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
 0933: 				# jump to next gap
+0934: 				rpos = anextunset(arvec, rpos, SLOTS)
      __pyx_v_rpos = __pyx_f_8discodop_3bit_anextunset(__pyx_v_arvec, __pyx_v_rpos, 2);
+0935: 				if lpos != -1 and lpos < rpos:
      __pyx_t_5 = ((__pyx_v_lpos != -1L) != 0);
      if (__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L14_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_lpos < __pyx_v_rpos) != 0);
      __pyx_t_3 = __pyx_t_5;
      __pyx_L14_bool_binop_done:;
      if (__pyx_t_3) {
/* … */
      }
+0936: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
 0937: 				# there should be a gap if and only if
 0938: 				# this is the last element of this argument
+0939: 				if testbit(rule.lengths, n):
      __pyx_t_3 = (__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->lengths, __pyx_v_n) != 0);
      if (__pyx_t_3) {
/* … */
        goto __pyx_L16;
      }
+0940: 					if TESTBIT(alvec, rpos):
        __pyx_t_3 = (TESTBIT(__pyx_v_alvec, __pyx_v_rpos) != 0);
        if (__pyx_t_3) {
/* … */
        }
+0941: 						return False
          __pyx_r = 0;
          goto __pyx_L0;
+0942: 				elif not TESTBIT(alvec, rpos):
      __pyx_t_3 = ((!(TESTBIT(__pyx_v_alvec, __pyx_v_rpos) != 0)) != 0);
      if (__pyx_t_3) {
/* … */
      }
      __pyx_L16:;
+0943: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
 0944: 				# jump to next argument
+0945: 				rpos = anextset(arvec, rpos, SLOTS)
      __pyx_v_rpos = __pyx_f_8discodop_3bit_anextset(__pyx_v_arvec, __pyx_v_rpos, 2);
 0946: 			else:  # if bit == 0:
 0947: 				# vice versa to the above
+0948: 				if lpos == -1 or (rpos != -1 and rpos <= lpos):
    /*else*/ {
      __pyx_t_5 = ((__pyx_v_lpos == -1L) != 0);
      if (!__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L19_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_rpos != -1L) != 0);
      if (__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L19_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_rpos <= __pyx_v_lpos) != 0);
      __pyx_t_3 = __pyx_t_5;
      __pyx_L19_bool_binop_done:;
      if (__pyx_t_3) {
/* … */
      }
+0949: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
+0950: 				lpos = anextunset(alvec, lpos, SLOTS)
      __pyx_v_lpos = __pyx_f_8discodop_3bit_anextunset(__pyx_v_alvec, __pyx_v_lpos, 2);
+0951: 				if rpos != -1 and rpos < lpos:
      __pyx_t_5 = ((__pyx_v_rpos != -1L) != 0);
      if (__pyx_t_5) {
      } else {
        __pyx_t_3 = __pyx_t_5;
        goto __pyx_L23_bool_binop_done;
      }
      __pyx_t_5 = ((__pyx_v_rpos < __pyx_v_lpos) != 0);
      __pyx_t_3 = __pyx_t_5;
      __pyx_L23_bool_binop_done:;
      if (__pyx_t_3) {
/* … */
      }
+0952: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
+0953: 				if testbit(rule.lengths, n):
      __pyx_t_3 = (__pyx_fuse_2__pyx_f_8discodop_3bit_testbit(__pyx_v_rule->lengths, __pyx_v_n) != 0);
      if (__pyx_t_3) {
/* … */
        goto __pyx_L25;
      }
+0954: 					if TESTBIT(arvec, lpos):
        __pyx_t_3 = (TESTBIT(__pyx_v_arvec, __pyx_v_lpos) != 0);
        if (__pyx_t_3) {
/* … */
        }
+0955: 						return False
          __pyx_r = 0;
          goto __pyx_L0;
+0956: 				elif not TESTBIT(arvec, lpos):
      __pyx_t_3 = ((!(TESTBIT(__pyx_v_arvec, __pyx_v_lpos) != 0)) != 0);
      if (__pyx_t_3) {
/* … */
      }
      __pyx_L25:;
+0957: 					return False
        __pyx_r = 0;
        goto __pyx_L0;
+0958: 				lpos = anextset(alvec, lpos, SLOTS)
      __pyx_v_lpos = __pyx_f_8discodop_3bit_anextset(__pyx_v_alvec, __pyx_v_lpos, 2);
    }
    __pyx_L8:;
  }
+0959: 		return lpos == rpos == -1
  __pyx_t_3 = (__pyx_v_lpos == __pyx_v_rpos);
  if (__pyx_t_3) {
    __pyx_t_3 = (__pyx_v_rpos == -1L);
  }
  __pyx_r = __pyx_t_3;
  goto __pyx_L0;
 0960: 
 0961: 
+0962: def testsent(sent, grammar):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_3testsent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_2testsent[] = "testsent(sent, grammar)\nParse sentence with grammar and print 10 best derivations.";
static PyMethodDef __pyx_mdef_8discodop_6plcfrs_3testsent = {"testsent", (PyCFunction)__pyx_pw_8discodop_6plcfrs_3testsent, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8discodop_6plcfrs_2testsent};
static PyObject *__pyx_pw_8discodop_6plcfrs_3testsent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_sent = 0;
  PyObject *__pyx_v_grammar = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("testsent (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_sent,&__pyx_n_s_grammar,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sent)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grammar)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("testsent", 1, 2, 2, 1); __PYX_ERR(0, 962, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "testsent") < 0)) __PYX_ERR(0, 962, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_sent = values[0];
    __pyx_v_grammar = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("testsent", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 962, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.plcfrs.testsent", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_6plcfrs_2testsent(__pyx_self, __pyx_v_sent, __pyx_v_grammar);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_2testsent(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_sent, PyObject *__pyx_v_grammar) {
  PyObject *__pyx_v_exp = NULL;
  PyObject *__pyx_v_lazykbest = NULL;
  PyObject *__pyx_v_chart = NULL;
  PyObject *__pyx_v_msg = NULL;
  PyObject *__pyx_v_derivations = NULL;
  PyObject *__pyx_v_a = NULL;
  PyObject *__pyx_v_p = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("testsent", 0);
  __Pyx_INCREF(__pyx_v_sent);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("discodop.plcfrs.testsent", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_exp);
  __Pyx_XDECREF(__pyx_v_lazykbest);
  __Pyx_XDECREF(__pyx_v_chart);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XDECREF(__pyx_v_derivations);
  __Pyx_XDECREF(__pyx_v_a);
  __Pyx_XDECREF(__pyx_v_p);
  __Pyx_XDECREF(__pyx_v_sent);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__67 = PyTuple_Pack(9, __pyx_n_s_sent, __pyx_n_s_grammar, __pyx_n_s_exp, __pyx_n_s_lazykbest, __pyx_n_s_chart, __pyx_n_s_msg, __pyx_n_s_derivations, __pyx_n_s_a, __pyx_n_s_p); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(0, 962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__67);
  __Pyx_GIVEREF(__pyx_tuple__67);
/* … */
  __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_8discodop_6plcfrs_3testsent, NULL, __pyx_n_s_discodop_plcfrs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 962, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_testsent, __pyx_t_4) < 0) __PYX_ERR(0, 962, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__68 = (PyObject*)__Pyx_PyCode_New(2, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__67, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_discodop_plcfrs_pyx, __pyx_n_s_testsent, 962, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__68)) __PYX_ERR(0, 962, __pyx_L1_error)
 0963: 	"""Parse sentence with grammar and print 10 best derivations."""
+0964: 	from math import exp
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_exp);
  __Pyx_GIVEREF(__pyx_n_s_exp);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_exp);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_exp); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 964, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_exp = __pyx_t_1;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+0965: 	from .kbest import lazykbest
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 965, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_lazykbest);
  __Pyx_GIVEREF(__pyx_n_s_lazykbest);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_lazykbest);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_kbest, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 965, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_lazykbest); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 965, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_t_2);
  __pyx_v_lazykbest = __pyx_t_2;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0966: 	print('len', len(sent.split()), 'sentence:', sent)
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_sent, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 966, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 966, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 966, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 966, __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_ERR(0, 966, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 966, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_u_len);
  __Pyx_GIVEREF(__pyx_n_u_len);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_u_len);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __Pyx_INCREF(__pyx_kp_u_sentence);
  __Pyx_GIVEREF(__pyx_kp_u_sentence);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_kp_u_sentence);
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_sent);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 966, __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;
+0967: 	sent = sent.split()
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_sent, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 967, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 967, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 967, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF_SET(__pyx_v_sent, __pyx_t_1);
  __pyx_t_1 = 0;
+0968: 	chart, msg = parse(sent, grammar)
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_parse); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 968, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_5 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_sent, __pyx_v_grammar};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_sent, __pyx_v_grammar};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else
  #endif
  {
    __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(__pyx_v_sent);
    __Pyx_GIVEREF(__pyx_v_sent);
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_sent);
    __Pyx_INCREF(__pyx_v_grammar);
    __Pyx_GIVEREF(__pyx_v_grammar);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_grammar);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if !CYTHON_COMPILING_IN_PYPY
    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_ERR(0, 968, __pyx_L1_error)
    }
    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_6);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 968, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_2 = __pyx_t_7(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    index = 1; __pyx_t_6 = __pyx_t_7(__pyx_t_3); if (unlikely(!__pyx_t_6)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_6);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_3), 2) < 0) __PYX_ERR(0, 968, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 968, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_chart = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_msg = __pyx_t_6;
  __pyx_t_6 = 0;
+0969: 	if len(sent) < 10:
  __pyx_t_4 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 969, __pyx_L1_error)
  __pyx_t_8 = ((__pyx_t_4 < 10) != 0);
  if (__pyx_t_8) {
/* … */
  }
+0970: 		print(chart)
    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 970, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_chart);
    __Pyx_GIVEREF(__pyx_v_chart);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_chart);
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_1, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 970, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+0971: 	if chart:
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_chart); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 971, __pyx_L1_error)
  if (__pyx_t_8) {
/* … */
  }
+0972: 		print('10 best parse trees (1 expected):')
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 972, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
/* … */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_10_best_parse_trees_1_expected); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 972, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
+0973: 		derivations = lazykbest(chart, 10)
    __Pyx_INCREF(__pyx_v_lazykbest);
    __pyx_t_1 = __pyx_v_lazykbest; __pyx_t_2 = NULL;
    __pyx_t_5 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
        __pyx_t_5 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_1)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_chart, __pyx_int_10};
      __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 973, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_6);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_1)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_v_chart, __pyx_int_10};
      __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 973, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_6);
    } else
    #endif
    {
      __pyx_t_3 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 973, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (__pyx_t_2) {
        __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = NULL;
      }
      __Pyx_INCREF(__pyx_v_chart);
      __Pyx_GIVEREF(__pyx_v_chart);
      PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_5, __pyx_v_chart);
      __Pyx_INCREF(__pyx_int_10);
      __Pyx_GIVEREF(__pyx_int_10);
      PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_5, __pyx_int_10);
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 973, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_derivations = __pyx_t_6;
    __pyx_t_6 = 0;
+0974: 		for a, p in derivations:
    if (likely(PyList_CheckExact(__pyx_v_derivations)) || PyTuple_CheckExact(__pyx_v_derivations)) {
      __pyx_t_6 = __pyx_v_derivations; __Pyx_INCREF(__pyx_t_6); __pyx_t_4 = 0;
      __pyx_t_9 = NULL;
    } else {
      __pyx_t_4 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_derivations); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 974, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 974, __pyx_L1_error)
    }
    for (;;) {
      if (likely(!__pyx_t_9)) {
        if (likely(PyList_CheckExact(__pyx_t_6))) {
          if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_6)) break;
          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
          __pyx_t_1 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 974, __pyx_L1_error)
          #else
          __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 974, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          #endif
        } else {
          if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
          #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
          __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 974, __pyx_L1_error)
          #else
          __pyx_t_1 = PySequence_ITEM(__pyx_t_6, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 974, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          #endif
        }
      } else {
        __pyx_t_1 = __pyx_t_9(__pyx_t_6);
        if (unlikely(!__pyx_t_1)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else __PYX_ERR(0, 974, __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 !CYTHON_COMPILING_IN_PYPY
        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_ERR(0, 974, __pyx_L1_error)
        }
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_2);
        #else
        __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 974, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 974, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        #endif
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_10 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 974, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __pyx_t_7 = Py_TYPE(__pyx_t_10)->tp_iternext;
        index = 0; __pyx_t_3 = __pyx_t_7(__pyx_t_10); if (unlikely(!__pyx_t_3)) goto __pyx_L9_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_3);
        index = 1; __pyx_t_2 = __pyx_t_7(__pyx_t_10); if (unlikely(!__pyx_t_2)) goto __pyx_L9_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_2);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_10), 2) < 0) __PYX_ERR(0, 974, __pyx_L1_error)
        __pyx_t_7 = NULL;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        goto __pyx_L10_unpacking_done;
        __pyx_L9_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
        __pyx_t_7 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        __PYX_ERR(0, 974, __pyx_L1_error)
        __pyx_L10_unpacking_done:;
      }
      __Pyx_XDECREF_SET(__pyx_v_a, __pyx_t_3);
      __pyx_t_3 = 0;
      __Pyx_XDECREF_SET(__pyx_v_p, __pyx_t_2);
      __pyx_t_2 = 0;
/* … */
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+0975: 			print(exp(-p), a)
      __pyx_t_2 = PyNumber_Negative(__pyx_v_p); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 975, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_exp);
      __pyx_t_3 = __pyx_v_exp; __pyx_t_10 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_10)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_10);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (!__pyx_t_10) {
        __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_GOTREF(__pyx_t_1);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_3)) {
          PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_2};
          __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
          PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_2};
          __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        } else
        #endif
        {
          __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 975, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10); __pyx_t_10 = NULL;
          __Pyx_GIVEREF(__pyx_t_2);
          PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_2);
          __pyx_t_2 = 0;
          __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_1);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 975, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
      __Pyx_INCREF(__pyx_v_a);
      __Pyx_GIVEREF(__pyx_v_a);
      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_a);
      __pyx_t_1 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 975, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0976: 		print()
    __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_builtin_print); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 976, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+0977: 		assert len(derivations) == 1
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      __pyx_t_4 = PyObject_Length(__pyx_v_derivations); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 977, __pyx_L1_error)
      if (unlikely(!((__pyx_t_4 == 1) != 0))) {
        PyErr_SetNone(PyExc_AssertionError);
        __PYX_ERR(0, 977, __pyx_L1_error)
      }
    }
    #endif
+0978: 		return True
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(Py_True);
    __pyx_r = Py_True;
    goto __pyx_L0;
+0979: 	print(msg)
  __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_INCREF(__pyx_v_msg);
  __Pyx_GIVEREF(__pyx_v_msg);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_msg);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 979, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0980: 	return False
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(Py_False);
  __pyx_r = Py_False;
  goto __pyx_L0;
 0981: 
 0982: 
+0983: def test():
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_6plcfrs_5test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_6plcfrs_4test[] = "test()";
static PyMethodDef __pyx_mdef_8discodop_6plcfrs_5test = {"test", (PyCFunction)__pyx_pw_8discodop_6plcfrs_5test, METH_NOARGS, __pyx_doc_8discodop_6plcfrs_4test};
static PyObject *__pyx_pw_8discodop_6plcfrs_5test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("test (wrapper)", 0);
  __pyx_r = __pyx_pf_8discodop_6plcfrs_4test(__pyx_self);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_6plcfrs_4test(CYTHON_UNUSED PyObject *__pyx_self) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("test", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.plcfrs.test", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__69 = PyTuple_Pack(1, __pyx_n_s_grammar); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(0, 983, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__69);
  __Pyx_GIVEREF(__pyx_tuple__69);
/* … */
  __pyx_t_4 = PyCFunction_NewEx(&__pyx_mdef_8discodop_6plcfrs_5test, NULL, __pyx_n_s_discodop_plcfrs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 983, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_4) < 0) __PYX_ERR(0, 983, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_codeobj__70 = (PyObject*)__Pyx_PyCode_New(0, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__69, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_discodop_plcfrs_pyx, __pyx_n_s_test, 983, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__70)) __PYX_ERR(0, 983, __pyx_L1_error)
+0984: 	grammar = Grammar([
  __pyx_t_1 = PyList_New(7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_tuple__15);
  __Pyx_INCREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_tuple__21);
  __Pyx_INCREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_tuple__27);
  __Pyx_INCREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);
  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_tuple__31);
  __Pyx_INCREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);
  PyList_SET_ITEM(__pyx_t_1, 4, __pyx_tuple__35);
  __Pyx_INCREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);
  PyList_SET_ITEM(__pyx_t_1, 5, __pyx_tuple__39);
  __Pyx_INCREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);
  PyList_SET_ITEM(__pyx_t_1, 6, __pyx_tuple__43);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_8discodop_10containers_Grammar), __pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 984, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_3);
  __pyx_t_3 = 0;
+0985: 		((('S', 'VP_2', 'VMFIN'), ((0, 1, 0), )), 1),
  __pyx_tuple__11 = PyTuple_Pack(3, __pyx_n_u_S, __pyx_n_u_VP_2, __pyx_n_u_VMFIN); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
  __pyx_tuple__12 = PyTuple_Pack(3, __pyx_int_0, __pyx_int_1, __pyx_int_0); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);
  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_tuple__12); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);
  __pyx_tuple__14 = PyTuple_Pack(2, __pyx_tuple__11, __pyx_tuple__13); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);
  __pyx_tuple__15 = PyTuple_Pack(2, __pyx_tuple__14, __pyx_int_1); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 985, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
+0986: 		((('VP_2', 'VP_2', 'VAINF'), ((0, ), (0, 1))), 0.5),
  __pyx_tuple__16 = PyTuple_Pack(3, __pyx_n_u_VP_2, __pyx_n_u_VP_2, __pyx_n_u_VAINF); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);
  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);
  __pyx_tuple__18 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);
  __pyx_tuple__19 = PyTuple_Pack(2, __pyx_tuple__17, __pyx_tuple__18); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);
  __pyx_tuple__20 = PyTuple_Pack(2, __pyx_tuple__16, __pyx_tuple__19); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);
  __pyx_tuple__21 = PyTuple_Pack(2, __pyx_tuple__20, __pyx_float_0_5); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 986, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);
+0987: 		((('VP_2', 'PROAV', 'VVPP'), ((0, ), (1, ))), 0.5),
  __pyx_tuple__22 = PyTuple_Pack(3, __pyx_n_u_VP_2, __pyx_n_u_PROAV, __pyx_n_u_VVPP); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
  __pyx_tuple__23 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_int_1); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
  __pyx_tuple__25 = PyTuple_Pack(2, __pyx_tuple__23, __pyx_tuple__24); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
  __pyx_tuple__26 = PyTuple_Pack(2, __pyx_tuple__22, __pyx_tuple__25); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);
  __pyx_tuple__27 = PyTuple_Pack(2, __pyx_tuple__26, __pyx_float_0_5); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 987, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
+0988: 		((('PROAV', 'Epsilon'), ('Darueber', )), 1),
  __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_u_PROAV, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__28);
  __Pyx_GIVEREF(__pyx_tuple__28);
  __pyx_tuple__29 = PyTuple_Pack(1, __pyx_n_u_Darueber); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);
  __pyx_tuple__30 = PyTuple_Pack(2, __pyx_tuple__28, __pyx_tuple__29); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__30);
  __Pyx_GIVEREF(__pyx_tuple__30);
  __pyx_tuple__31 = PyTuple_Pack(2, __pyx_tuple__30, __pyx_int_1); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 988, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);
+0989: 		((('VAINF', 'Epsilon'), ('werden', )), 1),
  __pyx_tuple__32 = PyTuple_Pack(2, __pyx_n_u_VAINF, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);
  __pyx_tuple__33 = PyTuple_Pack(1, __pyx_n_u_werden); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);
  __pyx_tuple__34 = PyTuple_Pack(2, __pyx_tuple__32, __pyx_tuple__33); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__34);
  __Pyx_GIVEREF(__pyx_tuple__34);
  __pyx_tuple__35 = PyTuple_Pack(2, __pyx_tuple__34, __pyx_int_1); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 989, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);
+0990: 		((('VMFIN', 'Epsilon'), ('muss', )), 1),
  __pyx_tuple__36 = PyTuple_Pack(2, __pyx_n_u_VMFIN, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);
  __pyx_tuple__37 = PyTuple_Pack(1, __pyx_n_u_muss); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);
  __pyx_tuple__38 = PyTuple_Pack(2, __pyx_tuple__36, __pyx_tuple__37); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__38);
  __Pyx_GIVEREF(__pyx_tuple__38);
  __pyx_tuple__39 = PyTuple_Pack(2, __pyx_tuple__38, __pyx_int_1); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 990, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);
+0991: 		((('VVPP', 'Epsilon'), ('nachgedacht', )), 1)], start='S')
  __pyx_tuple__40 = PyTuple_Pack(2, __pyx_n_u_VVPP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 991, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__40);
  __Pyx_GIVEREF(__pyx_tuple__40);
  __pyx_tuple__41 = PyTuple_Pack(1, __pyx_n_u_nachgedacht); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 991, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);
  __pyx_tuple__42 = PyTuple_Pack(2, __pyx_tuple__40, __pyx_tuple__41); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 991, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);
/* … */
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 991, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_start, __pyx_n_u_S) < 0) __PYX_ERR(0, 991, __pyx_L1_error)
  __pyx_tuple__43 = PyTuple_Pack(2, __pyx_tuple__42, __pyx_int_1); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 991, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);
+0992: 	print(grammar)
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_grammar));
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 992, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+0993: 	assert testsent('Darueber muss nachgedacht werden', grammar)
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 993, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_kp_u_Darueber_muss_nachgedacht_werden, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 993, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_kp_u_Darueber_muss_nachgedacht_werden, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 993, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 993, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      if (__pyx_t_2) {
        __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_u_Darueber_muss_nachgedacht_werden);
      __Pyx_GIVEREF(__pyx_kp_u_Darueber_muss_nachgedacht_werden);
      PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_u_Darueber_muss_nachgedacht_werden);
      __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
      PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 993, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 993, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_6)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 993, __pyx_L1_error)
    }
  }
  #endif
+0994: 	assert testsent('Darueber muss nachgedacht werden werden werden', grammar)
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 994, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_kp_u_Darueber_muss_nachgedacht_werden_2, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_kp_u_Darueber_muss_nachgedacht_werden_2, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_2 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 994, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      if (__pyx_t_5) {
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5); __pyx_t_5 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_u_Darueber_muss_nachgedacht_werden_2);
      __Pyx_GIVEREF(__pyx_kp_u_Darueber_muss_nachgedacht_werden_2);
      PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_4, __pyx_kp_u_Darueber_muss_nachgedacht_werden_2);
      __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
      PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 994, __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_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 994, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_6)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 994, __pyx_L1_error)
    }
  }
  #endif
+0995: 	print('ungrammatical sentence (\'no parse\' expected):')
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__44, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_kp_u_ungrammatical_sentence_no_parse); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 995, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__44);
  __Pyx_GIVEREF(__pyx_tuple__44);
+0996: 	assert not testsent('muss Darueber nachgedacht werden', grammar)
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 996, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_kp_u_muss_Darueber_nachgedacht_werden, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_kp_u_muss_Darueber_nachgedacht_werden, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else
    #endif
    {
      __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 996, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      if (__pyx_t_2) {
        __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2); __pyx_t_2 = NULL;
      }
      __Pyx_INCREF(__pyx_kp_u_muss_Darueber_nachgedacht_werden);
      __Pyx_GIVEREF(__pyx_kp_u_muss_Darueber_nachgedacht_werden);
      PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_u_muss_Darueber_nachgedacht_werden);
      __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
      PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 996, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 996, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!((!__pyx_t_6) != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 996, __pyx_L1_error)
    }
  }
  #endif
+0997: 	assert testsent('Darueber muss nachgedacht ' + ' '.join(32 * ['werden']),
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 997, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PyList_New(1 * 32); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 997, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    { Py_ssize_t __pyx_temp;
      for (__pyx_temp=0; __pyx_temp < 32; __pyx_temp++) {
        __Pyx_INCREF(__pyx_n_u_werden);
        __Pyx_GIVEREF(__pyx_n_u_werden);
        PyList_SET_ITEM(__pyx_t_5, __pyx_temp, __pyx_n_u_werden);
      }
    }
    __pyx_t_2 = PyUnicode_Join(__pyx_kp_u__45, __pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 997, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Darueber_muss_nachgedacht, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 997, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __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_ERR(0, 997, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_6)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 997, __pyx_L1_error)
    }
  }
  #endif
+0998: 			grammar)
    __pyx_t_2 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_t_5, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 997, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_2, __pyx_t_5, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 997, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else
    #endif
    {
      __pyx_t_7 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 997, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      if (__pyx_t_2) {
        __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2); __pyx_t_2 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_5);
      PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_4, __pyx_t_5);
      __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
      PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
      __pyx_t_5 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 997, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+0999: 	assert testsent('Darueber muss nachgedacht ' + ' '.join(64 * ['werden']),
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 999, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_7 = PyList_New(1 * 64); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 999, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    { Py_ssize_t __pyx_temp;
      for (__pyx_temp=0; __pyx_temp < 64; __pyx_temp++) {
        __Pyx_INCREF(__pyx_n_u_werden);
        __Pyx_GIVEREF(__pyx_n_u_werden);
        PyList_SET_ITEM(__pyx_t_7, __pyx_temp, __pyx_n_u_werden);
      }
    }
    __pyx_t_5 = PyUnicode_Join(__pyx_kp_u__45, __pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 999, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Darueber_muss_nachgedacht, __pyx_t_5); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 999, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __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_ERR(0, 999, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_6)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 999, __pyx_L1_error)
    }
  }
  #endif
+1000: 			grammar)
    __pyx_t_5 = NULL;
    __pyx_t_4 = 0;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
        __pyx_t_4 = 1;
      }
    }
    #if CYTHON_FAST_PYCALL
    if (PyFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_7, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else
    #endif
    #if CYTHON_FAST_PYCCALL
    if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
      PyObject *__pyx_temp[3] = {__pyx_t_5, __pyx_t_7, ((PyObject *)__pyx_v_grammar)};
      __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __pyx_L1_error)
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else
    #endif
    {
      __pyx_t_2 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 999, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      if (__pyx_t_5) {
        __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_5); __pyx_t_5 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_2, 0+__pyx_t_4, __pyx_t_7);
      __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
      PyTuple_SET_ITEM(__pyx_t_2, 1+__pyx_t_4, ((PyObject *)__pyx_v_grammar));
      __pyx_t_7 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 999, __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;
 1001: 
+1002: __all__ = ['LCFRSChart', 'SmallLCFRSChart', 'FatLCFRSChart', 'parse']
  __pyx_t_4 = PyList_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 1002, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_u_LCFRSChart);
  __Pyx_GIVEREF(__pyx_n_u_LCFRSChart);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_n_u_LCFRSChart);
  __Pyx_INCREF(__pyx_n_u_SmallLCFRSChart);
  __Pyx_GIVEREF(__pyx_n_u_SmallLCFRSChart);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_n_u_SmallLCFRSChart);
  __Pyx_INCREF(__pyx_n_u_FatLCFRSChart);
  __Pyx_GIVEREF(__pyx_n_u_FatLCFRSChart);
  PyList_SET_ITEM(__pyx_t_4, 2, __pyx_n_u_FatLCFRSChart);
  __Pyx_INCREF(__pyx_n_u_parse);
  __Pyx_GIVEREF(__pyx_n_u_parse);
  PyList_SET_ITEM(__pyx_t_4, 3, __pyx_n_u_parse);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_4) < 0) __PYX_ERR(0, 1002, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;