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: pcfg.cpp

+001: """CKY parser for Probabilistic Context-Free Grammar (PCFG)."""
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test_2, __pyx_t_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 002: from __future__ import print_function
+003: import re
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_re, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_re, __pyx_t_3) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+004: import sys
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_sys, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sys, __pyx_t_3) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+005: import subprocess
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_subprocess, 0, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_subprocess, __pyx_t_3) < 0) __PYX_ERR(0, 5, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+006: from os import unlink
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_unlink);
  __Pyx_GIVEREF(__pyx_n_s_unlink);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_unlink);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_os, __pyx_t_3, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_unlink); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_unlink, __pyx_t_3) < 0) __PYX_ERR(0, 6, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+007: from math import exp, log as pylog
  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_s_exp);
  __Pyx_GIVEREF(__pyx_n_s_exp);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_n_s_exp);
  __Pyx_INCREF(__pyx_n_s_log);
  __Pyx_GIVEREF(__pyx_n_s_log);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_n_s_log);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_math, __pyx_t_4, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_exp); 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_exp, __pyx_t_4) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_log); 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_pylog, __pyx_t_4) < 0) __PYX_ERR(0, 7, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+008: from itertools import count
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_count);
  __Pyx_GIVEREF(__pyx_n_s_count);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_count);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_itertools, __pyx_t_3, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_count); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_count, __pyx_t_3) < 0) __PYX_ERR(0, 8, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+009: import numpy as np
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_4) < 0) __PYX_ERR(0, 9, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+010: from .tree import Tree
  __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_s_Tree);
  __Pyx_GIVEREF(__pyx_n_s_Tree);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_n_s_Tree);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_tree, __pyx_t_4, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_Tree); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Tree, __pyx_t_4) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+011: from .util import which
  __pyx_t_3 = PyList_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_s_which);
  __Pyx_GIVEREF(__pyx_n_s_which);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_s_which);
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_util, __pyx_t_3, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_4, __pyx_n_s_which); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_which, __pyx_t_3) < 0) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+012: from .treebank import TERMINALSRE
  __pyx_t_4 = PyList_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(__pyx_n_s_TERMINALSRE);
  __Pyx_GIVEREF(__pyx_n_s_TERMINALSRE);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_n_s_TERMINALSRE);
  __pyx_t_3 = __Pyx_Import(__pyx_n_s_treebank, __pyx_t_4, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_TERMINALSRE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_TERMINALSRE, __pyx_t_4) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 013: 
 014: cimport cython
 015: from cython.operator cimport postincrement, dereference
 016: from libc.math cimport HUGE_VAL as INFINITY
 017: from libcpp.algorithm cimport binary_search
 018: cdef extern from "<algorithm>" namespace "std" nogil:
 019: 	vector[Label].iterator lower_bound(
 020: 			vector[Label].iterator first,
 021: 			vector[Label].iterator last,
 022: 			const Label& value)
 023: include "constants.pxi"
 024: 
 025: 
+026: cdef inline uint64_t cellstruct(Idx start, Idx end):
static CYTHON_INLINE uint64_t __pyx_f_8discodop_4pcfg_cellstruct(__pyx_t_8discodop_10containers_Idx __pyx_v_start, __pyx_t_8discodop_10containers_Idx __pyx_v_end) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_result;
  uint64_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("cellstruct", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 027: 	cdef CFGItem result
+028: 	result.st.start = start
  __pyx_v_result.st.start = __pyx_v_start;
+029: 	result.st.end = end
  __pyx_v_result.st.end = __pyx_v_end;
+030: 	result.st.label = 0
  __pyx_v_result.st.label = 0;
+031: 	return result.dt
  __pyx_r = __pyx_v_result.dt;
  goto __pyx_L0;
 032: 
 033: 
+034: cdef class CFGChart(Chart):
struct __pyx_vtabstruct_8discodop_4pcfg_CFGChart {
  struct __pyx_vtabstruct_8discodop_10containers_Chart __pyx_base;
};
static struct __pyx_vtabstruct_8discodop_4pcfg_CFGChart *__pyx_vtabptr_8discodop_4pcfg_CFGChart;

 035: 	"""A Chart for context-free grammars (CFG).
 036: 
 037: 	An item is a triple ``(start, end, label)``."""
+038: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_4pcfg_8CFGChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_4pcfg_8CFGChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  CYTHON_UNUSED struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  CYTHON_UNUSED PyObject *__pyx_v_sent = 0;
  CYTHON_UNUSED PyObject *__pyx_v_start = 0;
  CYTHON_UNUSED PyObject *__pyx_v_logprob = 0;
  CYTHON_UNUSED PyObject *__pyx_v_viterbi = 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,0};
    PyObject* values[5] = {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_4pcfg_8CFGChart___init__(CYTHON_UNUSED struct __pyx_obj_8discodop_4pcfg_CFGChart *__pyx_v_self, CYTHON_UNUSED struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, CYTHON_UNUSED PyObject *__pyx_v_sent, CYTHON_UNUSED PyObject *__pyx_v_start, CYTHON_UNUSED PyObject *__pyx_v_logprob, CYTHON_UNUSED PyObject *__pyx_v_viterbi) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("discodop.pcfg.CFGChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+039: 			start=None, logprob=True, viterbi=True):
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        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, 5, 1); __PYX_ERR(0, 38, __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--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 38, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        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];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 38, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.CFGChart.__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, 38, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_8CFGChart___init__(((struct __pyx_obj_8discodop_4pcfg_CFGChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi);
+040: 		raise NotImplementedError
  __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
  __PYX_ERR(0, 40, __pyx_L1_error)
 041: 
+042: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_4pcfg_8CFGChart_label(CYTHON_UNUSED struct __pyx_obj_8discodop_4pcfg_CFGChart *__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.pcfg.CFGChart.label", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+043: 		raise NotImplementedError
  __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
  __PYX_ERR(0, 43, __pyx_L1_error)
 044: 
+045: 	cdef Prob subtreeprob(self, ItemNo itemidx):
static Prob __pyx_f_8discodop_4pcfg_8CFGChart_subtreeprob(CYTHON_UNUSED struct __pyx_obj_8discodop_4pcfg_CFGChart *__pyx_v_self, CYTHON_UNUSED ItemNo __pyx_v_itemidx) {
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.CFGChart.subtreeprob", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 046: 		"""Return probability of subtree headed by item."""
+047: 		raise NotImplementedError
  __Pyx_Raise(__pyx_builtin_NotImplementedError, 0, 0, 0);
  __PYX_ERR(0, 47, __pyx_L1_error)
 048: 
 049: 
 050: @cython.final
+051: cdef class DenseCFGChart(CFGChart):
struct __pyx_vtabstruct_8discodop_4pcfg_DenseCFGChart {
  struct __pyx_vtabstruct_8discodop_4pcfg_CFGChart __pyx_base;
  void (*addedge)(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t, __pyx_t_8discodop_10containers_Idx, ProbRule *);
  int (*updateprob)(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t, Prob, Prob);
  Label (*_label)(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);
  Prob (*_subtreeprob)(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);
  int (*_hasitem)(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);
};
static struct __pyx_vtabstruct_8discodop_4pcfg_DenseCFGChart *__pyx_vtabptr_8discodop_4pcfg_DenseCFGChart;
static void __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t, __pyx_t_8discodop_10containers_Idx, ProbRule *);
static int __pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t, Prob, Prob);
static Label __pyx_f_8discodop_4pcfg_13DenseCFGChart__label(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);
static Prob __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);
static int __pyx_f_8discodop_4pcfg_13DenseCFGChart__hasitem(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *, uint64_t);

 052: 	"""A CFG chart with fixed, pre-allocated arrays.
 053: 
 054: 	All possible chart items are stored in dense, pre-allocated arrays; i.e.,
 055: 	array is contiguous and all valid combinations of indices ``0 <= start <=
 056: 	mid <= end`` and ``label`` can be addressed. Whether it is feasible to use
 057: 	this chart depends on the grammar constant, specifically the number of
 058: 	non-terminal labels (and to a lesser extent the sentence length)."""
+059: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_4pcfg_13DenseCFGChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_4pcfg_13DenseCFGChart_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;
  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,0};
    PyObject* values[5] = {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_4pcfg_13DenseCFGChart___init__(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__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) {
  size_t __pyx_v_entries;
  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.pcfg.DenseCFGChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+060: 			start=None, logprob=True, viterbi=True):
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        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, 5, 1); __PYX_ERR(0, 59, __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--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 59, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        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];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 59, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.__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, 59, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_13DenseCFGChart___init__(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi);
+061: 		self.grammar = grammar
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.__pyx_base.grammar);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar));
  __pyx_v_self->__pyx_base.__pyx_base.grammar = __pyx_v_grammar;
+062: 		self.sent = sent
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.__pyx_base.sent);
  __Pyx_DECREF(__pyx_v_self->__pyx_base.__pyx_base.sent);
  __pyx_v_self->__pyx_base.__pyx_base.sent = __pyx_v_sent;
+063: 		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, 63, __pyx_L1_error)
  }
  __pyx_t_1 = PyList_GET_SIZE(__pyx_v_sent); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 63, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.lensent = __pyx_t_1;
+064: 		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, 64, __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, 64, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_self->__pyx_base.__pyx_base.start = __pyx_t_5;
+065: 		self.logprob = logprob
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_logprob); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 65, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.logprob = __pyx_t_3;
+066: 		self.viterbi = viterbi
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_viterbi); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 66, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.viterbi = __pyx_t_3;
 067: 		# FIXME: use compactcellidx?
 068: 		# entries = compactcellidx(self.lensent - 1, self.lensent,
 069: 		# 		self.lensent, grammar.nonterminals) + grammar.nonterminals
 070: 		entries = cellidx(self.lensent - 1, self.lensent, self.lensent,
+071: 				grammar.nonterminals) + grammar.nonterminals
  __pyx_v_entries = (__pyx_f_8discodop_10containers_cellidx((__pyx_v_self->__pyx_base.__pyx_base.lensent - 1), __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_grammar->nonterminals) + __pyx_v_grammar->nonterminals);
+072: 		self.items.reserve(entries)
  __pyx_v_self->__pyx_base.items.reserve(__pyx_v_entries);
+073: 		self.items.push_back(0)
  try {
    __pyx_v_self->__pyx_base.items.push_back(0);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 73, __pyx_L1_error)
  }
 074: 		# NB: resize not reserve; will not resize again.
+075: 		self.probs.resize(entries, INFINITY)
  try {
    __pyx_v_self->__pyx_base.__pyx_base.probs.resize(__pyx_v_entries, HUGE_VAL);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 75, __pyx_L1_error)
  }
+076: 		self.parseforest.resize(entries)
  try {
    __pyx_v_self->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_entries);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 76, __pyx_L1_error)
  }
 077: 
+078: 	def root(self):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_4pcfg_13DenseCFGChart_2root[] = "DenseCFGChart.root(self)";
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_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_4pcfg_13DenseCFGChart_2root(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_self));

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

static PyObject *__pyx_pf_8discodop_4pcfg_13DenseCFGChart_2root(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.root", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+079: 		return cellidx(0, self.lensent, self.lensent,
  __Pyx_XDECREF(__pyx_r);
+080: 				self.grammar.nonterminals) + self.start
  __pyx_t_1 = __Pyx_PyInt_FromSize_t((__pyx_f_8discodop_10containers_cellidx(0, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) + __pyx_v_self->__pyx_base.__pyx_base.start)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 80, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 081: 
+082: 	cdef void addedge(self, uint64_t item, Idx mid, ProbRule *rule):
static void __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, uint64_t __pyx_v_item, __pyx_t_8discodop_10containers_Idx __pyx_v_mid, 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.pcfg.DenseCFGChart.addedge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 083: 		"""Add new edge to parse forest."""
 084: 		cdef Edge edge
+085: 		edge.rule = rule
  __pyx_v_edge.rule = __pyx_v_rule;
+086: 		edge.pos.lvec = mid
  __pyx_v_edge.pos.lvec = __pyx_v_mid;
+087: 		self.parseforest[item].push_back(edge)
  try {
    (__pyx_v_self->__pyx_base.__pyx_base.parseforest[__pyx_v_item]).push_back(__pyx_v_edge);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 87, __pyx_L1_error)
  }
 088: 
+089: 	cdef bint updateprob(self, uint64_t item, Prob prob, Prob beam):
static int __pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, uint64_t __pyx_v_item, Prob __pyx_v_prob, Prob __pyx_v_beam) {
  uint64_t __pyx_v_beamitem;
  uint64_t __pyx_v_itemx;
  int __pyx_v_newitem;
  uint64_t __pyx_v_start;
  uint64_t __pyx_v_end;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("updateprob", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.DenseCFGChart.updateprob", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 090: 		"""Update probability for item if better than current one.
 091: 
 092: 		Add item if not seen before; return False if pruned."""
 093: 		cdef uint64_t beamitem, itemx
+094: 		cdef bint newitem = self.probs[item] == INFINITY
  __pyx_v_newitem = ((__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]) == HUGE_VAL);
+095: 		if beam:
  __pyx_t_1 = (__pyx_v_beam != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+096: 			itemx = item - item % self.grammar.nonterminals
    __pyx_v_itemx = (__pyx_v_item - (__pyx_v_item % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals));
+097: 			start = itemx // (self.grammar.nonterminals * self.lensent)
    __pyx_v_start = (__pyx_v_itemx / (__pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals * __pyx_v_self->__pyx_base.__pyx_base.lensent));
+098: 			end = itemx // self.grammar.nonterminals % self.lensent + 1
    __pyx_v_end = (((__pyx_v_itemx / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+099: 			beamitem = compactcellidx(start, end, self.lensent, 1)
    __pyx_v_beamitem = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_start, __pyx_v_end, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1);
+100: 			if prob > self.beambuckets[beamitem]:  # prob falls outside of beam
    __pyx_t_1 = ((__pyx_v_prob > (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem])) != 0);
    if (__pyx_t_1) {
/* … */
    }
+101: 				return False
      __pyx_r = 0;
      goto __pyx_L0;
+102: 			elif prob + beam < self.beambuckets[beamitem]:  # shrink beam
    __pyx_t_1 = (((__pyx_v_prob + __pyx_v_beam) < (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem])) != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+103: 				self.beambuckets[beamitem] = prob + beam
      (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem]) = (__pyx_v_prob + __pyx_v_beam);
+104: 				self.probs[item] = prob
      (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]) = __pyx_v_prob;
+105: 			elif prob < self.probs[item]:  # prob falls within beam
    __pyx_t_1 = ((__pyx_v_prob < (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item])) != 0);
    if (__pyx_t_1) {
/* … */
    }
    __pyx_L4:;
+106: 				self.probs[item] = prob
      (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]) = __pyx_v_prob;
+107: 		elif prob < self.probs[item]:
  __pyx_t_1 = ((__pyx_v_prob < (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item])) != 0);
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L3:;
+108: 			self.probs[item] = prob
    (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]) = __pyx_v_prob;
 109: 		# can infer order of binary rules, but need to track unaries explicitly
+110: 		if newitem:
  __pyx_t_1 = (__pyx_v_newitem != 0);
  if (__pyx_t_1) {
/* … */
  }
+111: 			self.items.push_back(item)
    try {
      __pyx_v_self->__pyx_base.items.push_back(__pyx_v_item);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 111, __pyx_L1_error)
    }
+112: 		return True
  __pyx_r = 1;
  goto __pyx_L0;
 113: 
+114: 	cdef ItemNo _left(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_4pcfg_13DenseCFGChart__left(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  uint64_t __pyx_v_item;
  short __pyx_v_start;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_left", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+115: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
 116: 		cdef short start
+117: 		if edge.rule is NULL:
  __pyx_t_1 = ((__pyx_v_edge.rule == NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+118: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+119: 		start = item // (self.grammar.nonterminals * self.lensent)
  __pyx_v_start = (__pyx_v_item / (__pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals * __pyx_v_self->__pyx_base.__pyx_base.lensent));
 120: 		return cellidx(start, edge.pos.mid, self.lensent,
+121: 				self.grammar.nonterminals) + edge.rule.rhs1
  __pyx_r = (__pyx_f_8discodop_10containers_cellidx(__pyx_v_start, __pyx_v_edge.pos.mid, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) + __pyx_v_edge.rule->rhs1);
  goto __pyx_L0;
 122: 
+123: 	cdef ItemNo _right(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_4pcfg_13DenseCFGChart__right(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  uint64_t __pyx_v_item;
  short __pyx_v_end;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_right", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+124: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
 125: 		cdef short end
+126: 		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) {
/* … */
  }
+127: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+128: 		end = item // self.grammar.nonterminals % self.lensent + 1
  __pyx_v_end = (((__pyx_v_item / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
 129: 		return cellidx(edge.pos.mid, end, self.lensent,
+130: 				self.grammar.nonterminals) + edge.rule.rhs2
  __pyx_r = (__pyx_f_8discodop_10containers_cellidx(__pyx_v_edge.pos.mid, __pyx_v_end, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) + __pyx_v_edge.rule->rhs2);
  goto __pyx_L0;
 131: 
+132: 	cdef Label _label(self, uint64_t item):
static Label __pyx_f_8discodop_4pcfg_13DenseCFGChart__label(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+133: 		return item % self.grammar.nonterminals
  __pyx_r = (__pyx_v_item % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
  goto __pyx_L0;
 134: 
+135: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_4pcfg_13DenseCFGChart_label(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  uint64_t __pyx_v_item;
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+136: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
+137: 		return item % self.grammar.nonterminals
  __pyx_r = (__pyx_v_item % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
  goto __pyx_L0;
 138: 
+139: 	cdef Prob _subtreeprob(self, uint64_t item):
static Prob __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 140: 		"""Get viterbi / inside probability of a subtree headed by `item`."""
+141: 		return self.probs[item]
  __pyx_r = (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]);
  goto __pyx_L0;
 142: 
+143: 	cdef Prob subtreeprob(self, ItemNo itemidx):
static Prob __pyx_f_8discodop_4pcfg_13DenseCFGChart_subtreeprob(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  uint64_t __pyx_v_item;
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+144: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
+145: 		return self.probs[item]
  __pyx_r = (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]);
  goto __pyx_L0;
 146: 
+147: 	cdef bint _hasitem(self, uint64_t item):
static int __pyx_f_8discodop_4pcfg_13DenseCFGChart__hasitem(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_hasitem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 148: 		"""Test if item is in chart."""
+149: 		return self.probs[item] != INFINITY
  __pyx_r = ((__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_item]) != HUGE_VAL);
  goto __pyx_L0;
 150: 		# return self.parseforest[item].size() != 0
 151: 
+152: 	def indices(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_4pcfg_13DenseCFGChart_4indices[] = "DenseCFGChart.indices(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_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, 152, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_4pcfg_13DenseCFGChart_4indices(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

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

static PyObject *__pyx_pf_8discodop_4pcfg_13DenseCFGChart_4indices(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  uint64_t __pyx_v_item;
  short __pyx_v_start;
  short __pyx_v_end;
  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_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+153: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
+154: 		cdef short start = (item // self.grammar.nonterminals) // self.lensent
  __pyx_v_start = ((__pyx_v_item / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) / __pyx_v_self->__pyx_base.__pyx_base.lensent);
+155: 		cdef short end = (item // self.grammar.nonterminals) % self.lensent + 1
  __pyx_v_end = (((__pyx_v_item / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+156: 		return list(range(start, end))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_short(__pyx_v_start); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_short(__pyx_v_end); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PySequence_List(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 157: 
+158: 	def itemstr(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_4pcfg_13DenseCFGChart_6itemstr[] = "DenseCFGChart.itemstr(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_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, 158, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_4pcfg_13DenseCFGChart_6itemstr(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

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

static PyObject *__pyx_pf_8discodop_4pcfg_13DenseCFGChart_6itemstr(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  uint64_t __pyx_v_item;
  Label __pyx_v_lhs;
  short __pyx_v_start;
  short __pyx_v_end;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr", 0);
/* … */
  /* 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_4);
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+159: 		cdef uint64_t item = itemidx
  __pyx_v_item = __pyx_v_itemidx;
+160: 		cdef Label lhs = item % self.grammar.nonterminals
  __pyx_v_lhs = (__pyx_v_item % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+161: 		cdef short start = (item // self.grammar.nonterminals) // self.lensent
  __pyx_v_start = ((__pyx_v_item / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) / __pyx_v_self->__pyx_base.__pyx_base.lensent);
+162: 		cdef short end = (item // self.grammar.nonterminals) % self.lensent + 1
  __pyx_v_end = (((__pyx_v_item / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+163: 		return '%s[%d:%d]' % (self.grammar.tolabel[lhs], start, end)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_short(__pyx_v_start); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_short(__pyx_v_end); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_s_d_d, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 163, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 164: 
+165: 	def numitems(self):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_9numitems(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_4pcfg_13DenseCFGChart_8numitems[] = "DenseCFGChart.numitems(self)";
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_9numitems(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("numitems (wrapper)", 0);
  __pyx_r = __pyx_pf_8discodop_4pcfg_13DenseCFGChart_8numitems(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_self));

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

static PyObject *__pyx_pf_8discodop_4pcfg_13DenseCFGChart_8numitems(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("numitems", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.numitems", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+166: 		return self.items.size()
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_FromSize_t(__pyx_v_self->__pyx_base.items.size()); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 166, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 167: 
+168: 	cdef ItemNo getitemidx(self, uint64_t n):
static ItemNo __pyx_f_8discodop_4pcfg_13DenseCFGChart_getitemidx(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__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;
}
 169: 		"""Get itemidx of n'th item.
 170: 
 171: 		With the other charts the n'th item simply has itemidx n,
 172: 		but for this chart with need a level of indirection because
 173: 		itemidx is the item itself."""
+174: 		return self.items[n]
  __pyx_r = (__pyx_v_self->__pyx_base.items[__pyx_v_n]);
  goto __pyx_L0;
 175: 
+176: 	def hasnode(self, node, Whitelist whitelist=None):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_11hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_4pcfg_13DenseCFGChart_10hasnode[] = "DenseCFGChart.hasnode(self, node, Whitelist whitelist=None)";
static PyObject *__pyx_pw_8discodop_4pcfg_13DenseCFGChart_11hasnode(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, 176, __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, 176, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.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, 176, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_13DenseCFGChart_10hasnode(((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__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_4pcfg_13DenseCFGChart_10hasnode(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, PyObject *__pyx_v_node, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  short __pyx_v_left;
  short __pyx_v_right;
  Label __pyx_v_label;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+177: 		cdef short left = min(node.leaves())
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 177, __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, 177, __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, 177, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 177, __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_1 = __Pyx_PyObject_Call(__pyx_builtin_min, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 177, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_short(__pyx_t_1); if (unlikely((__pyx_t_4 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 177, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_left = __pyx_t_4;
+178: 		cdef short right = max(node.leaves()) + 1
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __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, 178, __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, 178, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __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_1 = __Pyx_PyObject_Call(__pyx_builtin_max, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_short(__pyx_t_2); if (unlikely((__pyx_t_4 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 178, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_right = __pyx_t_4;
 179: 		cdef Label label
+180: 		try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    goto __pyx_L8_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L0;
    __pyx_L8_try_end:;
  }
+181: 			label = self.grammar.toid[node.label]
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_label); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 181, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->toid), __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 181, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_8 = __Pyx_PyInt_As_uint32_t(__pyx_t_1); if (unlikely((__pyx_t_8 == ((Label)-1)) && PyErr_Occurred())) __PYX_ERR(0, 181, __pyx_L3_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_label = __pyx_t_8;
+182: 		except KeyError:
    __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
    if (__pyx_t_9) {
      __Pyx_AddTraceback("discodop.pcfg.DenseCFGChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) __PYX_ERR(0, 182, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_t_3);
+183: 			return False
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;
+184: 		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) {
/* … */
  }
+185: 			return whitelist.cfg[compactcellidx(left, right, self.lensent, 1)
    __Pyx_XDECREF(__pyx_r);
+186: 					].count(whitelist.mapping[label]) != 0
    __pyx_t_3 = __Pyx_PyBool_FromLong(((__pyx_v_whitelist->cfg[__pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1)]).count((__pyx_v_whitelist->mapping[__pyx_v_label])) != 0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 186, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
+187: 		return self.parseforest[
  __Pyx_XDECREF(__pyx_r);
 188: 				cellidx(left, right, self.lensent, self.grammar.nonterminals)
+189: 				+ label].size() != 0
  __pyx_t_3 = __Pyx_PyBool_FromLong(((__pyx_v_self->__pyx_base.__pyx_base.parseforest[(__pyx_f_8discodop_10containers_cellidx(__pyx_v_left, __pyx_v_right, __pyx_v_self->__pyx_base.__pyx_base.lensent, __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals) + __pyx_v_label)]).size() != 0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 189, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 190: 
+191: 	cdef SmallChartItem asSmallChartItem(self, ItemNo itemidx):
static SmallChartItem __pyx_f_8discodop_4pcfg_13DenseCFGChart_asSmallChartItem(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  uint64_t __pyx_v_label;
  uint64_t __pyx_v_start;
  uint64_t __pyx_v_end;
  SmallChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asSmallChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 192: 		cdef CFGItem item
+193: 		item.dt = itemidx
  __pyx_v_item.dt = __pyx_v_itemidx;
+194: 		label = item.dt % self.grammar.nonterminals
  __pyx_v_label = (__pyx_v_item.dt % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+195: 		item.dt //= self.grammar.nonterminals
  __pyx_v_item.dt = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+196: 		start = item.dt // self.lensent
  __pyx_v_start = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.lensent);
+197: 		end = item.dt % self.lensent + 1
  __pyx_v_end = ((__pyx_v_item.dt % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+198: 		return CFGtoSmallChartItem(label, start, end)
  __pyx_r = __pyx_f_8discodop_10containers_CFGtoSmallChartItem(__pyx_v_label, __pyx_v_start, __pyx_v_end);
  goto __pyx_L0;
 199: 
+200: 	cdef FatChartItem asFatChartItem(self, ItemNo itemidx):
static FatChartItem __pyx_f_8discodop_4pcfg_13DenseCFGChart_asFatChartItem(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  uint64_t __pyx_v_label;
  uint64_t __pyx_v_start;
  uint64_t __pyx_v_end;
  FatChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asFatChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 201: 		cdef CFGItem item
+202: 		item.dt = itemidx
  __pyx_v_item.dt = __pyx_v_itemidx;
+203: 		label = item.dt % self.grammar.nonterminals
  __pyx_v_label = (__pyx_v_item.dt % __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+204: 		item.dt //= self.grammar.nonterminals
  __pyx_v_item.dt = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+205: 		start = item.dt // self.lensent
  __pyx_v_start = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.lensent);
+206: 		end = item.dt % self.lensent + 1
  __pyx_v_end = ((__pyx_v_item.dt % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+207: 		return CFGtoFatChartItem(label, start, end)
  __pyx_r = __pyx_f_8discodop_10containers_CFGtoFatChartItem(__pyx_v_label, __pyx_v_start, __pyx_v_end);
  goto __pyx_L0;
 208: 
+209: 	cdef size_t asCFGspan(self, ItemNo itemidx):
static size_t __pyx_f_8discodop_4pcfg_13DenseCFGChart_asCFGspan(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  uint64_t __pyx_v_start;
  uint64_t __pyx_v_end;
  size_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asCFGspan", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.DenseCFGChart.asCFGspan", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 210: 		cdef CFGItem item
+211: 		item.dt = itemidx
  __pyx_v_item.dt = __pyx_v_itemidx;
+212: 		item.dt //= self.grammar.nonterminals
  __pyx_v_item.dt = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.grammar->nonterminals);
+213: 		start = item.dt // self.lensent
  __pyx_v_start = (__pyx_v_item.dt / __pyx_v_self->__pyx_base.__pyx_base.lensent);
+214: 		end = item.dt % self.lensent + 1
  __pyx_v_end = ((__pyx_v_item.dt % __pyx_v_self->__pyx_base.__pyx_base.lensent) + 1);
+215: 		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, 215, __pyx_L1_error)
    }
  }
  #endif
+216: 		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;
 217: 
 218: 
 219: @cython.final
+220: cdef class SparseCFGChart(CFGChart):
struct __pyx_vtabstruct_8discodop_4pcfg_SparseCFGChart {
  struct __pyx_vtabstruct_8discodop_4pcfg_CFGChart __pyx_base;
  void (*addedge)(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *, uint64_t, __pyx_t_8discodop_10containers_Idx, ProbRule *);
  int (*updateprob)(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *, uint64_t, Prob, Prob);
  Label (*_label)(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *, uint64_t);
  Prob (*_subtreeprob)(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *, uint64_t);
  int (*_hasitem)(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *, uint64_t);
};
static struct __pyx_vtabstruct_8discodop_4pcfg_SparseCFGChart *__pyx_vtabptr_8discodop_4pcfg_SparseCFGChart;
 221: 	"""A CFG chart which uses a hash table suitable for large grammars."""
+222: 	def __init__(self, Grammar grammar, list sent,
/* Python wrapper */
static int __pyx_pw_8discodop_4pcfg_14SparseCFGChart_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_8discodop_4pcfg_14SparseCFGChart_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_4pcfg_14SparseCFGChart___init__(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__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) {
  uint64_t __pyx_v_sentinel;
  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.pcfg.SparseCFGChart.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+223: 			start=None, logprob=True, viterbi=True, itemsestimate=None):
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_True);
    values[4] = ((PyObject *)Py_True);
    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, 222, __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, 222, __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, 222, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.__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, 222, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_sent), (&PyList_Type), 1, "sent", 1))) __PYX_ERR(0, 222, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_14SparseCFGChart___init__(((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_self), __pyx_v_grammar, __pyx_v_sent, __pyx_v_start, __pyx_v_logprob, __pyx_v_viterbi, __pyx_v_itemsestimate);
+224: 		cdef uint64_t sentinel = cellstruct(0, 0)
  __pyx_v_sentinel = __pyx_f_8discodop_4pcfg_cellstruct(0, 0);
+225: 		self.grammar = grammar
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.__pyx_base.grammar);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar));
  __pyx_v_self->__pyx_base.__pyx_base.grammar = __pyx_v_grammar;
+226: 		self.sent = sent
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  __Pyx_GOTREF(__pyx_v_self->__pyx_base.__pyx_base.sent);
  __Pyx_DECREF(__pyx_v_self->__pyx_base.__pyx_base.sent);
  __pyx_v_self->__pyx_base.__pyx_base.sent = __pyx_v_sent;
+227: 		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, 227, __pyx_L1_error)
  }
  __pyx_t_1 = PyList_GET_SIZE(__pyx_v_sent); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 227, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.lensent = __pyx_t_1;
+228: 		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, 228, __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, 228, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_self->__pyx_base.__pyx_base.start = __pyx_t_5;
+229: 		self.logprob = logprob
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_logprob); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 229, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.logprob = __pyx_t_3;
+230: 		self.viterbi = viterbi
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_viterbi); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 230, __pyx_L1_error)
  __pyx_v_self->__pyx_base.__pyx_base.viterbi = __pyx_t_3;
+231: 		if itemsestimate is not None:
  __pyx_t_3 = (__pyx_v_itemsestimate != Py_None);
  __pyx_t_6 = (__pyx_t_3 != 0);
  if (__pyx_t_6) {
/* … */
  }
+232: 			self.items.reserve(itemsestimate)
    __pyx_t_7 = __Pyx_PyInt_As_size_t(__pyx_v_itemsestimate); if (unlikely((__pyx_t_7 == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 232, __pyx_L1_error)
    __pyx_v_self->__pyx_base.items.reserve(__pyx_t_7);
+233: 			self.itemindex.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, 233, __pyx_L1_error)
    __pyx_v_self->itemindex.reserve(__pyx_t_8);
+234: 			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, 234, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.parseforest.reserve(__pyx_t_9);
+235: 			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, 235, __pyx_L1_error)
    __pyx_v_self->__pyx_base.__pyx_base.probs.reserve(__pyx_t_10);
+236: 		self.items.push_back(sentinel)
  try {
    __pyx_v_self->__pyx_base.items.push_back(__pyx_v_sentinel);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 236, __pyx_L1_error)
  }
+237: 		self.itemindex[sentinel] = 0
  (__pyx_v_self->itemindex[__pyx_v_sentinel]) = 0;
+238: 		self.probs.push_back(INFINITY)
  try {
    __pyx_v_self->__pyx_base.__pyx_base.probs.push_back(HUGE_VAL);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 238, __pyx_L1_error)
  }
 239: 
+240: 	def root(self):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_3root(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_4pcfg_14SparseCFGChart_2root[] = "SparseCFGChart.root(self)";
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_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_4pcfg_14SparseCFGChart_2root(((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_self));

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

static PyObject *__pyx_pf_8discodop_4pcfg_14SparseCFGChart_2root(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("root", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.root", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+241: 		return self.itemindex[cellstruct(0, self.lensent) + self.start]
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_uint32_t((__pyx_v_self->itemindex[(__pyx_f_8discodop_4pcfg_cellstruct(0, __pyx_v_self->__pyx_base.__pyx_base.lensent) + __pyx_v_self->__pyx_base.__pyx_base.start)])); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 241, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 242: 
+243: 	cdef void addedge(self, uint64_t item, Idx mid, ProbRule *rule):
static void __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, uint64_t __pyx_v_item, __pyx_t_8discodop_10containers_Idx __pyx_v_mid, ProbRule *__pyx_v_rule) {
  ItemNo __pyx_v_itemidx;
  Edge __pyx_v_edge;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("addedge", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.SparseCFGChart.addedge", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
 244: 		"""Add new edge to parse forest."""
+245: 		cdef ItemNo itemidx = self.itemindex[item]
  __pyx_v_itemidx = (__pyx_v_self->itemindex[__pyx_v_item]);
 246: 		cdef Edge edge
+247: 		edge.rule = rule
  __pyx_v_edge.rule = __pyx_v_rule;
+248: 		edge.pos.lvec = 0UL
  __pyx_v_edge.pos.lvec = 0UL;
+249: 		edge.pos.mid = mid
  __pyx_v_edge.pos.mid = __pyx_v_mid;
+250: 		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, 250, __pyx_L1_error)
  }
 251: 
+252: 	cdef bint updateprob(self, uint64_t item, Prob prob, Prob beam):
static int __pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, uint64_t __pyx_v_item, Prob __pyx_v_prob, Prob __pyx_v_beam) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_itemx;
  uint64_t __pyx_v_beamitem;
  ItemNo __pyx_v_itemidx;
  int __pyx_v_newitem;
  int __pyx_v_updateitem;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("updateprob", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.SparseCFGChart.updateprob", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 253: 		"""Update probability for item if better than current one.
 254: 
 255: 		Add item if not seen before; return False if pruned."""
 256: 		cdef CFGItem itemx
 257: 		cdef uint64_t beamitem
+258: 		cdef ItemNo itemidx = self.itemindex[item]
  __pyx_v_itemidx = (__pyx_v_self->itemindex[__pyx_v_item]);
+259: 		cdef bint newitem = itemidx == 0
  __pyx_v_newitem = (__pyx_v_itemidx == 0);
+260: 		cdef bint updateitem = newitem
  __pyx_v_updateitem = __pyx_v_newitem;
+261: 		if beam:
  __pyx_t_1 = (__pyx_v_beam != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+262: 			itemx.dt = item
    __pyx_v_itemx.dt = __pyx_v_item;
+263: 			beamitem = compactcellidx(
    __pyx_v_beamitem = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_itemx.st.start, __pyx_v_itemx.st.end, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1);
 264: 					itemx.st.start, itemx.st.end, self.lensent, 1)
+265: 			if prob > self.beambuckets[beamitem]:  # prob falls outside of beam
    __pyx_t_1 = ((__pyx_v_prob > (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem])) != 0);
    if (__pyx_t_1) {
/* … */
    }
+266: 				return False
      __pyx_r = 0;
      goto __pyx_L0;
+267: 			elif prob + beam < self.beambuckets[beamitem]:  # shrink beam
    __pyx_t_1 = (((__pyx_v_prob + __pyx_v_beam) < (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem])) != 0);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+268: 				self.beambuckets[beamitem] = prob + beam
      (__pyx_v_self->__pyx_base.beambuckets[__pyx_v_beamitem]) = (__pyx_v_prob + __pyx_v_beam);
+269: 				updateitem = True
      __pyx_v_updateitem = 1;
+270: 			elif newitem or prob < self.probs[itemidx]:  # prob falls within beam
    __pyx_t_2 = (__pyx_v_newitem != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_1 = __pyx_t_2;
      goto __pyx_L5_bool_binop_done;
    }
    __pyx_t_2 = ((__pyx_v_prob < (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_itemidx])) != 0);
    __pyx_t_1 = __pyx_t_2;
    __pyx_L5_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
    __pyx_L4:;
+271: 				updateitem = True
      __pyx_v_updateitem = 1;
+272: 		elif prob < self.probs[itemidx]:
  __pyx_t_1 = ((__pyx_v_prob < (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_itemidx])) != 0);
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L3:;
+273: 			updateitem = True
    __pyx_v_updateitem = 1;
+274: 		if newitem:
  __pyx_t_1 = (__pyx_v_newitem != 0);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L7;
  }
+275: 			itemidx = self.itemindex[item] = self.items.size()
    __pyx_t_3 = __pyx_v_self->__pyx_base.items.size();
    __pyx_v_itemidx = __pyx_t_3;
    (__pyx_v_self->itemindex[__pyx_v_item]) = __pyx_t_3;
+276: 			self.items.push_back(item)
    try {
      __pyx_v_self->__pyx_base.items.push_back(__pyx_v_item);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 276, __pyx_L1_error)
    }
+277: 			self.parseforest.resize(self.items.size())
    try {
      __pyx_v_self->__pyx_base.__pyx_base.parseforest.resize(__pyx_v_self->__pyx_base.items.size());
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 277, __pyx_L1_error)
    }
+278: 			self.probs.push_back(prob)
    try {
      __pyx_v_self->__pyx_base.__pyx_base.probs.push_back(__pyx_v_prob);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 278, __pyx_L1_error)
    }
+279: 		elif updateitem:
  __pyx_t_1 = (__pyx_v_updateitem != 0);
  if (__pyx_t_1) {
/* … */
  }
  __pyx_L7:;
+280: 			self.probs[itemidx] = prob
    (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_itemidx]) = __pyx_v_prob;
+281: 		return True
  __pyx_r = 1;
  goto __pyx_L0;
 282: 
+283: 	cdef ItemNo _left(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_4pcfg_14SparseCFGChart__left(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_left", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 284: 		cdef CFGItem item
+285: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+286: 		if edge.rule is NULL:
  __pyx_t_1 = ((__pyx_v_edge.rule == NULL) != 0);
  if (__pyx_t_1) {
/* … */
  }
+287: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+288: 		return self.itemindex[cellstruct(
  __pyx_r = (__pyx_v_self->itemindex[(__pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_item.st.start, __pyx_v_edge.pos.mid) + __pyx_v_edge.rule->rhs1)]);
  goto __pyx_L0;
 289: 				item.st.start, edge.pos.mid) + edge.rule.rhs1]
 290: 
+291: 	cdef ItemNo _right(self, ItemNo itemidx, Edge edge):
static ItemNo __pyx_f_8discodop_4pcfg_14SparseCFGChart__right(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx, Edge __pyx_v_edge) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  ItemNo __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_right", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 292: 		cdef CFGItem item
+293: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+294: 		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) {
/* … */
  }
+295: 			return 0
    __pyx_r = 0;
    goto __pyx_L0;
+296: 		return self.itemindex[cellstruct(
  __pyx_r = (__pyx_v_self->itemindex[(__pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_edge.pos.mid, __pyx_v_item.st.end) + __pyx_v_edge.rule->rhs2)]);
  goto __pyx_L0;
 297: 				edge.pos.mid, item.st.end) + edge.rule.rhs2]
 298: 
+299: 	cdef Label _label(self, uint64_t item):
static Label __pyx_f_8discodop_4pcfg_14SparseCFGChart__label(CYTHON_UNUSED struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_itemx;
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 300: 		cdef CFGItem itemx
+301: 		itemx.dt = item
  __pyx_v_itemx.dt = __pyx_v_item;
+302: 		return itemx.st.label
  __pyx_r = __pyx_v_itemx.st.label;
  goto __pyx_L0;
 303: 
+304: 	cdef Label label(self, ItemNo itemidx):
static Label __pyx_f_8discodop_4pcfg_14SparseCFGChart_label(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  Label __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("label", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 305: 		cdef CFGItem item
+306: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+307: 		return item.st.label
  __pyx_r = __pyx_v_item.st.label;
  goto __pyx_L0;
 308: 
+309: 	cdef Prob _subtreeprob(self, uint64_t item):
static Prob __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  spp::sparse_hash_map<uint64_t,ItemNo> ::iterator __pyx_v_it;
  Prob __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_subtreeprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 310: 		"""Get viterbi / inside probability of a subtree headed by `item`."""
+311: 		it = self.itemindex.find(item)
  __pyx_v_it = __pyx_v_self->itemindex.find(__pyx_v_item);
+312: 		if it == self.itemindex.end():
  __pyx_t_1 = ((__pyx_v_it == __pyx_v_self->itemindex.end()) != 0);
  if (__pyx_t_1) {
/* … */
  }
+313: 			return INFINITY
    __pyx_r = HUGE_VAL;
    goto __pyx_L0;
+314: 		return self.probs[dereference(it).second]
  __pyx_r = (__pyx_v_self->__pyx_base.__pyx_base.probs[(*__pyx_v_it).second]);
  goto __pyx_L0;
 315: 
+316: 	cdef Prob subtreeprob(self, ItemNo itemidx):
static Prob __pyx_f_8discodop_4pcfg_14SparseCFGChart_subtreeprob(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__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;
}
+317: 		return self.probs[itemidx]
  __pyx_r = (__pyx_v_self->__pyx_base.__pyx_base.probs[__pyx_v_itemidx]);
  goto __pyx_L0;
 318: 
+319: 	cdef bint _hasitem(self, uint64_t item):
static int __pyx_f_8discodop_4pcfg_14SparseCFGChart__hasitem(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, uint64_t __pyx_v_item) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_hasitem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 320: 		"""Test if item is in chart."""
+321: 		return self.itemindex.find(item) != self.itemindex.end()
  __pyx_r = (__pyx_v_self->itemindex.find(__pyx_v_item) != __pyx_v_self->itemindex.end());
  goto __pyx_L0;
 322: 
+323: 	def indices(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_5indices(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_4pcfg_14SparseCFGChart_4indices[] = "SparseCFGChart.indices(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_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, 323, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_4pcfg_14SparseCFGChart_4indices(((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

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

static PyObject *__pyx_pf_8discodop_4pcfg_14SparseCFGChart_4indices(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __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_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.indices", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 324: 		cdef CFGItem item
+325: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+326: 		return list(range(item.st.start, item.st.end))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_uint16_t(__pyx_v_item.st.start); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_uint16_t(__pyx_v_item.st.end); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_range, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PySequence_List(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 327: 
+328: 	def itemstr(self, ItemNo itemidx):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_7itemstr(PyObject *__pyx_v_self, PyObject *__pyx_arg_itemidx); /*proto*/
static char __pyx_doc_8discodop_4pcfg_14SparseCFGChart_6itemstr[] = "SparseCFGChart.itemstr(self, ItemNo itemidx)";
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_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, 328, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_4pcfg_14SparseCFGChart_6itemstr(((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_self), ((ItemNo)__pyx_v_itemidx));

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

static PyObject *__pyx_pf_8discodop_4pcfg_14SparseCFGChart_6itemstr(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("itemstr", 0);
/* … */
  /* 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_4);
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.itemstr", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 329: 		cdef CFGItem item
+330: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+331: 		return '%s[%d:%d]' % (
  __Pyx_XDECREF(__pyx_r);
/* … */
  __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_s_d_d, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 331, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
+332: 				self.grammar.tolabel[item.st.label],
  __pyx_t_1 = __Pyx_GetItemInt(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->tolabel), __pyx_v_item.st.label, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 332, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
/* … */
  __pyx_t_4 = PyTuple_New(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 332, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
+333: 				item.st.start, item.st.end)
  __pyx_t_2 = __Pyx_PyInt_From_uint16_t(__pyx_v_item.st.start); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 333, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_uint16_t(__pyx_v_item.st.end); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 333, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
 334: 
+335: 	def hasnode(self, node, Whitelist whitelist=None):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_9hasnode(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_4pcfg_14SparseCFGChart_8hasnode[] = "SparseCFGChart.hasnode(self, node, Whitelist whitelist=None)";
static PyObject *__pyx_pw_8discodop_4pcfg_14SparseCFGChart_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, 335, __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, 335, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.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, 335, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_14SparseCFGChart_8hasnode(((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__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_4pcfg_14SparseCFGChart_8hasnode(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, PyObject *__pyx_v_node, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  short __pyx_v_left;
  short __pyx_v_right;
  Label __pyx_v_label;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("hasnode", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+336: 		cdef short left = min(node.leaves())
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 336, __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, 336, __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, 336, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 336, __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_1 = __Pyx_PyObject_Call(__pyx_builtin_min, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 336, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_short(__pyx_t_1); if (unlikely((__pyx_t_4 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 336, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_left = __pyx_t_4;
+337: 		cdef short right = max(node.leaves()) + 1
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_leaves); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __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, 337, __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, 337, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __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_1 = __Pyx_PyObject_Call(__pyx_builtin_max, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 337, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_AddObjC(__pyx_t_1, __pyx_int_1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 337, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_short(__pyx_t_2); if (unlikely((__pyx_t_4 == (short)-1) && PyErr_Occurred())) __PYX_ERR(0, 337, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_right = __pyx_t_4;
 338: 		cdef Label label
+339: 		try:
  {
    /*try:*/ {
/* … */
    }
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    goto __pyx_L8_try_end;
    __pyx_L3_error:;
    __Pyx_PyThreadState_assign
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_PyThreadState_assign
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L0;
    __pyx_L8_try_end:;
  }
+340: 			label = self.grammar.toid[node.label]
      __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_node, __pyx_n_s_label); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 340, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyObject_GetItem(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.grammar->toid), __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 340, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_8 = __Pyx_PyInt_As_uint32_t(__pyx_t_1); if (unlikely((__pyx_t_8 == ((Label)-1)) && PyErr_Occurred())) __PYX_ERR(0, 340, __pyx_L3_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_v_label = __pyx_t_8;
+341: 		except KeyError:
    __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
    if (__pyx_t_9) {
      __Pyx_AddTraceback("discodop.pcfg.SparseCFGChart.hasnode", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3) < 0) __PYX_ERR(0, 341, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_t_3);
+342: 			return False
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(Py_False);
      __pyx_r = Py_False;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;
+343: 		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) {
/* … */
  }
+344: 			return whitelist.cfg[compactcellidx(left, right, self.lensent, 1)
    __Pyx_XDECREF(__pyx_r);
+345: 					].count(whitelist.mapping[label]) != 0
    __pyx_t_3 = __Pyx_PyBool_FromLong(((__pyx_v_whitelist->cfg[__pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1)]).count((__pyx_v_whitelist->mapping[__pyx_v_label])) != 0)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 345, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
+346: 		return self.itemindex.find(
  __Pyx_XDECREF(__pyx_r);
+347: 				cellstruct(left, right) + label) != self.itemindex.end()
  __pyx_t_3 = __Pyx_PyBool_FromLong((__pyx_v_self->itemindex.find((__pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_left, __pyx_v_right) + __pyx_v_label)) != __pyx_v_self->itemindex.end())); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 347, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;
 348: 
+349: 	cdef SmallChartItem asSmallChartItem(self, ItemNo itemidx):
static SmallChartItem __pyx_f_8discodop_4pcfg_14SparseCFGChart_asSmallChartItem(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  SmallChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asSmallChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 350: 		cdef CFGItem item
+351: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+352: 		return CFGtoSmallChartItem(item.st.label, item.st.start, item.st.end)
  __pyx_r = __pyx_f_8discodop_10containers_CFGtoSmallChartItem(__pyx_v_item.st.label, __pyx_v_item.st.start, __pyx_v_item.st.end);
  goto __pyx_L0;
 353: 
+354: 	cdef FatChartItem asFatChartItem(self, ItemNo itemidx):
static FatChartItem __pyx_f_8discodop_4pcfg_14SparseCFGChart_asFatChartItem(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  FatChartItem __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asFatChartItem", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 355: 		cdef CFGItem item
+356: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+357: 		return CFGtoFatChartItem(item.st.label, item.st.start, item.st.end)
  __pyx_r = __pyx_f_8discodop_10containers_CFGtoFatChartItem(__pyx_v_item.st.label, __pyx_v_item.st.start, __pyx_v_item.st.end);
  goto __pyx_L0;
 358: 
+359: 	cdef size_t asCFGspan(self, ItemNo itemidx):
static size_t __pyx_f_8discodop_4pcfg_14SparseCFGChart_asCFGspan(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_self, ItemNo __pyx_v_itemidx) {
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_item;
  size_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("asCFGspan", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("discodop.pcfg.SparseCFGChart.asCFGspan", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 360: 		cdef CFGItem item
+361: 		item.dt = self.items[itemidx]
  __pyx_v_item.dt = (__pyx_v_self->__pyx_base.items[__pyx_v_itemidx]);
+362: 		assert 0 <= item.st.start < item.st.end <= self.lensent
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_1 = (0 <= __pyx_v_item.st.start);
    if (__pyx_t_1) {
      __pyx_t_1 = (__pyx_v_item.st.start < __pyx_v_item.st.end);
      if (__pyx_t_1) {
        __pyx_t_1 = (__pyx_v_item.st.end <= __pyx_v_self->__pyx_base.__pyx_base.lensent);
      }
    }
    if (unlikely(!(__pyx_t_1 != 0))) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 362, __pyx_L1_error)
    }
  }
  #endif
+363: 		return compactcellidx(item.st.start, item.st.end, self.lensent, 1)
  __pyx_r = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_item.st.start, __pyx_v_item.st.end, __pyx_v_self->__pyx_base.__pyx_base.lensent, 1);
  goto __pyx_L0;
 364: 
 365: 
+366: def parse(sent, Grammar grammar, tags=None, start=None, whitelist=None,
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_1parse(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_4pcfg_parse[] = "parse(sent, Grammar grammar, tags=None, start=None, whitelist=None, Prob beam_beta=0.0, int beam_delta=50, itemsestimate=None)\nPCFG parsing using CKY.\n\n\t:param sent: A sequence of tokens that will be parsed.\n\t:param grammar: A ``Grammar`` object.\n\t:returns: a ``Chart`` object.\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 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 list of items that may enter the chart.\n\t\tThe whitelist is a list of cells consisting of sets of labels:\n\t\t``whitelist = [{label1, label2, ...}, ...]``;\n\t\tThe cells are indexed as compact spans; label is an integer for a\n\t\tnon-terminal label. The presence of a label means the span with that\n\t\tlabel will not be pruned.\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 to which beam search is applied.\n\t:param itemsestimate: the number of chart items to pre-allocate.\n\t";
static PyMethodDef __pyx_mdef_8discodop_4pcfg_1parse = {"parse", (PyCFunction)__pyx_pw_8discodop_4pcfg_1parse, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8discodop_4pcfg_parse};
static PyObject *__pyx_pw_8discodop_4pcfg_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;
  PyObject *__pyx_v_start = 0;
  PyObject *__pyx_v_whitelist = 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_start,&__pyx_n_s_whitelist,&__pyx_n_s_beam_beta,&__pyx_n_s_beam_delta,&__pyx_n_s_itemsestimate,0};
    PyObject* values[8] = {0,0,0,0,0,0,0,0};
    values[2] = ((PyObject *)Py_None);
    values[3] = ((PyObject *)Py_None);
    values[4] = ((PyObject *)Py_None);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_8discodop_4pcfg_parse(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar, PyObject *__pyx_v_tags, PyObject *__pyx_v_start, PyObject *__pyx_v_whitelist, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta, PyObject *__pyx_v_itemsestimate) {
  struct __pyx_obj_8discodop_4pcfg_CFGChart *__pyx_v_chart = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("parse", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("discodop.pcfg.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__160 = PyTuple_Pack(9, __pyx_n_s_sent, __pyx_n_s_grammar, __pyx_n_s_tags, __pyx_n_s_start, __pyx_n_s_whitelist, __pyx_n_s_beam_beta, __pyx_n_s_beam_delta, __pyx_n_s_itemsestimate, __pyx_n_s_chart); if (unlikely(!__pyx_tuple__160)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__160);
  __Pyx_GIVEREF(__pyx_tuple__160);
/* … */
  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8discodop_4pcfg_1parse, NULL, __pyx_n_s_discodop_pcfg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_parse, __pyx_t_3) < 0) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_codeobj__161 = (PyObject*)__Pyx_PyCode_New(8, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__160, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_discodop_pcfg_pyx, __pyx_n_s_parse, 366, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__161)) __PYX_ERR(0, 366, __pyx_L1_error)
+367: 		Prob beam_beta=0.0, int beam_delta=50, itemsestimate=None):
    values[7] = ((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  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, 8, 1); __PYX_ERR(0, 366, __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_start);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_whitelist);
          if (value) { values[4] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_beam_beta);
          if (value) { values[5] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_beam_delta);
          if (value) { values[6] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  7:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_itemsestimate);
          if (value) { values[7] = 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, 366, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        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];
    __pyx_v_start = values[3];
    __pyx_v_whitelist = values[4];
    if (values[5]) {
      __pyx_v_beam_beta = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_beam_beta == ((Prob)-1)) && PyErr_Occurred())) __PYX_ERR(0, 367, __pyx_L3_error)
    } else {
      __pyx_v_beam_beta = ((Prob)0.0);
    }
    if (values[6]) {
      __pyx_v_beam_delta = __Pyx_PyInt_As_int(values[6]); if (unlikely((__pyx_v_beam_delta == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 367, __pyx_L3_error)
    } else {
      __pyx_v_beam_delta = ((int)50);
    }
    __pyx_v_itemsestimate = values[7];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("parse", 0, 2, 8, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 366, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.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, 366, __pyx_L1_error)
  __pyx_r = __pyx_pf_8discodop_4pcfg_parse(__pyx_self, __pyx_v_sent, __pyx_v_grammar, __pyx_v_tags, __pyx_v_start, __pyx_v_whitelist, __pyx_v_beam_beta, __pyx_v_beam_delta, __pyx_v_itemsestimate);
 368: 	"""PCFG parsing using CKY.
 369: 
 370: 	:param sent: A sequence of tokens that will be parsed.
 371: 	:param grammar: A ``Grammar`` object.
 372: 	:returns: a ``Chart`` object.
 373: 	:param tags: Optionally, a sequence of POS tags to use instead of
 374: 		attempting to apply all possible POS tags.
 375: 	:param start: integer corresponding to the start symbol that complete
 376: 		derivations should be headed by; e.g., ``grammar.toid['ROOT']``.
 377: 		If not given, the default specified by ``grammar`` is used.
 378: 	:param whitelist: a list of items that may enter the chart.
 379: 		The whitelist is a list of cells consisting of sets of labels:
 380: 		``whitelist = [{label1, label2, ...}, ...]``;
 381: 		The cells are indexed as compact spans; label is an integer for a
 382: 		non-terminal label. The presence of a label means the span with that
 383: 		label will not be pruned.
 384: 	:param beam_beta: keep track of the best score in each cell and only allow
 385: 		items which are within a multiple of ``beam_beta`` of the best score.
 386: 		Should be a negative log probability. Pass ``0.0`` to disable.
 387: 	:param beam_delta: the maximum span length to which beam search is applied.
 388: 	:param itemsestimate: the number of chart items to pre-allocate.
 389: 	"""
+390: 	if grammar.maxfanout != 1:
  __pyx_t_1 = ((__pyx_v_grammar->maxfanout != 1) != 0);
  if (__pyx_t_1) {
/* … */
  }
+391: 		raise ValueError('Not a PCFG! fanout: %d' % grammar.maxfanout)
    __pyx_t_2 = __Pyx_PyInt_FromSize_t(__pyx_v_grammar->maxfanout); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyUnicode_Format(__pyx_kp_u_Not_a_PCFG_fanout_d, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 391, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 391, __pyx_L1_error)
+392: 	if not grammar.logprob:
  __pyx_t_1 = ((!(__pyx_v_grammar->logprob != 0)) != 0);
  if (__pyx_t_1) {
/* … */
  }
+393: 		raise ValueError('Expected grammar with log probabilities.')
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 393, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 393, __pyx_L1_error)
/* … */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_Expected_grammar_with_log_probab); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 393, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
+394: 	if whitelist is None and grammar.nonterminals < 20000:
  __pyx_t_4 = (__pyx_v_whitelist == Py_None);
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (__pyx_t_5) {
  } else {
    __pyx_t_1 = __pyx_t_5;
    goto __pyx_L6_bool_binop_done;
  }
  __pyx_t_5 = ((__pyx_v_grammar->nonterminals < 0x4E20) != 0);
  __pyx_t_1 = __pyx_t_5;
  __pyx_L6_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+395: 		chart = DenseCFGChart(grammar, sent, start)
    __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 395, __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_INCREF(__pyx_v_sent);
    __Pyx_GIVEREF(__pyx_v_sent);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_sent);
    __Pyx_INCREF(__pyx_v_start);
    __Pyx_GIVEREF(__pyx_v_start);
    PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_start);
    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_8discodop_4pcfg_DenseCFGChart), __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 395, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_chart = ((struct __pyx_obj_8discodop_4pcfg_CFGChart *)__pyx_t_2);
    __pyx_t_2 = 0;
+396: 		return parse_grammarloop[DenseCFGChart](
    __Pyx_XDECREF(__pyx_r);
/* … */
    __pyx_t_2 = __pyx_fuse_0__pyx_f_8discodop_4pcfg_parse_grammarloop(__pyx_v_sent, ((struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *)__pyx_v_chart), __pyx_v_tags, __pyx_v_beam_beta, __pyx_v_beam_delta); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 396, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
 397: 				sent, <DenseCFGChart>chart, tags, beam_beta, beam_delta)
+398: 	chart = SparseCFGChart(grammar, sent, start, itemsestimate=itemsestimate)
  __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v_grammar));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_grammar));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_grammar));
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_sent);
  __Pyx_INCREF(__pyx_v_start);
  __Pyx_GIVEREF(__pyx_v_start);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_start);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 398, __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, 398, __pyx_L1_error)
  __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_8discodop_4pcfg_SparseCFGChart), __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 398, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_chart = ((struct __pyx_obj_8discodop_4pcfg_CFGChart *)__pyx_t_6);
  __pyx_t_6 = 0;
+399: 	if whitelist is None:
  __pyx_t_1 = (__pyx_v_whitelist == Py_None);
  __pyx_t_5 = (__pyx_t_1 != 0);
  if (__pyx_t_5) {
/* … */
  }
+400: 		return parse_grammarloop[SparseCFGChart](
    __Pyx_XDECREF(__pyx_r);
/* … */
    __pyx_t_6 = __pyx_fuse_1__pyx_f_8discodop_4pcfg_parse_grammarloop(__pyx_v_sent, ((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_chart), __pyx_v_tags, __pyx_v_beam_beta, __pyx_v_beam_delta); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 400, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_r = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L0;
 401: 				sent, <SparseCFGChart>chart, tags, beam_beta, beam_delta)
+402: 	return parse_leftchildloop(
  __Pyx_XDECREF(__pyx_r);
/* … */
  __pyx_t_6 = __pyx_f_8discodop_4pcfg_parse_leftchildloop(__pyx_v_sent, ((struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *)__pyx_v_chart), __pyx_v_tags, ((struct __pyx_obj_8discodop_10containers_Whitelist *)__pyx_v_whitelist), __pyx_v_beam_beta, __pyx_v_beam_delta); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 402, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_r = __pyx_t_6;
  __pyx_t_6 = 0;
  goto __pyx_L0;
+403: 			sent, chart, tags, whitelist, beam_beta, beam_delta)
  if (!(likely(__Pyx_TypeTest(((PyObject *)__pyx_v_chart), __pyx_ptype_8discodop_4pcfg_SparseCFGChart)))) __PYX_ERR(0, 403, __pyx_L1_error)
  if (!(likely(((__pyx_v_whitelist) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_whitelist, __pyx_ptype_8discodop_10containers_Whitelist))))) __PYX_ERR(0, 403, __pyx_L1_error)
 404: 
 405: 
+406: cdef parse_grammarloop(sent, CFGChart_fused chart, tags,
static PyObject *__pyx_fuse_0__pyx_f_8discodop_4pcfg_parse_grammarloop(PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_chart, PyObject *__pyx_v_tags, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  Agenda<Label,Prob>  __pyx_v_unaryagenda;
  struct __pyx_t_8discodop_4pcfg_MidFilter __pyx_v_midfilter;
  ProbRule *__pyx_v_rule;
  short __pyx_v_left;
  short __pyx_v_right;
  short __pyx_v_mid;
  short __pyx_v_span;
  short __pyx_v_lensent;
  short __pyx_v_narrowl;
  short __pyx_v_narrowr;
  short __pyx_v_widel;
  short __pyx_v_wider;
  short __pyx_v_minmid;
  short __pyx_v_maxmid;
  Prob __pyx_v_prevprob;
  Prob __pyx_v_prob;
  Label __pyx_v_lhs;
  uint32_t __pyx_v_n;
  uint64_t __pyx_v_item;
  uint64_t __pyx_v_leftitem;
  uint64_t __pyx_v_rightitem;
  uint64_t __pyx_v_cell;
  uint64_t __pyx_v_blocked;
  ItemNo __pyx_v_lastidx;
  size_t __pyx_v_nts;
  PyObject *__pyx_v_covered = NULL;
  PyObject *__pyx_v_msg = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0parse_grammarloop", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.pcfg.parse_grammarloop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_XDECREF(__pyx_v_covered);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_fuse_1__pyx_f_8discodop_4pcfg_parse_grammarloop(PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_chart, PyObject *__pyx_v_tags, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  Agenda<Label,Prob>  __pyx_v_unaryagenda;
  struct __pyx_t_8discodop_4pcfg_MidFilter __pyx_v_midfilter;
  ProbRule *__pyx_v_rule;
  short __pyx_v_left;
  short __pyx_v_right;
  short __pyx_v_mid;
  short __pyx_v_span;
  short __pyx_v_lensent;
  short __pyx_v_narrowl;
  short __pyx_v_narrowr;
  short __pyx_v_widel;
  short __pyx_v_wider;
  short __pyx_v_minmid;
  short __pyx_v_maxmid;
  Prob __pyx_v_prevprob;
  Prob __pyx_v_prob;
  Label __pyx_v_lhs;
  uint32_t __pyx_v_n;
  uint64_t __pyx_v_item;
  uint64_t __pyx_v_leftitem;
  uint64_t __pyx_v_rightitem;
  uint64_t __pyx_v_cell;
  uint64_t __pyx_v_blocked;
  ItemNo __pyx_v_lastidx;
  size_t __pyx_v_nts;
  PyObject *__pyx_v_covered = NULL;
  PyObject *__pyx_v_msg = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1parse_grammarloop", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("discodop.pcfg.parse_grammarloop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_XDECREF(__pyx_v_covered);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 407: 		Prob beam_beta, int beam_delta):
 408: 	"""A CKY parser modeled after Bodenstab's 'fast grammar loop'."""
 409: 	cdef:
+410: 		Grammar grammar = chart.grammar
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
 411: 		Agenda[Label, Prob] unaryagenda
 412: 		MidFilter midfilter
 413: 		ProbRule *rule
+414: 		short left, right, mid, span, lensent = len(sent)
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 414, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
/* … */
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 414, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
 415: 		short narrowl, narrowr, widel, wider, minmid, maxmid
 416: 		Prob prevprob, prob
+417: 		Label lhs = 0
  __pyx_v_lhs = 0;
/* … */
  __pyx_v_lhs = 0;
 418: 		uint32_t n
+419: 		uint64_t item, leftitem, rightitem, cell, blocked = 0
  __pyx_v_blocked = 0;
/* … */
  __pyx_v_blocked = 0;
 420: 		ItemNo lastidx
+421: 		size_t nts = grammar.nonterminals
  __pyx_t_3 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_3;
/* … */
  __pyx_t_3 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_3;
 422: 	# Create matrices to track minima and maxima for binary splits.
+423: 	n = (lensent + 1) * nts + 1
  __pyx_v_n = (((__pyx_v_lensent + 1) * __pyx_v_nts) + 1);
/* … */
  __pyx_v_n = (((__pyx_v_lensent + 1) * __pyx_v_nts) + 1);
+424: 	midfilter.minleft.resize(n, -1)
  try {
    __pyx_v_midfilter.minleft.resize(__pyx_v_n, -1);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 424, __pyx_L1_error)
  }
/* … */
  try {
    __pyx_v_midfilter.minleft.resize(__pyx_v_n, -1);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 424, __pyx_L1_error)
  }
+425: 	midfilter.maxright.resize(n, -1)
  try {
    __pyx_v_midfilter.maxright.resize(__pyx_v_n, -1);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 425, __pyx_L1_error)
  }
/* … */
  try {
    __pyx_v_midfilter.maxright.resize(__pyx_v_n, -1);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 425, __pyx_L1_error)
  }
+426: 	midfilter.maxleft.resize(n, lensent + 1)
  try {
    __pyx_v_midfilter.maxleft.resize(__pyx_v_n, (__pyx_v_lensent + 1));
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 426, __pyx_L1_error)
  }
/* … */
  try {
    __pyx_v_midfilter.maxleft.resize(__pyx_v_n, (__pyx_v_lensent + 1));
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 426, __pyx_L1_error)
  }
+427: 	midfilter.minright.resize(n, lensent + 1)
  try {
    __pyx_v_midfilter.minright.resize(__pyx_v_n, (__pyx_v_lensent + 1));
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 427, __pyx_L1_error)
  }
/* … */
  try {
    __pyx_v_midfilter.minright.resize(__pyx_v_n, (__pyx_v_lensent + 1));
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 427, __pyx_L1_error)
  }
 428: 
+429: 	if beam_beta:
  __pyx_t_4 = (__pyx_v_beam_beta != 0);
  if (__pyx_t_4) {
/* … */
  }
/* … */
  __pyx_t_4 = (__pyx_v_beam_beta != 0);
  if (__pyx_t_4) {
/* … */
  }
+430: 		chart.beambuckets.resize(
    try {
      __pyx_v_chart->__pyx_base.beambuckets.resize((__pyx_f_8discodop_10containers_compactcellidx((__pyx_v_lensent - 1), __pyx_v_lensent, __pyx_v_lensent, 1) + 1), HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 430, __pyx_L1_error)
    }
/* … */
    try {
      __pyx_v_chart->__pyx_base.beambuckets.resize((__pyx_f_8discodop_10containers_compactcellidx((__pyx_v_lensent - 1), __pyx_v_lensent, __pyx_v_lensent, 1) + 1), HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 430, __pyx_L1_error)
    }
 431: 				compactcellidx(lensent - 1, lensent, lensent, 1) + 1,
 432: 				INFINITY)
 433: 	# assign POS tags
+434: 	covered, msg = populatepos[CFGChart_fused](chart, sent, tags,
  __pyx_t_1 = __pyx_fuse_0__pyx_f_8discodop_4pcfg_populatepos(__pyx_v_chart, __pyx_v_sent, __pyx_v_tags, __pyx_v_unaryagenda, ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None), (&__pyx_v_blocked), (&__pyx_v_midfilter), NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error)
  __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, 434, __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, 434, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 434, __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_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 434, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_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, 434, __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, 434, __pyx_L1_error)
    __pyx_L5_unpacking_done:;
  }
  __pyx_v_covered = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_msg = __pyx_t_6;
  __pyx_t_6 = 0;
/* … */
  __pyx_t_1 = __pyx_fuse_1__pyx_f_8discodop_4pcfg_populatepos(__pyx_v_chart, __pyx_v_sent, __pyx_v_tags, __pyx_v_unaryagenda, ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None), (&__pyx_v_blocked), (&__pyx_v_midfilter), NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 434, __pyx_L1_error)
  __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, 434, __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, 434, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 434, __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_7 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 434, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
    index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_5)) goto __pyx_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, 434, __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, 434, __pyx_L1_error)
    __pyx_L5_unpacking_done:;
  }
  __pyx_v_covered = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_msg = __pyx_t_6;
  __pyx_t_6 = 0;
 435: 			unaryagenda, None, &blocked, &midfilter, NULL)
+436: 	if not covered:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_covered); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 436, __pyx_L1_error)
  __pyx_t_9 = ((!__pyx_t_4) != 0);
  if (__pyx_t_9) {
/* … */
  }
/* … */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_covered); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 436, __pyx_L1_error)
  __pyx_t_9 = ((!__pyx_t_4) != 0);
  if (__pyx_t_9) {
/* … */
  }
+437: 		return chart, msg
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 437, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_INCREF(__pyx_v_msg);
    __Pyx_GIVEREF(__pyx_v_msg);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_msg);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
/* … */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 437, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_INCREF(__pyx_v_msg);
    __Pyx_GIVEREF(__pyx_v_msg);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_msg);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 438: 
+439: 	for span in range(2, lensent + 1):
  __pyx_t_10 = (__pyx_v_lensent + 1);
  for (__pyx_t_11 = 2; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_span = __pyx_t_11;
/* … */
  __pyx_t_10 = (__pyx_v_lensent + 1);
  for (__pyx_t_11 = 2; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_span = __pyx_t_11;
 440: 		# constituents from left to right
+441: 		for left in range(lensent - span + 1):
    __pyx_t_12 = ((__pyx_v_lensent - __pyx_v_span) + 1);
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
      __pyx_v_left = __pyx_t_13;
/* … */
    __pyx_t_12 = ((__pyx_v_lensent - __pyx_v_span) + 1);
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
      __pyx_v_left = __pyx_t_13;
+442: 			right = left + span
      __pyx_v_right = (__pyx_v_left + __pyx_v_span);
/* … */
      __pyx_v_right = (__pyx_v_left + __pyx_v_span);
 443: 			if CFGChart_fused is DenseCFGChart:
+444: 				cell = cellidx(left, right, lensent, nts)
      __pyx_v_cell = __pyx_f_8discodop_10containers_cellidx(__pyx_v_left, __pyx_v_right, __pyx_v_lensent, __pyx_v_nts);
 445: 			elif CFGChart_fused is SparseCFGChart:
+446: 				cell = cellstruct(left, right)
      __pyx_v_cell = __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_left, __pyx_v_right);
+447: 			lastidx = chart.items.size()
      __pyx_v_lastidx = __pyx_v_chart->__pyx_base.items.size();
/* … */
      __pyx_v_lastidx = __pyx_v_chart->__pyx_base.items.size();
 448: 			# apply all binary rules
+449: 			for lhs in range(1, grammar.phrasalnonterminals):
      __pyx_t_3 = __pyx_v_grammar->phrasalnonterminals;
      for (__pyx_t_14 = 1; __pyx_t_14 < __pyx_t_3; __pyx_t_14+=1) {
        __pyx_v_lhs = __pyx_t_14;
/* … */
      __pyx_t_3 = __pyx_v_grammar->phrasalnonterminals;
      for (__pyx_t_14 = 1; __pyx_t_14 < __pyx_t_3; __pyx_t_14+=1) {
        __pyx_v_lhs = __pyx_t_14;
+450: 				n = 0
        __pyx_v_n = 0;
/* … */
        __pyx_v_n = 0;
+451: 				rule = &(grammar.bylhs[lhs][n])
        __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
/* … */
        __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
+452: 				item = lhs + cell
        __pyx_v_item = (__pyx_v_lhs + __pyx_v_cell);
/* … */
        __pyx_v_item = (__pyx_v_lhs + __pyx_v_cell);
+453: 				prevprob = chart._subtreeprob(item)
        __pyx_v_prevprob = __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item);
/* … */
        __pyx_v_prevprob = __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item);
+454: 				while rule.lhs == lhs:
        while (1) {
          __pyx_t_9 = ((__pyx_v_rule->lhs == __pyx_v_lhs) != 0);
          if (!__pyx_t_9) break;
/* … */
        while (1) {
          __pyx_t_9 = ((__pyx_v_rule->lhs == __pyx_v_lhs) != 0);
          if (!__pyx_t_9) break;
+455: 					narrowr = midfilter.minright[left * nts + rule.rhs1]
          __pyx_v_narrowr = (__pyx_v_midfilter.minright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_rule->rhs1)]);
/* … */
          __pyx_v_narrowr = (__pyx_v_midfilter.minright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_rule->rhs1)]);
+456: 					narrowl = midfilter.minleft[right * nts + rule.rhs2]
          __pyx_v_narrowl = (__pyx_v_midfilter.minleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_rule->rhs2)]);
/* … */
          __pyx_v_narrowl = (__pyx_v_midfilter.minleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_rule->rhs2)]);
+457: 					if (rule.rhs2 == 0 or narrowr >= right or narrowl < narrowr
          __pyx_t_4 = ((__pyx_v_rule->rhs2 == 0) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_4 = ((__pyx_v_narrowr >= __pyx_v_right) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
/* … */
          __pyx_t_4 = ((__pyx_v_narrowl < __pyx_v_narrowr) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
/* … */
          if (__pyx_t_9) {
/* … */
          }
/* … */
          __pyx_t_4 = ((__pyx_v_rule->rhs2 == 0) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
          __pyx_t_4 = ((__pyx_v_narrowr >= __pyx_v_right) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
/* … */
          __pyx_t_4 = ((__pyx_v_narrowl < __pyx_v_narrowr) != 0);
          if (!__pyx_t_4) {
          } else {
            __pyx_t_9 = __pyx_t_4;
            goto __pyx_L16_bool_binop_done;
          }
/* … */
          if (__pyx_t_9) {
/* … */
          }
+458: 							or TESTBIT(grammar.mask, rule.no)):
          __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
          __pyx_t_9 = __pyx_t_4;
          __pyx_L16_bool_binop_done:;
          __pyx_t_4 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
          __pyx_t_9 = __pyx_t_4;
          __pyx_L16_bool_binop_done:;
+459: 						n += 1
            __pyx_v_n = (__pyx_v_n + 1);
/* … */
            __pyx_v_n = (__pyx_v_n + 1);
+460: 						rule = &(grammar.bylhs[lhs][n])
            __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
/* … */
            __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
+461: 						continue
            goto __pyx_L13_continue;
/* … */
            goto __pyx_L13_continue;
+462: 					widel = midfilter.maxleft[right * nts + rule.rhs2]
          __pyx_v_widel = (__pyx_v_midfilter.maxleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_rule->rhs2)]);
/* … */
          __pyx_v_widel = (__pyx_v_midfilter.maxleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_rule->rhs2)]);
+463: 					minmid = narrowr if narrowr > widel else widel
          if (((__pyx_v_narrowr > __pyx_v_widel) != 0)) {
            __pyx_t_15 = __pyx_v_narrowr;
          } else {
            __pyx_t_15 = __pyx_v_widel;
          }
          __pyx_v_minmid = __pyx_t_15;
/* … */
          if (((__pyx_v_narrowr > __pyx_v_widel) != 0)) {
            __pyx_t_15 = __pyx_v_narrowr;
          } else {
            __pyx_t_15 = __pyx_v_widel;
          }
          __pyx_v_minmid = __pyx_t_15;
+464: 					wider = midfilter.maxright[left * nts + rule.rhs1]
          __pyx_v_wider = (__pyx_v_midfilter.maxright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_rule->rhs1)]);
/* … */
          __pyx_v_wider = (__pyx_v_midfilter.maxright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_rule->rhs1)]);
+465: 					maxmid = wider if wider < narrowl else narrowl
          if (((__pyx_v_wider < __pyx_v_narrowl) != 0)) {
            __pyx_t_15 = __pyx_v_wider;
          } else {
            __pyx_t_15 = __pyx_v_narrowl;
          }
          __pyx_v_maxmid = __pyx_t_15;
/* … */
          if (((__pyx_v_wider < __pyx_v_narrowl) != 0)) {
            __pyx_t_15 = __pyx_v_wider;
          } else {
            __pyx_t_15 = __pyx_v_narrowl;
          }
          __pyx_v_maxmid = __pyx_t_15;
+466: 					for mid in range(minmid, maxmid + 1):
          __pyx_t_16 = (__pyx_v_maxmid + 1);
          for (__pyx_t_15 = __pyx_v_minmid; __pyx_t_15 < __pyx_t_16; __pyx_t_15+=1) {
            __pyx_v_mid = __pyx_t_15;
/* … */
          __pyx_t_16 = (__pyx_v_maxmid + 1);
          for (__pyx_t_15 = __pyx_v_minmid; __pyx_t_15 < __pyx_t_16; __pyx_t_15+=1) {
            __pyx_v_mid = __pyx_t_15;
 467: 						if CFGChart_fused is DenseCFGChart:
+468: 							leftitem = rule.rhs1 + cellidx(left, mid,
            __pyx_v_leftitem = (__pyx_v_rule->rhs1 + __pyx_f_8discodop_10containers_cellidx(__pyx_v_left, __pyx_v_mid, __pyx_v_lensent, __pyx_v_nts));
 469: 									lensent, nts)
+470: 							rightitem = rule.rhs2 + cellidx(mid, right,
            __pyx_v_rightitem = (__pyx_v_rule->rhs2 + __pyx_f_8discodop_10containers_cellidx(__pyx_v_mid, __pyx_v_right, __pyx_v_lensent, __pyx_v_nts));
 471: 									lensent, nts)
 472: 						elif CFGChart_fused is SparseCFGChart:
+473: 							leftitem = rule.rhs1 + cellstruct(left, mid)
            __pyx_v_leftitem = (__pyx_v_rule->rhs1 + __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_left, __pyx_v_mid));
+474: 							rightitem = rule.rhs2 + cellstruct(mid, right)
            __pyx_v_rightitem = (__pyx_v_rule->rhs2 + __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_mid, __pyx_v_right));
+475: 						prob = chart._subtreeprob(leftitem)
            __pyx_v_prob = __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_leftitem);
/* … */
            __pyx_v_prob = __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_leftitem);
+476: 						if isinf(prob):
            __pyx_t_9 = (isinf(__pyx_v_prob) != 0);
            if (__pyx_t_9) {
/* … */
            }
/* … */
            __pyx_t_9 = (isinf(__pyx_v_prob) != 0);
            if (__pyx_t_9) {
/* … */
            }
+477: 							continue
              goto __pyx_L20_continue;
/* … */
              goto __pyx_L20_continue;
+478: 						prob += chart._subtreeprob(rightitem)
            __pyx_v_prob = (__pyx_v_prob + __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_rightitem));
/* … */
            __pyx_v_prob = (__pyx_v_prob + __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_rightitem));
+479: 						if isfinite(prob):
            __pyx_t_9 = (isfinite(__pyx_v_prob) != 0);
            if (__pyx_t_9) {
/* … */
            }
            __pyx_L20_continue:;
          }
/* … */
            __pyx_t_9 = (isfinite(__pyx_v_prob) != 0);
            if (__pyx_t_9) {
/* … */
            }
            __pyx_L20_continue:;
          }
+480: 							if chart.updateprob(item, prob + rule.prob,
              __pyx_t_9 = (__pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(__pyx_v_chart, __pyx_v_item, (__pyx_v_prob + __pyx_v_rule->prob), __pyx_t_17) != 0);
              if (__pyx_t_9) {
/* … */
                goto __pyx_L24;
              }
/* … */
              __pyx_t_9 = (__pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(__pyx_v_chart, __pyx_v_item, (__pyx_v_prob + __pyx_v_rule->prob), __pyx_t_17) != 0);
              if (__pyx_t_9) {
/* … */
                goto __pyx_L24;
              }
+481: 									beam_beta if span <= beam_delta else 0.0):
              if (((__pyx_v_span <= __pyx_v_beam_delta) != 0)) {
                __pyx_t_17 = __pyx_v_beam_beta;
              } else {
                __pyx_t_17 = 0.0;
              }
/* … */
              if (((__pyx_v_span <= __pyx_v_beam_delta) != 0)) {
                __pyx_t_17 = __pyx_v_beam_beta;
              } else {
                __pyx_t_17 = 0.0;
              }
+482: 								chart.addedge(item, mid, rule)
                __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(__pyx_v_chart, __pyx_v_item, __pyx_v_mid, __pyx_v_rule);
/* … */
                __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(__pyx_v_chart, __pyx_v_item, __pyx_v_mid, __pyx_v_rule);
 483: 							else:
+484: 								blocked += 1
              /*else*/ {
                __pyx_v_blocked = (__pyx_v_blocked + 1);
              }
              __pyx_L24:;
/* … */
              /*else*/ {
                __pyx_v_blocked = (__pyx_v_blocked + 1);
              }
              __pyx_L24:;
+485: 					n += 1
          __pyx_v_n = (__pyx_v_n + 1);
/* … */
          __pyx_v_n = (__pyx_v_n + 1);
+486: 					rule = &(grammar.bylhs[lhs][n])
          __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
          __pyx_L13_continue:;
        }
/* … */
          __pyx_v_rule = (&((__pyx_v_grammar->bylhs[__pyx_v_lhs])[__pyx_v_n]));
          __pyx_L13_continue:;
        }
 487: 
+488: 				if isinf(prevprob) and isfinite(chart._subtreeprob(item)):
        __pyx_t_4 = (isinf(__pyx_v_prevprob) != 0);
        if (__pyx_t_4) {
        } else {
          __pyx_t_9 = __pyx_t_4;
          goto __pyx_L26_bool_binop_done;
        }
        __pyx_t_4 = (isfinite(__pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item)) != 0);
        __pyx_t_9 = __pyx_t_4;
        __pyx_L26_bool_binop_done:;
        if (__pyx_t_9) {
/* … */
        }
      }
/* … */
        __pyx_t_4 = (isinf(__pyx_v_prevprob) != 0);
        if (__pyx_t_4) {
        } else {
          __pyx_t_9 = __pyx_t_4;
          goto __pyx_L26_bool_binop_done;
        }
        __pyx_t_4 = (isfinite(__pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item)) != 0);
        __pyx_t_9 = __pyx_t_4;
        __pyx_L26_bool_binop_done:;
        if (__pyx_t_9) {
/* … */
        }
      }
+489: 					updatemidfilter(midfilter, left, right, lhs, nts)
          __pyx_f_8discodop_4pcfg_updatemidfilter(__pyx_v_midfilter, __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
/* … */
          __pyx_f_8discodop_4pcfg_updatemidfilter(__pyx_v_midfilter, __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
 490: 
+491: 			applyunaryrules[CFGChart_fused](chart, left, right, cell, lastidx,
      __pyx_fuse_0__pyx_f_8discodop_4pcfg_applyunaryrules(__pyx_v_chart, __pyx_v_left, __pyx_v_right, __pyx_v_cell, __pyx_v_lastidx, __pyx_v_unaryagenda, (&__pyx_v_midfilter), (&__pyx_v_blocked), ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None));
    }
  }
/* … */
      __pyx_fuse_1__pyx_f_8discodop_4pcfg_applyunaryrules(__pyx_v_chart, __pyx_v_left, __pyx_v_right, __pyx_v_cell, __pyx_v_lastidx, __pyx_v_unaryagenda, (&__pyx_v_midfilter), (&__pyx_v_blocked), ((struct __pyx_obj_8discodop_10containers_Whitelist *)Py_None));
    }
  }
 492: 					unaryagenda, &midfilter, &blocked, None)
 493: 
+494: 	msg = '%s%s, blocked %s' % (
  __pyx_t_5 = PyUnicode_Format(__pyx_kp_u_s_s_blocked_s, __pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF_SET(__pyx_v_msg, __pyx_t_5);
  __pyx_t_5 = 0;
/* … */
  __pyx_t_5 = PyUnicode_Format(__pyx_kp_u_s_s_blocked_s, __pyx_t_7); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF_SET(__pyx_v_msg, __pyx_t_5);
  __pyx_t_5 = 0;
+495: 			'' if chart else 'no parse; ', chart.stats(), blocked)
  __pyx_t_9 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_chart)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 495, __pyx_L1_error)
  if (__pyx_t_9) {
    __Pyx_INCREF(__pyx_kp_u__2);
    __pyx_t_1 = __pyx_kp_u__2;
  } else {
    __Pyx_INCREF(__pyx_kp_u_no_parse);
    __pyx_t_1 = __pyx_kp_u_no_parse;
  }
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_stats); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (__pyx_t_7) {
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 495, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  } else {
    __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 495, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyInt_From_uint64_t(__pyx_v_blocked); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5);
  __pyx_t_1 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
/* … */
  __pyx_t_9 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_chart)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 495, __pyx_L1_error)
  if (__pyx_t_9) {
    __Pyx_INCREF(__pyx_kp_u__2);
    __pyx_t_1 = __pyx_kp_u__2;
  } else {
    __Pyx_INCREF(__pyx_kp_u_no_parse);
    __pyx_t_1 = __pyx_kp_u_no_parse;
  }
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_stats); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (__pyx_t_7) {
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 495, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  } else {
    __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 495, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_PyInt_From_uint64_t(__pyx_v_blocked); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_6);
  PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_5);
  __pyx_t_1 = 0;
  __pyx_t_6 = 0;
  __pyx_t_5 = 0;
+496: 	return chart, msg
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 496, __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, 496, __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;
 497: 
 498: 
+499: cdef parse_leftchildloop(sent, SparseCFGChart chart, tags,
static PyObject *__pyx_f_8discodop_4pcfg_parse_leftchildloop(PyObject *__pyx_v_sent, struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_chart, PyObject *__pyx_v_tags, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, Prob __pyx_v_beam_beta, int __pyx_v_beam_delta) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  Agenda<Label,Prob>  __pyx_v_unaryagenda;
  ProbRule *__pyx_v_rule;
  std::vector<size_t>  __pyx_v_cellindex;
  Prob __pyx_v_leftprob;
  Prob __pyx_v_rightprob;
  Label __pyx_v_rhs1;
  ItemNo __pyx_v_leftitemidx;
  ItemNo __pyx_v_lastidx;
  uint64_t __pyx_v_item;
  uint64_t __pyx_v_leftitem;
  uint64_t __pyx_v_rightcell;
  uint64_t __pyx_v_cell;
  uint64_t __pyx_v_ccell;
  uint64_t __pyx_v_blocked;
  uint32_t __pyx_v_n;
  short __pyx_v_left;
  short __pyx_v_right;
  short __pyx_v_mid;
  short __pyx_v_span;
  short __pyx_v_lensent;
  union __pyx_t_8discodop_4pcfg_CFGItem __pyx_v_li;
  PyObject *__pyx_v_covered = NULL;
  PyObject *__pyx_v_msg = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("parse_leftchildloop", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("discodop.pcfg.parse_leftchildloop", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_XDECREF(__pyx_v_covered);
  __Pyx_XDECREF(__pyx_v_msg);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 500: 		Whitelist whitelist, Prob beam_beta, int beam_delta):
 501: 	"""A CKY parser that iterates over items in chart and compatible rules."""
 502: 	cdef:
+503: 		Grammar grammar = chart.grammar
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
 504: 		Agenda[Label, Prob] unaryagenda
 505: 		ProbRule *rule
 506: 		vector[size_t] cellindex  # compact cell idx => itemidx
 507: 		Prob leftprob, rightprob
 508: 		Label rhs1
 509: 		ItemNo leftitemidx, lastidx
 510: 		uint64_t item, leftitem, rightcell, cell, ccell
+511: 		uint64_t blocked = 0
  __pyx_v_blocked = 0;
 512: 		uint32_t n
+513: 		short left, right, mid, span, lensent = len(sent)
  __pyx_t_2 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 513, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_2;
 514: 		CFGItem li
+515: 	cellindex.resize(compactcellidx(lensent - 1, lensent, lensent, 1) + 2, 0)
  try {
    __pyx_v_cellindex.resize((__pyx_f_8discodop_10containers_compactcellidx((__pyx_v_lensent - 1), __pyx_v_lensent, __pyx_v_lensent, 1) + 2), 0);
  } catch(...) {
    __Pyx_CppExn2PyErr();
    __PYX_ERR(0, 515, __pyx_L1_error)
  }
+516: 	if beam_beta:
  __pyx_t_3 = (__pyx_v_beam_beta != 0);
  if (__pyx_t_3) {
/* … */
  }
+517: 		chart.beambuckets.resize(
    try {
      __pyx_v_chart->__pyx_base.beambuckets.resize((__pyx_f_8discodop_10containers_compactcellidx((__pyx_v_lensent - 1), __pyx_v_lensent, __pyx_v_lensent, 1) + 1), HUGE_VAL);
    } catch(...) {
      __Pyx_CppExn2PyErr();
      __PYX_ERR(0, 517, __pyx_L1_error)
    }
 518: 				compactcellidx(lensent - 1, lensent, lensent, 1) + 1, INFINITY)
 519: 	# assign POS tags
+520: 	covered, msg = populatepos(chart, sent, tags, unaryagenda, whitelist,
  __pyx_t_1 = __pyx_fuse_1__pyx_f_8discodop_4pcfg_populatepos(__pyx_v_chart, __pyx_v_sent, __pyx_v_tags, __pyx_v_unaryagenda, __pyx_v_whitelist, (&__pyx_v_blocked), NULL, (&__pyx_v_cellindex)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 520, __pyx_L1_error)
  __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, 520, __pyx_L1_error)
    }
    #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 520, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 520, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_6 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 520, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext;
    index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L4_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_4);
    index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L4_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 520, __pyx_L1_error)
    __pyx_t_7 = NULL;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    goto __pyx_L5_unpacking_done;
    __pyx_L4_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    __PYX_ERR(0, 520, __pyx_L1_error)
    __pyx_L5_unpacking_done:;
  }
  __pyx_v_covered = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_msg = __pyx_t_5;
  __pyx_t_5 = 0;
 521: 			&blocked, NULL, &cellindex)
+522: 	if not covered:
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_covered); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 522, __pyx_L1_error)
  __pyx_t_8 = ((!__pyx_t_3) != 0);
  if (__pyx_t_8) {
/* … */
  }
+523: 		return chart, msg
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 523, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(((PyObject *)__pyx_v_chart));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
    PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_chart));
    __Pyx_INCREF(__pyx_v_msg);
    __Pyx_GIVEREF(__pyx_v_msg);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_msg);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 524: 
+525: 	for span in range(2, lensent + 1):
  __pyx_t_9 = (__pyx_v_lensent + 1);
  for (__pyx_t_10 = 2; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_span = __pyx_t_10;
 526: 		# constituents from left to right
+527: 		for left in range(lensent - span + 1):
    __pyx_t_11 = ((__pyx_v_lensent - __pyx_v_span) + 1);
    for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
      __pyx_v_left = __pyx_t_12;
+528: 			right = left + span
      __pyx_v_right = (__pyx_v_left + __pyx_v_span);
+529: 			cell = cellstruct(left, right)
      __pyx_v_cell = __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_left, __pyx_v_right);
+530: 			ccell = compactcellidx(left, right, lensent, 1)
      __pyx_v_ccell = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_lensent, 1);
+531: 			cellindex[ccell] = lastidx = chart.items.size()
      __pyx_t_13 = __pyx_v_chart->__pyx_base.items.size();
      (__pyx_v_cellindex[__pyx_v_ccell]) = __pyx_t_13;
      __pyx_v_lastidx = __pyx_t_13;
 532: 			# apply binary rules; if whitelist is given, skip labels not in set
+533: 			for mid in range(left + 1, right):
      __pyx_t_14 = __pyx_v_right;
      for (__pyx_t_15 = (__pyx_v_left + 1); __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {
        __pyx_v_mid = __pyx_t_15;
+534: 				rightcell = cellstruct(mid, right)
        __pyx_v_rightcell = __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_mid, __pyx_v_right);
+535: 				leftitemidx = cellindex[compactcellidx(left, mid, lensent, 1)]
        __pyx_v_leftitemidx = (__pyx_v_cellindex[__pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_mid, __pyx_v_lensent, 1)]);
+536: 				leftitem = chart.items[leftitemidx]
        __pyx_v_leftitem = (__pyx_v_chart->__pyx_base.items[__pyx_v_leftitemidx]);
+537: 				li.dt = leftitem
        __pyx_v_li.dt = __pyx_v_leftitem;
+538: 				while li.st.end == mid:
        while (1) {
          __pyx_t_8 = ((__pyx_v_li.st.end == __pyx_v_mid) != 0);
          if (!__pyx_t_8) break;
+539: 					leftprob = (<Chart>chart).subtreeprob(leftitemidx)
          __pyx_v_leftprob = ((struct __pyx_vtabstruct_8discodop_10containers_Chart *)((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart)->__pyx_vtab)->subtreeprob(((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart), __pyx_v_leftitemidx);
+540: 					rhs1 = chart._label(leftitem)
          __pyx_v_rhs1 = __pyx_f_8discodop_4pcfg_14SparseCFGChart__label(__pyx_v_chart, __pyx_v_leftitem);
+541: 					n = 0
          __pyx_v_n = 0;
+542: 					rule = &(grammar.lbinary[rhs1][n])
          __pyx_v_rule = (&((__pyx_v_grammar->lbinary[__pyx_v_rhs1])[__pyx_v_n]));
+543: 					while rule.rhs1 == rhs1 and n < grammar.numbinary:
          while (1) {
            __pyx_t_3 = ((__pyx_v_rule->rhs1 == __pyx_v_rhs1) != 0);
            if (__pyx_t_3) {
            } else {
              __pyx_t_8 = __pyx_t_3;
              goto __pyx_L17_bool_binop_done;
            }
            __pyx_t_3 = ((__pyx_v_n < __pyx_v_grammar->numbinary) != 0);
            __pyx_t_8 = __pyx_t_3;
            __pyx_L17_bool_binop_done:;
            if (!__pyx_t_8) break;
 544: 						# This requires a hash table lookup of right item;
 545: 						# might be better if items in cell are together
 546: 						# in own datastructure
+547: 						rightprob = chart._subtreeprob(rightcell + rule.rhs2)
            __pyx_v_rightprob = __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, (__pyx_v_rightcell + __pyx_v_rule->rhs2));
+548: 						item = cell + rule.lhs
            __pyx_v_item = (__pyx_v_cell + __pyx_v_rule->lhs);
+549: 						if isfinite(rightprob):
            __pyx_t_8 = (isfinite(__pyx_v_rightprob) != 0);
            if (__pyx_t_8) {
/* … */
            }
+550: 							if TESTBIT(grammar.mask, rule.no) or (
              __pyx_t_3 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
              if (!__pyx_t_3) {
              } else {
                __pyx_t_8 = __pyx_t_3;
                goto __pyx_L21_bool_binop_done;
              }
/* … */
              if (__pyx_t_8) {
/* … */
                goto __pyx_L20;
              }
+551: 									whitelist is not None
              __pyx_t_3 = (((PyObject *)__pyx_v_whitelist) != Py_None);
              __pyx_t_16 = (__pyx_t_3 != 0);
              if (__pyx_t_16) {
              } else {
                __pyx_t_8 = __pyx_t_16;
                goto __pyx_L21_bool_binop_done;
              }
+552: 									and whitelist.mapping[rule.lhs]
              __pyx_t_16 = ((__pyx_v_whitelist->mapping[__pyx_v_rule->lhs]) != 0);
              if (__pyx_t_16) {
              } else {
                __pyx_t_8 = __pyx_t_16;
                goto __pyx_L21_bool_binop_done;
              }
+553: 									and not whitelist.cfg[ccell].count(
              __pyx_t_16 = ((!((__pyx_v_whitelist->cfg[__pyx_v_ccell]).count((__pyx_v_whitelist->mapping[__pyx_v_rule->lhs])) != 0)) != 0);
              __pyx_t_8 = __pyx_t_16;
              __pyx_L21_bool_binop_done:;
 554: 										whitelist.mapping[rule.lhs])):
+555: 								blocked += 1
                __pyx_v_blocked = (__pyx_v_blocked + 1);
+556: 							elif not chart.updateprob(
              __pyx_t_8 = ((!(__pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(__pyx_v_chart, __pyx_v_item, ((__pyx_v_leftprob + __pyx_v_rightprob) + __pyx_v_rule->prob), __pyx_t_17) != 0)) != 0);
              if (__pyx_t_8) {
/* … */
                goto __pyx_L20;
              }
 557: 									item, leftprob + rightprob + rule.prob,
+558: 									beam_beta if span <= beam_delta else 0.0):
              if (((__pyx_v_span <= __pyx_v_beam_delta) != 0)) {
                __pyx_t_17 = __pyx_v_beam_beta;
              } else {
                __pyx_t_17 = 0.0;
              }
+559: 								blocked += 1
                __pyx_v_blocked = (__pyx_v_blocked + 1);
 560: 							else:
+561: 								chart.addedge(item, mid, rule)
              /*else*/ {
                __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(__pyx_v_chart, __pyx_v_item, __pyx_v_mid, __pyx_v_rule);
              }
              __pyx_L20:;
+562: 						n += 1
            __pyx_v_n = (__pyx_v_n + 1);
+563: 						rule = &(grammar.lbinary[rhs1][n])
            __pyx_v_rule = (&((__pyx_v_grammar->lbinary[__pyx_v_rhs1])[__pyx_v_n]));
          }
+564: 					leftitemidx += 1
          __pyx_v_leftitemidx = (__pyx_v_leftitemidx + 1);
+565: 					leftitem = chart.items[leftitemidx]
          __pyx_v_leftitem = (__pyx_v_chart->__pyx_base.items[__pyx_v_leftitemidx]);
+566: 					li.dt = leftitem
          __pyx_v_li.dt = __pyx_v_leftitem;
        }
      }
 567: 
+568: 			applyunaryrules(chart, left, right, cell, lastidx, unaryagenda,
      __pyx_fuse_1__pyx_f_8discodop_4pcfg_applyunaryrules(__pyx_v_chart, __pyx_v_left, __pyx_v_right, __pyx_v_cell, __pyx_v_lastidx, __pyx_v_unaryagenda, NULL, (&__pyx_v_blocked), __pyx_v_whitelist);
 569: 					NULL, &blocked, whitelist)
+570: 			cellindex[ccell + 1] = chart.items.size()
      (__pyx_v_cellindex[(__pyx_v_ccell + 1)]) = __pyx_v_chart->__pyx_base.items.size();
    }
  }
+571: 	msg = '%s%s, blocked %s' % (
  __pyx_t_4 = PyUnicode_Format(__pyx_kp_u_s_s_blocked_s, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 571, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF_SET(__pyx_v_msg, __pyx_t_4);
  __pyx_t_4 = 0;
+572: 			'' if chart else 'no parse; ', chart.stats(), blocked)
  __pyx_t_8 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_chart)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 572, __pyx_L1_error)
  if (__pyx_t_8) {
    __Pyx_INCREF(__pyx_kp_u__2);
    __pyx_t_1 = __pyx_kp_u__2;
  } else {
    __Pyx_INCREF(__pyx_kp_u_no_parse);
    __pyx_t_1 = __pyx_kp_u_no_parse;
  }
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_chart), __pyx_n_s_stats); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __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_5 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 572, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  } else {
    __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 572, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_uint64_t(__pyx_v_blocked); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 572, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_t_4);
  __pyx_t_1 = 0;
  __pyx_t_5 = 0;
  __pyx_t_4 = 0;
+573: 	return chart, msg
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 573, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_INCREF(((PyObject *)__pyx_v_chart));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_chart));
  PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_chart));
  __Pyx_INCREF(__pyx_v_msg);
  __Pyx_GIVEREF(__pyx_v_msg);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_msg);
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;
 574: 
 575: 
+576: cdef populatepos(CFGChart_fused chart, sent, tags,
static PyObject *__pyx_fuse_0__pyx_f_8discodop_4pcfg_populatepos(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_chart, PyObject *__pyx_v_sent, PyObject *__pyx_v_tags, Agenda<Label,Prob>  &__pyx_v_unaryagenda, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, uint64_t *__pyx_v_blocked, struct __pyx_t_8discodop_4pcfg_MidFilter *__pyx_v_midfilter, std::vector<size_t>  *__pyx_v_cellindex) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  LexicalRule __pyx_v_lexrule;
  Label __pyx_v_lhs;
  size_t __pyx_v_nts;
  ItemNo __pyx_v_lastidx;
  uint64_t __pyx_v_cell;
  uint64_t __pyx_v_ccell;
  uint32_t __pyx_v_n;
  short __pyx_v_left;
  short __pyx_v_right;
  short __pyx_v_lensent;
  PyObject *__pyx_v_word = NULL;
  PyObject *__pyx_v_tag = NULL;
  PyObject *__pyx_v_tagre = NULL;
  int __pyx_v_recognized;
  spp::sparse_hash_map<std::string,std::vector<uint32_t> > ::iterator __pyx_v_it;
  std::pair<Label,spp::sparse_hash_map<std::string,uint32_t> >  __pyx_v_x;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0populatepos", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __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_AddTraceback("discodop.pcfg.populatepos", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __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__pyx_f_8discodop_4pcfg_populatepos(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_chart, PyObject *__pyx_v_sent, PyObject *__pyx_v_tags, Agenda<Label,Prob>  &__pyx_v_unaryagenda, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist, uint64_t *__pyx_v_blocked, struct __pyx_t_8discodop_4pcfg_MidFilter *__pyx_v_midfilter, std::vector<size_t>  *__pyx_v_cellindex) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  LexicalRule __pyx_v_lexrule;
  Label __pyx_v_lhs;
  size_t __pyx_v_nts;
  ItemNo __pyx_v_lastidx;
  uint64_t __pyx_v_cell;
  uint64_t __pyx_v_ccell;
  uint32_t __pyx_v_n;
  short __pyx_v_left;
  short __pyx_v_right;
  short __pyx_v_lensent;
  PyObject *__pyx_v_word = NULL;
  PyObject *__pyx_v_tag = NULL;
  PyObject *__pyx_v_tagre = NULL;
  int __pyx_v_recognized;
  spp::sparse_hash_map<std::string,std::vector<uint32_t> > ::iterator __pyx_v_it;
  std::pair<Label,spp::sparse_hash_map<std::string,uint32_t> >  __pyx_v_x;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1populatepos", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_6);
  __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_AddTraceback("discodop.pcfg.populatepos", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_XDECREF(__pyx_v_word);
  __Pyx_XDECREF(__pyx_v_tag);
  __Pyx_XDECREF(__pyx_v_tagre);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 577: 		Agenda[Label, Prob]& unaryagenda, Whitelist whitelist,
 578: 		uint64_t *blocked, MidFilter *midfilter, vector[size_t] *cellindex):
 579: 	"""Apply all possible lexical and unary rules on each lexical span.
 580: 
 581: 	:param unaryagenda: expects an empty agenda; only passed around to reuse
 582: 		allocated memory.
 583: 	:returns: a tuple ``(success, msg)`` where ``success`` is True if a POS tag
 584: 		was found for every word in the sentence."""
 585: 	cdef:
+586: 		Grammar grammar = chart.grammar
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
 587: 		LexicalRule lexrule
 588: 		Label lhs
+589: 		size_t nts = grammar.nonterminals
  __pyx_t_2 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_2;
/* … */
  __pyx_t_2 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_2;
 590: 		ItemNo lastidx
+591: 		uint64_t cell, ccell = 0
  __pyx_v_ccell = 0;
/* … */
  __pyx_v_ccell = 0;
 592: 		uint32_t n
+593: 		short left, right, lensent = len(sent)
  __pyx_t_3 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 593, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_3;
/* … */
  __pyx_t_3 = PyObject_Length(__pyx_v_sent); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 593, __pyx_L1_error)
  __pyx_v_lensent = __pyx_t_3;
+594: 	for left, word in enumerate(sent):
  __pyx_t_4 = 0;
  if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) {
    __pyx_t_1 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 594, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 594, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_1))) {
        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 594, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      } else {
        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 594, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      }
    } else {
      __pyx_t_6 = __pyx_t_5(__pyx_t_1);
      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, 594, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_6);
    }
    __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_left = __pyx_t_4;
    __pyx_t_4 = (__pyx_t_4 + 1);
/* … */
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
  __pyx_t_4 = 0;
  if (likely(PyList_CheckExact(__pyx_v_sent)) || PyTuple_CheckExact(__pyx_v_sent)) {
    __pyx_t_1 = __pyx_v_sent; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_3 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_sent); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 594, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_5 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 594, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_1))) {
        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 594, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      } else {
        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_6 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_3); __Pyx_INCREF(__pyx_t_6); __pyx_t_3++; if (unlikely(0 < 0)) __PYX_ERR(0, 594, __pyx_L1_error)
        #else
        __pyx_t_6 = PySequence_ITEM(__pyx_t_1, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 594, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        #endif
      }
    } else {
      __pyx_t_6 = __pyx_t_5(__pyx_t_1);
      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, 594, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_6);
    }
    __Pyx_XDECREF_SET(__pyx_v_word, __pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_v_left = __pyx_t_4;
    __pyx_t_4 = (__pyx_t_4 + 1);
/* … */
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+595: 		tag = tags[left] if tags else None
    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 595, __pyx_L1_error)
    if (__pyx_t_7) {
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_tags, __pyx_v_left, short, 1, __Pyx_PyInt_From_short, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 595, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = __pyx_t_8;
      __pyx_t_8 = 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_7 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 595, __pyx_L1_error)
    if (__pyx_t_7) {
      __pyx_t_8 = __Pyx_GetItemInt(__pyx_v_tags, __pyx_v_left, short, 1, __Pyx_PyInt_From_short, 0, 0, 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 595, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = __pyx_t_8;
      __pyx_t_8 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tag, __pyx_t_6);
    __pyx_t_6 = 0;
 596: 		# if we are given gold tags, make sure we only allow matching
 597: 		# tags - after removing addresses introduced by the DOP reduction
 598: 		# and other state splits.
+599: 		tagre = re.compile('%s($|[-@^/])' % re.escape(tag)) if tags else None
    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 599, __pyx_L1_error)
    if (__pyx_t_7) {
      __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_compile); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_escape); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __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_9 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_tag); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_v_tag};
          __pyx_t_9 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_9);
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_v_tag};
          __pyx_t_9 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_9);
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL;
          __Pyx_INCREF(__pyx_v_tag);
          __Pyx_GIVEREF(__pyx_v_tag);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_tag);
          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_13, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_9);
          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_12 = PyUnicode_Format(__pyx_kp_u_s, __pyx_t_9); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_9 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) {
        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
        if (likely(__pyx_t_9)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_9);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_10, function);
        }
      }
      if (!__pyx_t_9) {
        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_12); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_GOTREF(__pyx_t_8);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_9, __pyx_t_12};
          __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_9, __pyx_t_12};
          __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9); __pyx_t_9 = NULL;
          __Pyx_GIVEREF(__pyx_t_12);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_12);
          __pyx_t_12 = 0;
          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __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_6 = __pyx_t_8;
      __pyx_t_8 = 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_7 = __Pyx_PyObject_IsTrue(__pyx_v_tags); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 599, __pyx_L1_error)
    if (__pyx_t_7) {
      __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_compile); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_11, __pyx_n_s_escape); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __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_9 = __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_tag); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_9);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_v_tag};
          __pyx_t_9 = __Pyx_PyFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_9);
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_12)) {
          PyObject *__pyx_temp[2] = {__pyx_t_11, __pyx_v_tag};
          __pyx_t_9 = __Pyx_PyCFunction_FastCall(__pyx_t_12, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
          __Pyx_GOTREF(__pyx_t_9);
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL;
          __Pyx_INCREF(__pyx_v_tag);
          __Pyx_GIVEREF(__pyx_v_tag);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_v_tag);
          __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_12, __pyx_t_13, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_9);
          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        }
      }
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      __pyx_t_12 = PyUnicode_Format(__pyx_kp_u_s, __pyx_t_9); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 599, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_12);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_9 = NULL;
      if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_10))) {
        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
        if (likely(__pyx_t_9)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_9);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_10, function);
        }
      }
      if (!__pyx_t_9) {
        __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_12); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_GOTREF(__pyx_t_8);
      } else {
        #if CYTHON_FAST_PYCALL
        if (PyFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_9, __pyx_t_12};
          __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        } else
        #endif
        #if CYTHON_FAST_PYCCALL
        if (__Pyx_PyFastCFunction_Check(__pyx_t_10)) {
          PyObject *__pyx_temp[2] = {__pyx_t_9, __pyx_t_12};
          __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_10, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_GOTREF(__pyx_t_8);
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        } else
        #endif
        {
          __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 599, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_9); __pyx_t_9 = NULL;
          __Pyx_GIVEREF(__pyx_t_12);
          PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_12);
          __pyx_t_12 = 0;
          __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 599, __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_6 = __pyx_t_8;
      __pyx_t_8 = 0;
    } else {
      __Pyx_INCREF(Py_None);
      __pyx_t_6 = Py_None;
    }
    __Pyx_XDECREF_SET(__pyx_v_tagre, __pyx_t_6);
    __pyx_t_6 = 0;
+600: 		right = left + 1
    __pyx_v_right = (__pyx_v_left + 1);
/* … */
    __pyx_v_right = (__pyx_v_left + 1);
 601: 		if CFGChart_fused is DenseCFGChart:
+602: 			cell = cellidx(left, right, lensent, nts)
    __pyx_v_cell = __pyx_f_8discodop_10containers_cellidx(__pyx_v_left, __pyx_v_right, __pyx_v_lensent, __pyx_v_nts);
 603: 		elif CFGChart_fused is SparseCFGChart:
+604: 			cell = cellstruct(left, right)
    __pyx_v_cell = __pyx_f_8discodop_4pcfg_cellstruct(__pyx_v_left, __pyx_v_right);
+605: 		ccell = compactcellidx(left, right, lensent, 1)
    __pyx_v_ccell = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_lensent, 1);
/* … */
    __pyx_v_ccell = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_lensent, 1);
+606: 		lastidx = chart.items.size()
    __pyx_v_lastidx = __pyx_v_chart->__pyx_base.items.size();
/* … */
    __pyx_v_lastidx = __pyx_v_chart->__pyx_base.items.size();
+607: 		if cellindex is not NULL:
    __pyx_t_7 = ((__pyx_v_cellindex != NULL) != 0);
    if (__pyx_t_7) {
/* … */
    }
/* … */
    __pyx_t_7 = ((__pyx_v_cellindex != NULL) != 0);
    if (__pyx_t_7) {
/* … */
    }
+608: 			cellindex[0][ccell] = lastidx
      ((__pyx_v_cellindex[0])[__pyx_v_ccell]) = __pyx_v_lastidx;
/* … */
      ((__pyx_v_cellindex[0])[__pyx_v_ccell]) = __pyx_v_lastidx;
+609: 		recognized = False
    __pyx_v_recognized = 0;
/* … */
    __pyx_v_recognized = 0;
 610: 		# for n in grammar.lexicalbyword.get(word, ()):
+611: 		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, 611, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 611, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_14 = __pyx_convert_string_from_py_std__in_string(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 611, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_v_it = __pyx_v_grammar->lexicalbyword.find(__pyx_t_14);
/* … */
  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_n_u_utf8); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 611, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
/* … */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_word, __pyx_n_s_encode); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 611, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 611, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_14 = __pyx_convert_string_from_py_std__in_string(__pyx_t_8); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 611, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_v_it = __pyx_v_grammar->lexicalbyword.find(__pyx_t_14);
/* … */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_n_u_utf8); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 611, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
+612: 		if it != grammar.lexicalbyword.end():
    __pyx_t_7 = ((__pyx_v_it != __pyx_v_grammar->lexicalbyword.end()) != 0);
    if (__pyx_t_7) {
/* … */
    }
/* … */
    __pyx_t_7 = ((__pyx_v_it != __pyx_v_grammar->lexicalbyword.end()) != 0);
    if (__pyx_t_7) {
/* … */
    }
+613: 			for n in dereference(it).second:
      __pyx_t_16 = &(*__pyx_v_it).second;
      __pyx_t_15 = __pyx_t_16->begin();
      for (;;) {
        if (!(__pyx_t_15 != __pyx_t_16->end())) break;
        __pyx_t_17 = *__pyx_t_15;
        ++__pyx_t_15;
        __pyx_v_n = __pyx_t_17;
/* … */
        __pyx_L7_continue:;
      }
/* … */
      __pyx_t_16 = &(*__pyx_v_it).second;
      __pyx_t_15 = __pyx_t_16->begin();
      for (;;) {
        if (!(__pyx_t_15 != __pyx_t_16->end())) break;
        __pyx_t_17 = *__pyx_t_15;
        ++__pyx_t_15;
        __pyx_v_n = __pyx_t_17;
/* … */
        __pyx_L7_continue:;
      }
+614: 				lexrule = grammar.lexical[n]
        __pyx_v_lexrule = (__pyx_v_grammar->lexical[__pyx_v_n]);
/* … */
        __pyx_v_lexrule = (__pyx_v_grammar->lexical[__pyx_v_n]);
+615: 				if (whitelist is not None and whitelist.mapping[lexrule.lhs]
        __pyx_t_18 = (((PyObject *)__pyx_v_whitelist) != Py_None);
        __pyx_t_19 = (__pyx_t_18 != 0);
        if (__pyx_t_19) {
        } else {
          __pyx_t_7 = __pyx_t_19;
          goto __pyx_L10_bool_binop_done;
        }
/* … */
        __pyx_t_19 = ((__pyx_v_whitelist->mapping[__pyx_v_lexrule.lhs]) != 0);
        if (__pyx_t_19) {
        } else {
          __pyx_t_7 = __pyx_t_19;
          goto __pyx_L10_bool_binop_done;
        }
/* … */
        if (__pyx_t_7) {
/* … */
        }
/* … */
        __pyx_t_18 = (((PyObject *)__pyx_v_whitelist) != Py_None);
        __pyx_t_19 = (__pyx_t_18 != 0);
        if (__pyx_t_19) {
        } else {
          __pyx_t_7 = __pyx_t_19;
          goto __pyx_L10_bool_binop_done;
        }
/* … */
        __pyx_t_19 = ((__pyx_v_whitelist->mapping[__pyx_v_lexrule.lhs]) != 0);
        if (__pyx_t_19) {
        } else {
          __pyx_t_7 = __pyx_t_19;
          goto __pyx_L10_bool_binop_done;
        }
/* … */
        if (__pyx_t_7) {
/* … */
        }
 616: 						and whitelist.cfg[ccell].count(
+617: 							whitelist.mapping[lexrule.lhs]) == 0):
        __pyx_t_19 = (((__pyx_v_whitelist->cfg[__pyx_v_ccell]).count((__pyx_v_whitelist->mapping[__pyx_v_lexrule.lhs])) == 0) != 0);
        __pyx_t_7 = __pyx_t_19;
        __pyx_L10_bool_binop_done:;
/* … */
        __pyx_t_19 = (((__pyx_v_whitelist->cfg[__pyx_v_ccell]).count((__pyx_v_whitelist->mapping[__pyx_v_lexrule.lhs])) == 0) != 0);
        __pyx_t_7 = __pyx_t_19;
        __pyx_L10_bool_binop_done:;
+618: 					blocked[0] += 1
          __pyx_t_20 = 0;
          (__pyx_v_blocked[__pyx_t_20]) = ((__pyx_v_blocked[__pyx_t_20]) + 1);
/* … */
          __pyx_t_20 = 0;
          (__pyx_v_blocked[__pyx_t_20]) = ((__pyx_v_blocked[__pyx_t_20]) + 1);
+619: 					continue
          goto __pyx_L7_continue;
/* … */
          goto __pyx_L7_continue;
+620: 				lhs = lexrule.lhs
        __pyx_t_21 = __pyx_v_lexrule.lhs;
        __pyx_v_lhs = __pyx_t_21;
/* … */
        __pyx_t_21 = __pyx_v_lexrule.lhs;
        __pyx_v_lhs = __pyx_t_21;
+621: 				if tag is None or tagre.match(grammar.tolabel[lhs]):
        __pyx_t_19 = (__pyx_v_tag == Py_None);
        __pyx_t_18 = (__pyx_t_19 != 0);
        if (!__pyx_t_18) {
        } else {
          __pyx_t_7 = __pyx_t_18;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_10 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_13)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_13);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_13) {
          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_10); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_GOTREF(__pyx_t_8);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_t_10};
            __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_t_10};
            __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          } else
          #endif
          {
            __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_12);
            __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_13); __pyx_t_13 = NULL;
            __Pyx_GIVEREF(__pyx_t_10);
            PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_10);
            __pyx_t_10 = 0;
            __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __pyx_t_7 = __pyx_t_18;
        __pyx_L14_bool_binop_done:;
        if (__pyx_t_7) {
/* … */
        }
/* … */
        __pyx_t_19 = (__pyx_v_tag == Py_None);
        __pyx_t_18 = (__pyx_t_19 != 0);
        if (!__pyx_t_18) {
        } else {
          __pyx_t_7 = __pyx_t_18;
          goto __pyx_L14_bool_binop_done;
        }
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_10 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_10);
        __pyx_t_13 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_13)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_13);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_13) {
          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_10); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_GOTREF(__pyx_t_8);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_t_10};
            __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          } else
          #endif
          #if CYTHON_FAST_PYCCALL
          if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_13, __pyx_t_10};
            __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          } else
          #endif
          {
            __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_12);
            __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_13); __pyx_t_13 = NULL;
            __Pyx_GIVEREF(__pyx_t_10);
            PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_10);
            __pyx_t_10 = 0;
            __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_12, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 621, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_18 < 0)) __PYX_ERR(0, 621, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __pyx_t_7 = __pyx_t_18;
        __pyx_L14_bool_binop_done:;
        if (__pyx_t_7) {
/* … */
        }
+622: 					chart.updateprob(cell + lhs, lexrule.prob, 0.0)
          __pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_lexrule.prob, 0.0);
/* … */
          __pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_lexrule.prob, 0.0);
+623: 					chart.addedge(cell + lhs, right, NULL)
          __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_right, NULL);
/* … */
          __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_right, NULL);
+624: 					recognized = True
          __pyx_v_recognized = 1;
/* … */
          __pyx_v_recognized = 1;
+625: 					if midfilter is not NULL:
          __pyx_t_7 = ((__pyx_v_midfilter != NULL) != 0);
          if (__pyx_t_7) {
/* … */
          }
/* … */
          __pyx_t_7 = ((__pyx_v_midfilter != NULL) != 0);
          if (__pyx_t_7) {
/* … */
          }
+626: 						updatemidfilter(midfilter[0], left, right, lhs, nts)
            __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
/* … */
            __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
 627: 		# NB: use gold tags if given, even if (word, tag) was not part of
 628: 		# training data or if it was pruned, modulo state splits etc.
+629: 		if not recognized and tag is not None:
    __pyx_t_18 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_18) {
    } else {
      __pyx_t_7 = __pyx_t_18;
      goto __pyx_L18_bool_binop_done;
    }
    __pyx_t_18 = (__pyx_v_tag != Py_None);
    __pyx_t_19 = (__pyx_t_18 != 0);
    __pyx_t_7 = __pyx_t_19;
    __pyx_L18_bool_binop_done:;
    if (__pyx_t_7) {
/* … */
    }
/* … */
    __pyx_t_18 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_18) {
    } else {
      __pyx_t_7 = __pyx_t_18;
      goto __pyx_L18_bool_binop_done;
    }
    __pyx_t_18 = (__pyx_v_tag != Py_None);
    __pyx_t_19 = (__pyx_t_18 != 0);
    __pyx_t_7 = __pyx_t_19;
    __pyx_L18_bool_binop_done:;
    if (__pyx_t_7) {
/* … */
    }
+630: 			for x in grammar.lexicalbylhs:
      __pyx_t_23 = &__pyx_v_grammar->lexicalbylhs;
      __pyx_t_22 = __pyx_t_23->begin();
      for (;;) {
        if (!(__pyx_t_22 != __pyx_t_23->end())) break;
        __pyx_t_24 = *__pyx_t_22;
        ++__pyx_t_22;
        __pyx_v_x = __pyx_t_24;
/* … */
      }
/* … */
      __pyx_t_23 = &__pyx_v_grammar->lexicalbylhs;
      __pyx_t_22 = __pyx_t_23->begin();
      for (;;) {
        if (!(__pyx_t_22 != __pyx_t_23->end())) break;
        __pyx_t_24 = *__pyx_t_22;
        ++__pyx_t_22;
        __pyx_v_x = __pyx_t_24;
/* … */
      }
+631: 				lhs = x.first
        __pyx_t_21 = __pyx_v_x.first;
        __pyx_v_lhs = __pyx_t_21;
/* … */
        __pyx_t_21 = __pyx_v_x.first;
        __pyx_v_lhs = __pyx_t_21;
+632: 				if tagre.match(grammar.tolabel[lhs]):
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_12 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_10 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_10)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_10);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_10) {
          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_12); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_12};
            __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __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_10, __pyx_t_12};
            __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          {
            __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_13);
            __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_10); __pyx_t_10 = NULL;
            __Pyx_GIVEREF(__pyx_t_12);
            PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_12);
            __pyx_t_12 = 0;
            __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        if (__pyx_t_7) {
/* … */
        }
/* … */
        __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_tagre, __pyx_n_s_match); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_12 = __Pyx_GetItemInt(((PyObject *)__pyx_v_grammar->tolabel), __pyx_v_lhs, Label, 0, __Pyx_PyInt_From_uint32_t, 0, 0, 0); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_10 = NULL;
        if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_6))) {
          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_6);
          if (likely(__pyx_t_10)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
            __Pyx_INCREF(__pyx_t_10);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_6, function);
          }
        }
        if (!__pyx_t_10) {
          __pyx_t_8 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_12); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          __Pyx_GOTREF(__pyx_t_8);
        } else {
          #if CYTHON_FAST_PYCALL
          if (PyFunction_Check(__pyx_t_6)) {
            PyObject *__pyx_temp[2] = {__pyx_t_10, __pyx_t_12};
            __pyx_t_8 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __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_10, __pyx_t_12};
            __pyx_t_8 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
          } else
          #endif
          {
            __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_13);
            __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_10); __pyx_t_10 = NULL;
            __Pyx_GIVEREF(__pyx_t_12);
            PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_12);
            __pyx_t_12 = 0;
            __pyx_t_8 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_13, NULL); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 632, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_8);
            __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
          }
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 632, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        if (__pyx_t_7) {
/* … */
        }
+633: 					chart.updateprob(cell + lhs, 0.0, 0.0)
          __pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), 0.0, 0.0);
/* … */
          __pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), 0.0, 0.0);
+634: 					chart.addedge(cell + lhs, right, NULL)
          __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_right, NULL);
/* … */
          __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(__pyx_v_chart, (__pyx_v_cell + __pyx_v_lhs), __pyx_v_right, NULL);
+635: 					recognized = True
          __pyx_v_recognized = 1;
/* … */
          __pyx_v_recognized = 1;
+636: 					if midfilter is not NULL:
          __pyx_t_7 = ((__pyx_v_midfilter != NULL) != 0);
          if (__pyx_t_7) {
/* … */
          }
/* … */
          __pyx_t_7 = ((__pyx_v_midfilter != NULL) != 0);
          if (__pyx_t_7) {
/* … */
          }
+637: 						updatemidfilter(midfilter[0], left, right, lhs, nts)
            __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
/* … */
            __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
+638: 		if not recognized:
    __pyx_t_7 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_7) {
/* … */
    }
/* … */
    __pyx_t_7 = ((!(__pyx_v_recognized != 0)) != 0);
    if (__pyx_t_7) {
/* … */
    }
+639: 			if tag is None and it == grammar.lexicalbyword.end():
      __pyx_t_19 = (__pyx_v_tag == Py_None);
      __pyx_t_18 = (__pyx_t_19 != 0);
      if (__pyx_t_18) {
      } else {
        __pyx_t_7 = __pyx_t_18;
        goto __pyx_L26_bool_binop_done;
      }
      __pyx_t_18 = ((__pyx_v_it == __pyx_v_grammar->lexicalbyword.end()) != 0);
      __pyx_t_7 = __pyx_t_18;
      __pyx_L26_bool_binop_done:;
      if (__pyx_t_7) {
/* … */
      }
/* … */
      __pyx_t_19 = (__pyx_v_tag == Py_None);
      __pyx_t_18 = (__pyx_t_19 != 0);
      if (__pyx_t_18) {
      } else {
        __pyx_t_7 = __pyx_t_18;
        goto __pyx_L26_bool_binop_done;
      }
      __pyx_t_18 = ((__pyx_v_it == __pyx_v_grammar->lexicalbyword.end()) != 0);
      __pyx_t_7 = __pyx_t_18;
      __pyx_L26_bool_binop_done:;
      if (__pyx_t_7) {
/* … */
      }
+640: 				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, 640, __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_8);
        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
        __pyx_t_8 = 0;
        __pyx_r = __pyx_t_6;
        __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
/* … */
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 640, __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_8);
        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
        __pyx_t_8 = 0;
        __pyx_r = __pyx_t_6;
        __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
+641: 						'and word %r not in lexicon' % word)
        __pyx_t_8 = PyUnicode_Format(__pyx_kp_u_no_parse_no_gold_POS_tag_given_a, __pyx_v_word); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 641, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
/* … */
        __pyx_t_8 = PyUnicode_Format(__pyx_kp_u_no_parse_no_gold_POS_tag_given_a, __pyx_v_word); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 641, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
+642: 			elif tag is not None and tag not in grammar.toid:
      __pyx_t_18 = (__pyx_v_tag != Py_None);
      __pyx_t_19 = (__pyx_t_18 != 0);
      if (__pyx_t_19) {
      } else {
        __pyx_t_7 = __pyx_t_19;
        goto __pyx_L28_bool_binop_done;
      }
      __pyx_t_19 = (__Pyx_PySequence_ContainsTF(__pyx_v_tag, ((PyObject *)__pyx_v_grammar->toid), Py_NE)); if (unlikely(__pyx_t_19 < 0)) __PYX_ERR(0, 642, __pyx_L1_error)
      __pyx_t_18 = (__pyx_t_19 != 0);
      __pyx_t_7 = __pyx_t_18;
      __pyx_L28_bool_binop_done:;
      if (__pyx_t_7) {
/* … */
      }
/* … */
      __pyx_t_18 = (__pyx_v_tag != Py_None);
      __pyx_t_19 = (__pyx_t_18 != 0);
      if (__pyx_t_19) {
      } else {
        __pyx_t_7 = __pyx_t_19;
        goto __pyx_L28_bool_binop_done;
      }
      __pyx_t_19 = (__Pyx_PySequence_ContainsTF(__pyx_v_tag, ((PyObject *)__pyx_v_grammar->toid), Py_NE)); if (unlikely(__pyx_t_19 < 0)) __PYX_ERR(0, 642, __pyx_L1_error)
      __pyx_t_18 = (__pyx_t_19 != 0);
      __pyx_t_7 = __pyx_t_18;
      __pyx_L28_bool_binop_done:;
      if (__pyx_t_7) {
/* … */
      }
+643: 				return False, ('no parse: gold POS tag given '
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 643, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_8, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_6);
        PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
        __pyx_t_6 = 0;
        __pyx_r = __pyx_t_8;
        __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
/* … */
        __Pyx_XDECREF(__pyx_r);
/* … */
        __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 643, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_INCREF(Py_False);
        __Pyx_GIVEREF(Py_False);
        PyTuple_SET_ITEM(__pyx_t_8, 0, Py_False);
        __Pyx_GIVEREF(__pyx_t_6);
        PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
        __pyx_t_6 = 0;
        __pyx_r = __pyx_t_8;
        __pyx_t_8 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
+644: 						'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, 644, __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, 644, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
+645: 			return False, 'no parse: all tags for word %r blocked' % word
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_8 = PyUnicode_Format(__pyx_kp_u_no_parse_all_tags_for_word_r_blo, __pyx_v_word); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 645, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 645, __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_8);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
      __pyx_t_8 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
/* … */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_8 = PyUnicode_Format(__pyx_kp_u_no_parse_all_tags_for_word_r_blo, __pyx_v_word); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 645, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 645, __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_8);
      PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_8);
      __pyx_t_8 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
 646: 
 647: 		# unary rules on the span of this POS tag
+648: 		applyunaryrules[CFGChart_fused](chart, left, right, cell, lastidx,
    __pyx_fuse_0__pyx_f_8discodop_4pcfg_applyunaryrules(__pyx_v_chart, __pyx_v_left, __pyx_v_right, __pyx_v_cell, __pyx_v_lastidx, __pyx_v_unaryagenda, __pyx_v_midfilter, __pyx_v_blocked, __pyx_v_whitelist);
/* … */
    __pyx_fuse_1__pyx_f_8discodop_4pcfg_applyunaryrules(__pyx_v_chart, __pyx_v_left, __pyx_v_right, __pyx_v_cell, __pyx_v_lastidx, __pyx_v_unaryagenda, __pyx_v_midfilter, __pyx_v_blocked, __pyx_v_whitelist);
 649: 				unaryagenda, midfilter, blocked, whitelist)
+650: 	if cellindex is not NULL:
  __pyx_t_7 = ((__pyx_v_cellindex != NULL) != 0);
  if (__pyx_t_7) {
/* … */
  }
/* … */
  __pyx_t_7 = ((__pyx_v_cellindex != NULL) != 0);
  if (__pyx_t_7) {
/* … */
  }
+651: 		cellindex[0][ccell + 1] = chart.items.size()
    ((__pyx_v_cellindex[0])[(__pyx_v_ccell + 1)]) = __pyx_v_chart->__pyx_base.items.size();
/* … */
    ((__pyx_v_cellindex[0])[(__pyx_v_ccell + 1)]) = __pyx_v_chart->__pyx_base.items.size();
+652: 	return True, ''
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_tuple__4);
  __pyx_r = __pyx_tuple__4;
  goto __pyx_L0;
/* … */
  __pyx_tuple__4 = PyTuple_Pack(2, Py_True, __pyx_kp_u__2); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 652, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
/* … */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_tuple__6);
  __pyx_r = __pyx_tuple__6;
  goto __pyx_L0;
/* … */
  __pyx_tuple__6 = PyTuple_Pack(2, Py_True, __pyx_kp_u__2); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 652, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
 653: 
 654: 
+655: cdef inline void applyunaryrules(
static CYTHON_INLINE void __pyx_fuse_0__pyx_f_8discodop_4pcfg_applyunaryrules(struct __pyx_obj_8discodop_4pcfg_DenseCFGChart *__pyx_v_chart, short __pyx_v_left, short __pyx_v_right, uint64_t __pyx_v_cell, ItemNo __pyx_v_lastidx, Agenda<Label,Prob>  &__pyx_v_unaryagenda, struct __pyx_t_8discodop_4pcfg_MidFilter *__pyx_v_midfilter, uint64_t *__pyx_v_blocked, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  Label __pyx_v_lhs;
  Label __pyx_v_rhs1;
  Prob __pyx_v_prob;
  ProbRule *__pyx_v_rule;
  uint64_t __pyx_v_item;
  uint64_t __pyx_v_leftitem;
  uint64_t __pyx_v_ccell;
  size_t __pyx_v_nts;
  std::vector<uint64_t> ::size_type __pyx_v_itemidx;
  size_t __pyx_v_n;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_0applyunaryrules", 0);
/* … */
  /* function exit code */
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_RefNannyFinishContext();
}

static CYTHON_INLINE void __pyx_fuse_1__pyx_f_8discodop_4pcfg_applyunaryrules(struct __pyx_obj_8discodop_4pcfg_SparseCFGChart *__pyx_v_chart, short __pyx_v_left, short __pyx_v_right, uint64_t __pyx_v_cell, ItemNo __pyx_v_lastidx, Agenda<Label,Prob>  &__pyx_v_unaryagenda, struct __pyx_t_8discodop_4pcfg_MidFilter *__pyx_v_midfilter, uint64_t *__pyx_v_blocked, struct __pyx_obj_8discodop_10containers_Whitelist *__pyx_v_whitelist) {
  struct __pyx_obj_8discodop_10containers_Grammar *__pyx_v_grammar = 0;
  Label __pyx_v_lhs;
  Label __pyx_v_rhs1;
  Prob __pyx_v_prob;
  ProbRule *__pyx_v_rule;
  uint64_t __pyx_v_item;
  uint64_t __pyx_v_leftitem;
  uint64_t __pyx_v_ccell;
  size_t __pyx_v_nts;
  std::vector<uint64_t> ::size_type __pyx_v_itemidx;
  size_t __pyx_v_n;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pyx_fuse_1applyunaryrules", 0);
/* … */
  /* function exit code */
  __Pyx_XDECREF((PyObject *)__pyx_v_grammar);
  __Pyx_RefNannyFinishContext();
}
 656: 		CFGChart_fused chart, short left, short right, uint64_t cell,
 657: 		ItemNo lastidx, Agenda[Label, Prob]& unaryagenda, MidFilter *midfilter,
 658: 		uint64_t *blocked, Whitelist whitelist):
 659: 	"""Apply unary rules in a given cell."""
 660: 	cdef:
+661: 		Grammar grammar = chart.grammar
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
/* … */
  __pyx_t_1 = ((PyObject *)__pyx_v_chart->__pyx_base.__pyx_base.grammar);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_grammar = ((struct __pyx_obj_8discodop_10containers_Grammar *)__pyx_t_1);
  __pyx_t_1 = 0;
 662: 		Label lhs, rhs1
 663: 		Prob prob
 664: 		ProbRule *rule
 665: 		uint64_t item, leftitem
+666: 		uint64_t ccell = compactcellidx(left, right, chart.lensent, 1)
  __pyx_v_ccell = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_chart->__pyx_base.__pyx_base.lensent, 1);
/* … */
  __pyx_v_ccell = __pyx_f_8discodop_10containers_compactcellidx(__pyx_v_left, __pyx_v_right, __pyx_v_chart->__pyx_base.__pyx_base.lensent, 1);
+667: 		size_t nts = grammar.nonterminals
  __pyx_t_2 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_2;
/* … */
  __pyx_t_2 = __pyx_v_grammar->nonterminals;
  __pyx_v_nts = __pyx_t_2;
 668: 		# pair[Label, Prob] unaryentry
 669: 		# vector[pair[Label, Prob]] unaryentries
 670: 	# collect possible rhs items for unaries
+671: 	for itemidx in range(lastidx, chart.items.size()):
  __pyx_t_3 = __pyx_v_chart->__pyx_base.items.size();
  for (__pyx_t_4 = __pyx_v_lastidx; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_itemidx = __pyx_t_4;
/* … */
  __pyx_t_3 = __pyx_v_chart->__pyx_base.items.size();
  for (__pyx_t_4 = __pyx_v_lastidx; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_itemidx = __pyx_t_4;
+672: 		item = chart.items[itemidx]
    __pyx_v_item = (__pyx_v_chart->__pyx_base.items[__pyx_v_itemidx]);
/* … */
    __pyx_v_item = (__pyx_v_chart->__pyx_base.items[__pyx_v_itemidx]);
+673: 		unaryagenda.setitem(
    __pyx_v_unaryagenda.setitem(__pyx_f_8discodop_4pcfg_13DenseCFGChart__label(__pyx_v_chart, __pyx_v_item), ((struct __pyx_vtabstruct_8discodop_10containers_Chart *)((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart)->__pyx_vtab)->subtreeprob(((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart), __pyx_v_itemidx));
  }
/* … */
    __pyx_v_unaryagenda.setitem(__pyx_f_8discodop_4pcfg_14SparseCFGChart__label(__pyx_v_chart, __pyx_v_item), ((struct __pyx_vtabstruct_8discodop_10containers_Chart *)((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart)->__pyx_vtab)->subtreeprob(((struct __pyx_obj_8discodop_10containers_Chart *)__pyx_v_chart), __pyx_v_itemidx));
  }
 674: 				chart._label(item), (<Chart>chart).subtreeprob(itemidx))
 675: 	# 	unaryentry.first = chart._label(item)
 676: 	# 	unaryentry.second = chart._subtreeprob(item)
 677: 	# 	unaryentries.push_back(unaryentry)
 678: 	# FIXME heapify; possibly more efficient; but there's some bug
 679: 	# unaryagenda.replace_entries(unaryentries)
+680: 	while not unaryagenda.empty():
  while (1) {
    __pyx_t_5 = ((!(__pyx_v_unaryagenda.empty() != 0)) != 0);
    if (!__pyx_t_5) break;
/* … */
  while (1) {
    __pyx_t_5 = ((!(__pyx_v_unaryagenda.empty() != 0)) != 0);
    if (!__pyx_t_5) break;
+681: 		rhs1 = unaryagenda.pop().first
    __pyx_t_6 = __pyx_v_unaryagenda.pop().first;
    __pyx_v_rhs1 = __pyx_t_6;
/* … */
    __pyx_t_6 = __pyx_v_unaryagenda.pop().first;
    __pyx_v_rhs1 = __pyx_t_6;
+682: 		leftitem = cell + rhs1
    __pyx_v_leftitem = (__pyx_v_cell + __pyx_v_rhs1);
/* … */
    __pyx_v_leftitem = (__pyx_v_cell + __pyx_v_rhs1);
 683: 		# FIXME can vit.prob change while entry in agenda?
 684: 		# prob = rule.prob + entry.second
+685: 		prob = chart._subtreeprob(leftitem)
    __pyx_v_prob = __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_leftitem);
/* … */
    __pyx_v_prob = __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_leftitem);
 686: 		# FIXME: chart.updateprob here
 687: 		# FIXME: maybe better to iterate over whitelist and check for
 688: 		# unary prod. Or: compute intersection before loop;
+689: 		for n in range(grammar.numunary):
    __pyx_t_2 = __pyx_v_grammar->numunary;
    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) {
      __pyx_v_n = __pyx_t_7;
/* … */
    __pyx_t_2 = __pyx_v_grammar->numunary;
    for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_2; __pyx_t_7+=1) {
      __pyx_v_n = __pyx_t_7;
+690: 			rule = &(grammar.unary[rhs1][n])
      __pyx_v_rule = (&((__pyx_v_grammar->unary[__pyx_v_rhs1])[__pyx_v_n]));
/* … */
      __pyx_v_rule = (&((__pyx_v_grammar->unary[__pyx_v_rhs1])[__pyx_v_n]));
+691: 			lhs = rule.lhs
      __pyx_t_6 = __pyx_v_rule->lhs;
      __pyx_v_lhs = __pyx_t_6;
/* … */
      __pyx_t_6 = __pyx_v_rule->lhs;
      __pyx_v_lhs = __pyx_t_6;
+692: 			if rule.rhs1 != rhs1:
      __pyx_t_5 = ((__pyx_v_rule->rhs1 != __pyx_v_rhs1) != 0);
      if (__pyx_t_5) {
/* … */
      }
/* … */
      __pyx_t_5 = ((__pyx_v_rule->rhs1 != __pyx_v_rhs1) != 0);
      if (__pyx_t_5) {
/* … */
      }
+693: 				break
        goto __pyx_L8_break;
/* … */
        goto __pyx_L8_break;
+694: 			elif TESTBIT(grammar.mask, rule.no) or (
      __pyx_t_8 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_5 = __pyx_t_8;
        goto __pyx_L10_bool_binop_done;
      }
/* … */
      if (__pyx_t_5) {
/* … */
      }
/* … */
      __pyx_t_8 = (TESTBIT(__pyx_v_grammar->mask, __pyx_v_rule->no) != 0);
      if (!__pyx_t_8) {
      } else {
        __pyx_t_5 = __pyx_t_8;
        goto __pyx_L10_bool_binop_done;
      }
/* … */
      if (__pyx_t_5) {
/* … */
      }
+695: 					whitelist is not None
      __pyx_t_8 = (((PyObject *)__pyx_v_whitelist) != Py_None);
      __pyx_t_9 = (__pyx_t_8 != 0);
      if (__pyx_t_9) {
      } else {
        __pyx_t_5 = __pyx_t_9;
        goto __pyx_L10_bool_binop_done;
      }
/* … */
      __pyx_t_8 = (((PyObject *)__pyx_v_whitelist) != Py_None);
      __pyx_t_9 = (__pyx_t_8 != 0);
      if (__pyx_t_9) {
      } else {
        __pyx_t_5 = __pyx_t_9;
        goto __pyx_L10_bool_binop_done;
      }
+696: 					and whitelist.mapping[lhs]
      __pyx_t_9 = ((__pyx_v_whitelist->mapping[__pyx_v_lhs]) != 0);
      if (__pyx_t_9) {
      } else {
        __pyx_t_5 = __pyx_t_9;
        goto __pyx_L10_bool_binop_done;
      }
/* … */
      __pyx_t_9 = ((__pyx_v_whitelist->mapping[__pyx_v_lhs]) != 0);
      if (__pyx_t_9) {
      } else {
        __pyx_t_5 = __pyx_t_9;
        goto __pyx_L10_bool_binop_done;
      }
 697: 					and whitelist.cfg[ccell].count(
+698: 						whitelist.mapping[lhs]) == 0):
      __pyx_t_9 = (((__pyx_v_whitelist->cfg[__pyx_v_ccell]).count((__pyx_v_whitelist->mapping[__pyx_v_lhs])) == 0) != 0);
      __pyx_t_5 = __pyx_t_9;
      __pyx_L10_bool_binop_done:;
/* … */
      __pyx_t_9 = (((__pyx_v_whitelist->cfg[__pyx_v_ccell]).count((__pyx_v_whitelist->mapping[__pyx_v_lhs])) == 0) != 0);
      __pyx_t_5 = __pyx_t_9;
      __pyx_L10_bool_binop_done:;
+699: 				continue
        goto __pyx_L7_continue;
/* … */
        goto __pyx_L7_continue;
+700: 			item = cell + lhs
      __pyx_v_item = (__pyx_v_cell + __pyx_v_lhs);
/* … */
      __pyx_v_item = (__pyx_v_cell + __pyx_v_lhs);
+701: 			if rule.prob + prob < chart._subtreeprob(item):
      __pyx_t_5 = (((__pyx_v_rule->prob + __pyx_v_prob) < __pyx_f_8discodop_4pcfg_13DenseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item)) != 0);
      if (__pyx_t_5) {
/* … */
      }
/* … */
      __pyx_t_5 = (((__pyx_v_rule->prob + __pyx_v_prob) < __pyx_f_8discodop_4pcfg_14SparseCFGChart__subtreeprob(__pyx_v_chart, __pyx_v_item)) != 0);
      if (__pyx_t_5) {
/* … */
      }
+702: 				if chart.updateprob(item, rule.prob + prob, 0.0):
        __pyx_t_5 = (__pyx_f_8discodop_4pcfg_13DenseCFGChart_updateprob(__pyx_v_chart, __pyx_v_item, (__pyx_v_rule->prob + __pyx_v_prob), 0.0) != 0);
        if (__pyx_t_5) {
/* … */
          goto __pyx_L15;
        }
/* … */
        __pyx_t_5 = (__pyx_f_8discodop_4pcfg_14SparseCFGChart_updateprob(__pyx_v_chart, __pyx_v_item, (__pyx_v_rule->prob + __pyx_v_prob), 0.0) != 0);
        if (__pyx_t_5) {
/* … */
          goto __pyx_L15;
        }
+703: 					unaryagenda.setifbetter(lhs, rule.prob + prob)
          __pyx_v_unaryagenda.setifbetter(__pyx_v_lhs, (__pyx_v_rule->prob + __pyx_v_prob));
/* … */
          __pyx_v_unaryagenda.setifbetter(__pyx_v_lhs, (__pyx_v_rule->prob + __pyx_v_prob));
 704: 				else:
+705: 					blocked += 1
        /*else*/ {
          __pyx_v_blocked = (__pyx_v_blocked + 1);
        }
        __pyx_L15:;
/* … */
        /*else*/ {
          __pyx_v_blocked = (__pyx_v_blocked + 1);
        }
        __pyx_L15:;
+706: 			chart.addedge(item, right, rule)
      __pyx_f_8discodop_4pcfg_13DenseCFGChart_addedge(__pyx_v_chart, __pyx_v_item, __pyx_v_right, __pyx_v_rule);
/* … */
      __pyx_f_8discodop_4pcfg_14SparseCFGChart_addedge(__pyx_v_chart, __pyx_v_item, __pyx_v_right, __pyx_v_rule);
+707: 			if midfilter is not NULL:
      __pyx_t_5 = ((__pyx_v_midfilter != NULL) != 0);
      if (__pyx_t_5) {
/* … */
      }
      __pyx_L7_continue:;
    }
    __pyx_L8_break:;
  }
/* … */
      __pyx_t_5 = ((__pyx_v_midfilter != NULL) != 0);
      if (__pyx_t_5) {
/* … */
      }
      __pyx_L7_continue:;
    }
    __pyx_L8_break:;
  }
+708: 				updatemidfilter(midfilter[0], left, right, lhs, nts)
        __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
/* … */
        __pyx_f_8discodop_4pcfg_updatemidfilter((__pyx_v_midfilter[0]), __pyx_v_left, __pyx_v_right, __pyx_v_lhs, __pyx_v_nts);
 709: 
 710: 
+711: cdef inline void updatemidfilter(
static CYTHON_INLINE void __pyx_f_8discodop_4pcfg_updatemidfilter(struct __pyx_t_8discodop_4pcfg_MidFilter &__pyx_v_midfilter, short __pyx_v_left, short __pyx_v_right, Label __pyx_v_lhs, size_t __pyx_v_nts) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("updatemidfilter", 0);
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
}
 712: 		MidFilter& midfilter, short left, short right, Label lhs,
 713: 		size_t nts):
 714: 	"""Update mid point filter arrays."""
+715: 	if left > midfilter.minleft[right * nts + lhs]:
  __pyx_t_1 = ((__pyx_v_left > (__pyx_v_midfilter.minleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_lhs)])) != 0);
  if (__pyx_t_1) {
/* … */
  }
+716: 		midfilter.minleft[right * nts + lhs] = left
    (__pyx_v_midfilter.minleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_lhs)]) = __pyx_v_left;
+717: 	if left < midfilter.maxleft[right * nts + lhs]:
  __pyx_t_1 = ((__pyx_v_left < (__pyx_v_midfilter.maxleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_lhs)])) != 0);
  if (__pyx_t_1) {
/* … */
  }
+718: 		midfilter.maxleft[right * nts + lhs] = left
    (__pyx_v_midfilter.maxleft[((__pyx_v_right * __pyx_v_nts) + __pyx_v_lhs)]) = __pyx_v_left;
+719: 	if right < midfilter.minright[left * nts + lhs]:
  __pyx_t_1 = ((__pyx_v_right < (__pyx_v_midfilter.minright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_lhs)])) != 0);
  if (__pyx_t_1) {
/* … */
  }
+720: 		midfilter.minright[left * nts + lhs] = right
    (__pyx_v_midfilter.minright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_lhs)]) = __pyx_v_right;
+721: 	if right > midfilter.maxright[left * nts + lhs]:
  __pyx_t_1 = ((__pyx_v_right > (__pyx_v_midfilter.maxright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_lhs)])) != 0);
  if (__pyx_t_1) {
/* … */
  }
+722: 		midfilter.maxright[left * nts + lhs] = right
    (__pyx_v_midfilter.maxright[((__pyx_v_left * __pyx_v_nts) + __pyx_v_lhs)]) = __pyx_v_right;
 723: 
 724: 
+725: def testsent(sent, grammar, expected=None):
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_3testsent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_8discodop_4pcfg_2testsent[] = "testsent(sent, grammar, expected=None)\nParse sentence with grammar and print 10 best derivations.";
static PyMethodDef __pyx_mdef_8discodop_4pcfg_3testsent = {"testsent", (PyCFunction)__pyx_pw_8discodop_4pcfg_3testsent, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8discodop_4pcfg_2testsent};
static PyObject *__pyx_pw_8discodop_4pcfg_3testsent(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_sent = 0;
  PyObject *__pyx_v_grammar = 0;
  PyObject *__pyx_v_expected = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("testsent (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_sent,&__pyx_n_s_grammar,&__pyx_n_s_expected,0};
    PyObject* values[3] = {0,0,0};
    values[2] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        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("testsent", 0, 2, 3, 1); __PYX_ERR(0, 725, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_expected);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "testsent") < 0)) __PYX_ERR(0, 725, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        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 = values[1];
    __pyx_v_expected = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("testsent", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 725, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("discodop.pcfg.testsent", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_8discodop_4pcfg_2testsent(__pyx_self, __pyx_v_sent, __pyx_v_grammar, __pyx_v_expected);

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

static PyObject *__pyx_pf_8discodop_4pcfg_2testsent(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_sent, PyObject *__pyx_v_grammar, PyObject *__pyx_v_expected) {
  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);
/* … */
  /* 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_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("discodop.pcfg.testsent", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __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_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__162 = PyTuple_Pack(9, __pyx_n_s_sent, __pyx_n_s_grammar, __pyx_n_s_expected, __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__162)) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__162);
  __Pyx_GIVEREF(__pyx_tuple__162);
/* … */
  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8discodop_4pcfg_3testsent, NULL, __pyx_n_s_discodop_pcfg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_testsent, __pyx_t_3) < 0) __PYX_ERR(0, 725, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_codeobj__163 = (PyObject*)__Pyx_PyCode_New(3, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__162, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_discodop_pcfg_pyx, __pyx_n_s_testsent, 725, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__163)) __PYX_ERR(0, 725, __pyx_L1_error)
 726: 	"""Parse sentence with grammar and print 10 best derivations."""
+727: 	from .kbest import lazykbest
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 727, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_lazykbest);
  __Pyx_GIVEREF(__pyx_n_s_lazykbest);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_lazykbest);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_kbest, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 727, __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_lazykbest); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 727, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_lazykbest = __pyx_t_1;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+728: 	print('cfg parsing; sentence:', sent)
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 728, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_kp_u_cfg_parsing_sentence);
  __Pyx_GIVEREF(__pyx_kp_u_cfg_parsing_sentence);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_u_cfg_parsing_sentence);
  __Pyx_INCREF(__pyx_v_sent);
  __Pyx_GIVEREF(__pyx_v_sent);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_sent);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 728, __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;
+729: 	chart, msg = parse(sent.split(), grammar)
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_parse); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 729, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_sent, __pyx_n_s_split); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 729, __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_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 729, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  __pyx_t_6 = 0;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_6 = 1;
    }
  }
  #if CYTHON_FAST_PYCALL
  if (PyFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_grammar};
    __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
    PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_t_3, __pyx_v_grammar};
    __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_4) {
      __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    }
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_6, __pyx_t_3);
    __Pyx_INCREF(__pyx_v_grammar);
    __Pyx_GIVEREF(__pyx_v_grammar);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_6, __pyx_v_grammar);
    __pyx_t_3 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 729, __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;
  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, 729, __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_5 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_5);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 729, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #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, 729, __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_5 = __pyx_t_7(__pyx_t_3); if (unlikely(!__pyx_t_5)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_5);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_3), 2) < 0) __PYX_ERR(0, 729, __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, 729, __pyx_L1_error)
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_chart = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_msg = __pyx_t_5;
  __pyx_t_5 = 0;
+730: 	print(chart)
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 730, __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_5 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 730, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+731: 	assert chart, msg
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_chart); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 731, __pyx_L1_error)
    if (unlikely(!__pyx_t_8)) {
      __pyx_t_5 = PyTuple_Pack(1, __pyx_v_msg); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 731, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      PyErr_SetObject(PyExc_AssertionError, __pyx_t_5);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __PYX_ERR(0, 731, __pyx_L1_error)
    }
  }
  #endif
+732: 	if expected is None:
  __pyx_t_8 = (__pyx_v_expected == Py_None);
  __pyx_t_9 = (__pyx_t_8 != 0);
  if (__pyx_t_9) {
/* … */
    goto __pyx_L5;
  }
+733: 		print('10 best parse trees:')
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 733, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
/* … */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_u_10_best_parse_trees); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 733, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
 734: 	else:
+735: 		print('10 best parse trees (%d expected):' % expected)
  /*else*/ {
    __pyx_t_5 = PyUnicode_Format(__pyx_kp_u_10_best_parse_trees_d_expected, __pyx_v_expected); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 735, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __pyx_L5:;
+736: 	derivations = lazykbest(chart, 10)
  __Pyx_INCREF(__pyx_v_lazykbest);
  __pyx_t_1 = __pyx_v_lazykbest; __pyx_t_2 = NULL;
  __pyx_t_6 = 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_6 = 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_5 = __Pyx_PyFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_5);
  } 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_5 = __Pyx_PyCFunction_FastCall(__pyx_t_1, __pyx_temp+1-__pyx_t_6, 2+__pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_5);
  } else
  #endif
  {
    __pyx_t_3 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 736, __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_6, __pyx_v_chart);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_6, __pyx_int_10);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 736, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_derivations = __pyx_t_5;
  __pyx_t_5 = 0;
+737: 	for a, p in derivations:
  if (likely(PyList_CheckExact(__pyx_v_derivations)) || PyTuple_CheckExact(__pyx_v_derivations)) {
    __pyx_t_5 = __pyx_v_derivations; __Pyx_INCREF(__pyx_t_5); __pyx_t_10 = 0;
    __pyx_t_11 = NULL;
  } else {
    __pyx_t_10 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_derivations); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 737, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_11 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 737, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_11)) {
      if (likely(PyList_CheckExact(__pyx_t_5))) {
        if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 737, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 737, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_10); __Pyx_INCREF(__pyx_t_1); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 737, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_5, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 737, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_11(__pyx_t_5);
      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, 737, __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, 737, __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, 737, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 737, __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_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 737, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_7 = Py_TYPE(__pyx_t_4)->tp_iternext;
      index = 0; __pyx_t_3 = __pyx_t_7(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L8_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      index = 1; __pyx_t_2 = __pyx_t_7(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L8_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_2);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_4), 2) < 0) __PYX_ERR(0, 737, __pyx_L1_error)
      __pyx_t_7 = NULL;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L9_unpacking_done;
      __pyx_L8_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_7 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 737, __pyx_L1_error)
      __pyx_L9_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_5); __pyx_t_5 = 0;
+738: 		print(exp(-p), a)
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_exp); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyNumber_Negative(__pyx_v_p); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_4) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else {
      #if CYTHON_FAST_PYCALL
      if (PyFunction_Check(__pyx_t_2)) {
        PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3};
        __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      } else
      #endif
      #if CYTHON_FAST_PYCCALL
      if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) {
        PyObject *__pyx_temp[2] = {__pyx_t_4, __pyx_t_3};
        __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-1, 1+1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error)
        __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      } else
      #endif
      {
        __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 738, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_12);
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_4); __pyx_t_4 = NULL;
        __Pyx_GIVEREF(__pyx_t_3);
        PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_3);
        __pyx_t_3 = 0;
        __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      }
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 738, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
    __Pyx_INCREF(__pyx_v_a);
    __Pyx_GIVEREF(__pyx_v_a);
    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_a);
    __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, 738, __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;
+739: 	if expected is not None:
  __pyx_t_9 = (__pyx_v_expected != Py_None);
  __pyx_t_8 = (__pyx_t_9 != 0);
  if (__pyx_t_8) {
/* … */
  }
+740: 		assert len(derivations) == expected, (len(derivations), expected)
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      __pyx_t_10 = PyObject_Length(__pyx_v_derivations); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 740, __pyx_L1_error)
      __pyx_t_5 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 740, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = PyObject_RichCompare(__pyx_t_5, __pyx_v_expected, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 740, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      if (unlikely(!__pyx_t_8)) {
        __pyx_t_10 = PyObject_Length(__pyx_v_derivations); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 740, __pyx_L1_error)
        __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 740, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_GIVEREF(__pyx_t_1);
        PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1);
        __Pyx_INCREF(__pyx_v_expected);
        __Pyx_GIVEREF(__pyx_v_expected);
        PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_expected);
        __pyx_t_1 = 0;
        __pyx_t_1 = PyTuple_Pack(1, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        PyErr_SetObject(PyExc_AssertionError, __pyx_t_1);
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __PYX_ERR(0, 740, __pyx_L1_error)
      }
    }
    #endif
 741: 
 742: 
+743: def test():
/* Python wrapper */
static PyObject *__pyx_pw_8discodop_4pcfg_5test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_8discodop_4pcfg_4test[] = "test()";
static PyMethodDef __pyx_mdef_8discodop_4pcfg_5test = {"test", (PyCFunction)__pyx_pw_8discodop_4pcfg_5test, METH_NOARGS, __pyx_doc_8discodop_4pcfg_4test};
static PyObject *__pyx_pw_8discodop_4pcfg_5test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("test (wrapper)", 0);
  __pyx_r = __pyx_pf_8discodop_4pcfg_4test(__pyx_self);

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

static PyObject *__pyx_pf_8discodop_4pcfg_4test(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_v_Grammar = NULL;
  PyObject *__pyx_v_cfg = NULL;
  PyObject *__pyx_v_rules = NULL;
  PyObject *__pyx_v_cfg2 = 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_AddTraceback("discodop.pcfg.test", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_Grammar);
  __Pyx_XDECREF(__pyx_v_cfg);
  __Pyx_XDECREF(__pyx_v_rules);
  __Pyx_XDECREF(__pyx_v_cfg2);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__164 = PyTuple_Pack(4, __pyx_n_s_Grammar, __pyx_n_s_cfg, __pyx_n_s_rules, __pyx_n_s_cfg2); if (unlikely(!__pyx_tuple__164)) __PYX_ERR(0, 743, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__164);
  __Pyx_GIVEREF(__pyx_tuple__164);
/* … */
  __pyx_t_3 = PyCFunction_NewEx(&__pyx_mdef_8discodop_4pcfg_5test, NULL, __pyx_n_s_discodop_pcfg); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 743, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_3) < 0) __PYX_ERR(0, 743, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+744: 	from .containers import Grammar
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 744, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_Grammar);
  __Pyx_GIVEREF(__pyx_n_s_Grammar);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_Grammar);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_containers, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 744, __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_Grammar); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 744, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_Grammar = __pyx_t_1;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 745: 
+746: 	cfg = Grammar([
  __pyx_t_2 = PyList_New(20); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 746, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_tuple__12);
  __Pyx_INCREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_tuple__17);
  __Pyx_INCREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_tuple__22);
  __Pyx_INCREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
  PyList_SET_ITEM(__pyx_t_2, 3, __pyx_tuple__27);
  __Pyx_INCREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);
  PyList_SET_ITEM(__pyx_t_2, 4, __pyx_tuple__32);
  __Pyx_INCREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);
  PyList_SET_ITEM(__pyx_t_2, 5, __pyx_tuple__37);
  __Pyx_INCREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);
  PyList_SET_ITEM(__pyx_t_2, 6, __pyx_tuple__42);
  __Pyx_INCREF(__pyx_tuple__47);
  __Pyx_GIVEREF(__pyx_tuple__47);
  PyList_SET_ITEM(__pyx_t_2, 7, __pyx_tuple__47);
  __Pyx_INCREF(__pyx_tuple__52);
  __Pyx_GIVEREF(__pyx_tuple__52);
  PyList_SET_ITEM(__pyx_t_2, 8, __pyx_tuple__52);
  __Pyx_INCREF(__pyx_tuple__57);
  __Pyx_GIVEREF(__pyx_tuple__57);
  PyList_SET_ITEM(__pyx_t_2, 9, __pyx_tuple__57);
  __Pyx_INCREF(__pyx_tuple__62);
  __Pyx_GIVEREF(__pyx_tuple__62);
  PyList_SET_ITEM(__pyx_t_2, 10, __pyx_tuple__62);
  __Pyx_INCREF(__pyx_tuple__67);
  __Pyx_GIVEREF(__pyx_tuple__67);
  PyList_SET_ITEM(__pyx_t_2, 11, __pyx_tuple__67);
  __Pyx_INCREF(__pyx_tuple__72);
  __Pyx_GIVEREF(__pyx_tuple__72);
  PyList_SET_ITEM(__pyx_t_2, 12, __pyx_tuple__72);
  __Pyx_INCREF(__pyx_tuple__77);
  __Pyx_GIVEREF(__pyx_tuple__77);
  PyList_SET_ITEM(__pyx_t_2, 13, __pyx_tuple__77);
  __Pyx_INCREF(__pyx_tuple__82);
  __Pyx_GIVEREF(__pyx_tuple__82);
  PyList_SET_ITEM(__pyx_t_2, 14, __pyx_tuple__82);
  __Pyx_INCREF(__pyx_tuple__87);
  __Pyx_GIVEREF(__pyx_tuple__87);
  PyList_SET_ITEM(__pyx_t_2, 15, __pyx_tuple__87);
  __Pyx_INCREF(__pyx_tuple__92);
  __Pyx_GIVEREF(__pyx_tuple__92);
  PyList_SET_ITEM(__pyx_t_2, 16, __pyx_tuple__92);
  __Pyx_INCREF(__pyx_tuple__97);
  __Pyx_GIVEREF(__pyx_tuple__97);
  PyList_SET_ITEM(__pyx_t_2, 17, __pyx_tuple__97);
  __Pyx_INCREF(__pyx_tuple__101);
  __Pyx_GIVEREF(__pyx_tuple__101);
  PyList_SET_ITEM(__pyx_t_2, 18, __pyx_tuple__101);
  __Pyx_INCREF(__pyx_tuple__105);
  __Pyx_GIVEREF(__pyx_tuple__105);
  PyList_SET_ITEM(__pyx_t_2, 19, __pyx_tuple__105);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 746, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
/* … */
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_v_Grammar, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 746, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_cfg = __pyx_t_3;
  __pyx_t_3 = 0;
+747: 		((('A', 'A'), ((0, ), )), 0.7), ((('A', 'B'), ((0, ), )), 0.6),
  __pyx_tuple__8 = PyTuple_Pack(2, __pyx_n_u_A, __pyx_n_u_A); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_tuple__9); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
  __pyx_tuple__11 = PyTuple_Pack(2, __pyx_tuple__8, __pyx_tuple__10); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
  __pyx_tuple__12 = PyTuple_Pack(2, __pyx_tuple__11, __pyx_float_0_7); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);
  __pyx_tuple__13 = PyTuple_Pack(2, __pyx_n_u_A, __pyx_n_u_B); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);
  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);
  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_tuple__14); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
  __pyx_tuple__16 = PyTuple_Pack(2, __pyx_tuple__13, __pyx_tuple__15); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);
  __pyx_tuple__17 = PyTuple_Pack(2, __pyx_tuple__16, __pyx_float_0_6); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 747, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);
+748: 		((('A', 'C'), ((0, ), )), 0.5), ((('A', 'D'), ((0, ), )), 0.4),
  __pyx_tuple__18 = PyTuple_Pack(2, __pyx_n_u_A, __pyx_n_u_C); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);
  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_tuple__19); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);
  __pyx_tuple__21 = PyTuple_Pack(2, __pyx_tuple__18, __pyx_tuple__20); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);
  __pyx_tuple__22 = PyTuple_Pack(2, __pyx_tuple__21, __pyx_float_0_5); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
  __pyx_tuple__23 = PyTuple_Pack(2, __pyx_n_u_A, __pyx_n_u_D); if (unlikely(!__pyx_tuple__23)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
  __pyx_tuple__25 = PyTuple_Pack(1, __pyx_tuple__24); if (unlikely(!__pyx_tuple__25)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__25);
  __Pyx_GIVEREF(__pyx_tuple__25);
  __pyx_tuple__26 = PyTuple_Pack(2, __pyx_tuple__23, __pyx_tuple__25); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 748, __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_4); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 748, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
+749: 		((('B', 'A'), ((0, ), )), 0.3), ((('B', 'B'), ((0, ), )), 0.2),
  __pyx_tuple__28 = PyTuple_Pack(2, __pyx_n_u_B, __pyx_n_u_A); if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__28);
  __Pyx_GIVEREF(__pyx_tuple__28);
  __pyx_tuple__29 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);
  __pyx_tuple__30 = PyTuple_Pack(1, __pyx_tuple__29); if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__30);
  __Pyx_GIVEREF(__pyx_tuple__30);
  __pyx_tuple__31 = PyTuple_Pack(2, __pyx_tuple__28, __pyx_tuple__30); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);
  __pyx_tuple__32 = PyTuple_Pack(2, __pyx_tuple__31, __pyx_float_0_3); if (unlikely(!__pyx_tuple__32)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);
  __pyx_tuple__33 = PyTuple_Pack(2, __pyx_n_u_B, __pyx_n_u_B); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);
  __pyx_tuple__34 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__34)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__34);
  __Pyx_GIVEREF(__pyx_tuple__34);
  __pyx_tuple__35 = PyTuple_Pack(1, __pyx_tuple__34); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);
  __pyx_tuple__36 = PyTuple_Pack(2, __pyx_tuple__33, __pyx_tuple__35); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);
  __pyx_tuple__37 = PyTuple_Pack(2, __pyx_tuple__36, __pyx_float_0_2); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 749, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);
+750: 		((('B', 'C'), ((0, ), )), 0.1), ((('B', 'D'), ((0, ), )), 0.2),
  __pyx_tuple__38 = PyTuple_Pack(2, __pyx_n_u_B, __pyx_n_u_C); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__38);
  __Pyx_GIVEREF(__pyx_tuple__38);
  __pyx_tuple__39 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);
  __pyx_tuple__40 = PyTuple_Pack(1, __pyx_tuple__39); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__40);
  __Pyx_GIVEREF(__pyx_tuple__40);
  __pyx_tuple__41 = PyTuple_Pack(2, __pyx_tuple__38, __pyx_tuple__40); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);
  __pyx_tuple__42 = PyTuple_Pack(2, __pyx_tuple__41, __pyx_float_0_1); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);
  __pyx_tuple__43 = PyTuple_Pack(2, __pyx_n_u_B, __pyx_n_u_D); if (unlikely(!__pyx_tuple__43)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__43);
  __Pyx_GIVEREF(__pyx_tuple__43);
  __pyx_tuple__44 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__44);
  __Pyx_GIVEREF(__pyx_tuple__44);
  __pyx_tuple__45 = PyTuple_Pack(1, __pyx_tuple__44); if (unlikely(!__pyx_tuple__45)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__45);
  __Pyx_GIVEREF(__pyx_tuple__45);
  __pyx_tuple__46 = PyTuple_Pack(2, __pyx_tuple__43, __pyx_tuple__45); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__46);
  __Pyx_GIVEREF(__pyx_tuple__46);
  __pyx_tuple__47 = PyTuple_Pack(2, __pyx_tuple__46, __pyx_float_0_2); if (unlikely(!__pyx_tuple__47)) __PYX_ERR(0, 750, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__47);
  __Pyx_GIVEREF(__pyx_tuple__47);
 751: 		# ((('B', 'C'), ((0, ), )), 0.3),
+752: 		((('C', 'A'), ((0, ), )), 0.4),
  __pyx_tuple__48 = PyTuple_Pack(2, __pyx_n_u_C, __pyx_n_u_A); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__48);
  __Pyx_GIVEREF(__pyx_tuple__48);
  __pyx_tuple__49 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__49)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__49);
  __Pyx_GIVEREF(__pyx_tuple__49);
  __pyx_tuple__50 = PyTuple_Pack(1, __pyx_tuple__49); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__50);
  __Pyx_GIVEREF(__pyx_tuple__50);
  __pyx_tuple__51 = PyTuple_Pack(2, __pyx_tuple__48, __pyx_tuple__50); if (unlikely(!__pyx_tuple__51)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__51);
  __Pyx_GIVEREF(__pyx_tuple__51);
  __pyx_tuple__52 = PyTuple_Pack(2, __pyx_tuple__51, __pyx_float_0_4); if (unlikely(!__pyx_tuple__52)) __PYX_ERR(0, 752, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__52);
  __Pyx_GIVEREF(__pyx_tuple__52);
+753: 		((('C', 'B'), ((0, ), )), 0.5), ((('C', 'C'), ((0, ), )), 0.6),
  __pyx_tuple__53 = PyTuple_Pack(2, __pyx_n_u_C, __pyx_n_u_B); if (unlikely(!__pyx_tuple__53)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__53);
  __Pyx_GIVEREF(__pyx_tuple__53);
  __pyx_tuple__54 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__54)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__54);
  __Pyx_GIVEREF(__pyx_tuple__54);
  __pyx_tuple__55 = PyTuple_Pack(1, __pyx_tuple__54); if (unlikely(!__pyx_tuple__55)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__55);
  __Pyx_GIVEREF(__pyx_tuple__55);
  __pyx_tuple__56 = PyTuple_Pack(2, __pyx_tuple__53, __pyx_tuple__55); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__56);
  __Pyx_GIVEREF(__pyx_tuple__56);
  __pyx_tuple__57 = PyTuple_Pack(2, __pyx_tuple__56, __pyx_float_0_5); if (unlikely(!__pyx_tuple__57)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__57);
  __Pyx_GIVEREF(__pyx_tuple__57);
  __pyx_tuple__58 = PyTuple_Pack(2, __pyx_n_u_C, __pyx_n_u_C); if (unlikely(!__pyx_tuple__58)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__58);
  __Pyx_GIVEREF(__pyx_tuple__58);
  __pyx_tuple__59 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__59)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__59);
  __Pyx_GIVEREF(__pyx_tuple__59);
  __pyx_tuple__60 = PyTuple_Pack(1, __pyx_tuple__59); if (unlikely(!__pyx_tuple__60)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__60);
  __Pyx_GIVEREF(__pyx_tuple__60);
  __pyx_tuple__61 = PyTuple_Pack(2, __pyx_tuple__58, __pyx_tuple__60); if (unlikely(!__pyx_tuple__61)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__61);
  __Pyx_GIVEREF(__pyx_tuple__61);
  __pyx_tuple__62 = PyTuple_Pack(2, __pyx_tuple__61, __pyx_float_0_6); if (unlikely(!__pyx_tuple__62)) __PYX_ERR(0, 753, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__62);
  __Pyx_GIVEREF(__pyx_tuple__62);
+754: 		((('C', 'D'), ((0, ), )), 0.7), ((('D', 'A'), ((0, ), )), 0.8),
  __pyx_tuple__63 = PyTuple_Pack(2, __pyx_n_u_C, __pyx_n_u_D); if (unlikely(!__pyx_tuple__63)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__63);
  __Pyx_GIVEREF(__pyx_tuple__63);
  __pyx_tuple__64 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__64)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__64);
  __Pyx_GIVEREF(__pyx_tuple__64);
  __pyx_tuple__65 = PyTuple_Pack(1, __pyx_tuple__64); if (unlikely(!__pyx_tuple__65)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__65);
  __Pyx_GIVEREF(__pyx_tuple__65);
  __pyx_tuple__66 = PyTuple_Pack(2, __pyx_tuple__63, __pyx_tuple__65); if (unlikely(!__pyx_tuple__66)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__66);
  __Pyx_GIVEREF(__pyx_tuple__66);
  __pyx_tuple__67 = PyTuple_Pack(2, __pyx_tuple__66, __pyx_float_0_7); if (unlikely(!__pyx_tuple__67)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__67);
  __Pyx_GIVEREF(__pyx_tuple__67);
  __pyx_tuple__68 = PyTuple_Pack(2, __pyx_n_u_D, __pyx_n_u_A); if (unlikely(!__pyx_tuple__68)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__68);
  __Pyx_GIVEREF(__pyx_tuple__68);
  __pyx_tuple__69 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__69)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__69);
  __Pyx_GIVEREF(__pyx_tuple__69);
  __pyx_tuple__70 = PyTuple_Pack(1, __pyx_tuple__69); if (unlikely(!__pyx_tuple__70)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__70);
  __Pyx_GIVEREF(__pyx_tuple__70);
  __pyx_tuple__71 = PyTuple_Pack(2, __pyx_tuple__68, __pyx_tuple__70); if (unlikely(!__pyx_tuple__71)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__71);
  __Pyx_GIVEREF(__pyx_tuple__71);
  __pyx_tuple__72 = PyTuple_Pack(2, __pyx_tuple__71, __pyx_float_0_8); if (unlikely(!__pyx_tuple__72)) __PYX_ERR(0, 754, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__72);
  __Pyx_GIVEREF(__pyx_tuple__72);
+755: 		((('D', 'B'), ((0, ), )), 0.9), ((('D', 'C'), ((0, ), )), 0.8),
  __pyx_tuple__73 = PyTuple_Pack(2, __pyx_n_u_D, __pyx_n_u_B); if (unlikely(!__pyx_tuple__73)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__73);
  __Pyx_GIVEREF(__pyx_tuple__73);
  __pyx_tuple__74 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__74)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__74);
  __Pyx_GIVEREF(__pyx_tuple__74);
  __pyx_tuple__75 = PyTuple_Pack(1, __pyx_tuple__74); if (unlikely(!__pyx_tuple__75)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__75);
  __Pyx_GIVEREF(__pyx_tuple__75);
  __pyx_tuple__76 = PyTuple_Pack(2, __pyx_tuple__73, __pyx_tuple__75); if (unlikely(!__pyx_tuple__76)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__76);
  __Pyx_GIVEREF(__pyx_tuple__76);
  __pyx_tuple__77 = PyTuple_Pack(2, __pyx_tuple__76, __pyx_float_0_9); if (unlikely(!__pyx_tuple__77)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__77);
  __Pyx_GIVEREF(__pyx_tuple__77);
  __pyx_tuple__78 = PyTuple_Pack(2, __pyx_n_u_D, __pyx_n_u_C); if (unlikely(!__pyx_tuple__78)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__78);
  __Pyx_GIVEREF(__pyx_tuple__78);
  __pyx_tuple__79 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__79)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__79);
  __Pyx_GIVEREF(__pyx_tuple__79);
  __pyx_tuple__80 = PyTuple_Pack(1, __pyx_tuple__79); if (unlikely(!__pyx_tuple__80)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__80);
  __Pyx_GIVEREF(__pyx_tuple__80);
  __pyx_tuple__81 = PyTuple_Pack(2, __pyx_tuple__78, __pyx_tuple__80); if (unlikely(!__pyx_tuple__81)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__81);
  __Pyx_GIVEREF(__pyx_tuple__81);
  __pyx_tuple__82 = PyTuple_Pack(2, __pyx_tuple__81, __pyx_float_0_8); if (unlikely(!__pyx_tuple__82)) __PYX_ERR(0, 755, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__82);
  __Pyx_GIVEREF(__pyx_tuple__82);
+756: 		((('D', 'NP', 'VP'), ((0, 1), )), 1),
  __pyx_tuple__83 = PyTuple_Pack(3, __pyx_n_u_D, __pyx_n_u_NP, __pyx_n_u_VP); if (unlikely(!__pyx_tuple__83)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__83);
  __Pyx_GIVEREF(__pyx_tuple__83);
  __pyx_tuple__84 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__84)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__84);
  __Pyx_GIVEREF(__pyx_tuple__84);
  __pyx_tuple__85 = PyTuple_Pack(1, __pyx_tuple__84); if (unlikely(!__pyx_tuple__85)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__85);
  __Pyx_GIVEREF(__pyx_tuple__85);
  __pyx_tuple__86 = PyTuple_Pack(2, __pyx_tuple__83, __pyx_tuple__85); if (unlikely(!__pyx_tuple__86)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__86);
  __Pyx_GIVEREF(__pyx_tuple__86);
  __pyx_tuple__87 = PyTuple_Pack(2, __pyx_tuple__86, __pyx_int_1); if (unlikely(!__pyx_tuple__87)) __PYX_ERR(0, 756, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__87);
  __Pyx_GIVEREF(__pyx_tuple__87);
+757: 		((('S', 'A'), ((0, ), )), 0.8),
  __pyx_tuple__88 = PyTuple_Pack(2, __pyx_n_u_S, __pyx_n_u_A); if (unlikely(!__pyx_tuple__88)) __PYX_ERR(0, 757, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__88);
  __Pyx_GIVEREF(__pyx_tuple__88);
  __pyx_tuple__89 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__89)) __PYX_ERR(0, 757, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__89);
  __Pyx_GIVEREF(__pyx_tuple__89);
  __pyx_tuple__90 = PyTuple_Pack(1, __pyx_tuple__89); if (unlikely(!__pyx_tuple__90)) __PYX_ERR(0, 757, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__90);
  __Pyx_GIVEREF(__pyx_tuple__90);
  __pyx_tuple__91 = PyTuple_Pack(2, __pyx_tuple__88, __pyx_tuple__90); if (unlikely(!__pyx_tuple__91)) __PYX_ERR(0, 757, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__91);
  __Pyx_GIVEREF(__pyx_tuple__91);
  __pyx_tuple__92 = PyTuple_Pack(2, __pyx_tuple__91, __pyx_float_0_8); if (unlikely(!__pyx_tuple__92)) __PYX_ERR(0, 757, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__92);
  __Pyx_GIVEREF(__pyx_tuple__92);
+758: 		((('S', 'D'), ((0, ), )), 0.5),
  __pyx_tuple__93 = PyTuple_Pack(2, __pyx_n_u_S, __pyx_n_u_D); if (unlikely(!__pyx_tuple__93)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__93);
  __Pyx_GIVEREF(__pyx_tuple__93);
  __pyx_tuple__94 = PyTuple_Pack(1, __pyx_int_0); if (unlikely(!__pyx_tuple__94)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__94);
  __Pyx_GIVEREF(__pyx_tuple__94);
  __pyx_tuple__95 = PyTuple_Pack(1, __pyx_tuple__94); if (unlikely(!__pyx_tuple__95)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__95);
  __Pyx_GIVEREF(__pyx_tuple__95);
  __pyx_tuple__96 = PyTuple_Pack(2, __pyx_tuple__93, __pyx_tuple__95); if (unlikely(!__pyx_tuple__96)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__96);
  __Pyx_GIVEREF(__pyx_tuple__96);
  __pyx_tuple__97 = PyTuple_Pack(2, __pyx_tuple__96, __pyx_float_0_5); if (unlikely(!__pyx_tuple__97)) __PYX_ERR(0, 758, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__97);
  __Pyx_GIVEREF(__pyx_tuple__97);
+759: 		((('NP', 'Epsilon'), ('mary', )), 1),
  __pyx_tuple__98 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__98)) __PYX_ERR(0, 759, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__98);
  __Pyx_GIVEREF(__pyx_tuple__98);
  __pyx_tuple__99 = PyTuple_Pack(1, __pyx_n_u_mary); if (unlikely(!__pyx_tuple__99)) __PYX_ERR(0, 759, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__99);
  __Pyx_GIVEREF(__pyx_tuple__99);
  __pyx_tuple__100 = PyTuple_Pack(2, __pyx_tuple__98, __pyx_tuple__99); if (unlikely(!__pyx_tuple__100)) __PYX_ERR(0, 759, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__100);
  __Pyx_GIVEREF(__pyx_tuple__100);
  __pyx_tuple__101 = PyTuple_Pack(2, __pyx_tuple__100, __pyx_int_1); if (unlikely(!__pyx_tuple__101)) __PYX_ERR(0, 759, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__101);
  __Pyx_GIVEREF(__pyx_tuple__101);
+760: 		((('VP', 'Epsilon'), ('walks', )), 1)],
  __pyx_tuple__102 = PyTuple_Pack(2, __pyx_n_u_VP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__102)) __PYX_ERR(0, 760, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__102);
  __Pyx_GIVEREF(__pyx_tuple__102);
  __pyx_tuple__103 = PyTuple_Pack(1, __pyx_n_u_walks); if (unlikely(!__pyx_tuple__103)) __PYX_ERR(0, 760, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__103);
  __Pyx_GIVEREF(__pyx_tuple__103);
  __pyx_tuple__104 = PyTuple_Pack(2, __pyx_tuple__102, __pyx_tuple__103); if (unlikely(!__pyx_tuple__104)) __PYX_ERR(0, 760, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__104);
  __Pyx_GIVEREF(__pyx_tuple__104);
  __pyx_tuple__105 = PyTuple_Pack(2, __pyx_tuple__104, __pyx_int_1); if (unlikely(!__pyx_tuple__105)) __PYX_ERR(0, 760, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__105);
  __Pyx_GIVEREF(__pyx_tuple__105);
+761: 		start='S')
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 761, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_start, __pyx_n_u_S) < 0) __PYX_ERR(0, 761, __pyx_L1_error)
+762: 	print(cfg)
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_cfg);
  __Pyx_GIVEREF(__pyx_v_cfg);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_cfg);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 762, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+763: 	testsent('mary walks', cfg, 10)
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 763, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __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[4] = {__pyx_t_1, __pyx_kp_u_mary_walks, __pyx_v_cfg, __pyx_int_10};
    __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 763, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
    PyObject *__pyx_temp[4] = {__pyx_t_1, __pyx_kp_u_mary_walks, __pyx_v_cfg, __pyx_int_10};
    __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 763, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else
  #endif
  {
    __pyx_t_5 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 763, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (__pyx_t_1) {
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_1); __pyx_t_1 = NULL;
    }
    __Pyx_INCREF(__pyx_kp_u_mary_walks);
    __Pyx_GIVEREF(__pyx_kp_u_mary_walks);
    PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_kp_u_mary_walks);
    __Pyx_INCREF(__pyx_v_cfg);
    __Pyx_GIVEREF(__pyx_v_cfg);
    PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_cfg);
    __Pyx_INCREF(__pyx_int_10);
    __Pyx_GIVEREF(__pyx_int_10);
    PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, __pyx_int_10);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 763, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 764: 	# chart, msg = parse_sparse('mary walks'.split(), cfg)
 765: 	# assert chart, msg
 766: 
+767: 	rules = [
  __pyx_t_2 = PyList_New(12); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 767, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_tuple__110);
  __Pyx_GIVEREF(__pyx_tuple__110);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_tuple__110);
  __Pyx_INCREF(__pyx_tuple__115);
  __Pyx_GIVEREF(__pyx_tuple__115);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_tuple__115);
  __Pyx_INCREF(__pyx_tuple__120);
  __Pyx_GIVEREF(__pyx_tuple__120);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_tuple__120);
  __Pyx_INCREF(__pyx_tuple__125);
  __Pyx_GIVEREF(__pyx_tuple__125);
  PyList_SET_ITEM(__pyx_t_2, 3, __pyx_tuple__125);
  __Pyx_INCREF(__pyx_tuple__130);
  __Pyx_GIVEREF(__pyx_tuple__130);
  PyList_SET_ITEM(__pyx_t_2, 4, __pyx_tuple__130);
  __Pyx_INCREF(__pyx_tuple__134);
  __Pyx_GIVEREF(__pyx_tuple__134);
  PyList_SET_ITEM(__pyx_t_2, 5, __pyx_tuple__134);
  __Pyx_INCREF(__pyx_tuple__138);
  __Pyx_GIVEREF(__pyx_tuple__138);
  PyList_SET_ITEM(__pyx_t_2, 6, __pyx_tuple__138);
  __Pyx_INCREF(__pyx_tuple__142);
  __Pyx_GIVEREF(__pyx_tuple__142);
  PyList_SET_ITEM(__pyx_t_2, 7, __pyx_tuple__142);
  __Pyx_INCREF(__pyx_tuple__146);
  __Pyx_GIVEREF(__pyx_tuple__146);
  PyList_SET_ITEM(__pyx_t_2, 8, __pyx_tuple__146);
  __Pyx_INCREF(__pyx_tuple__150);
  __Pyx_GIVEREF(__pyx_tuple__150);
  PyList_SET_ITEM(__pyx_t_2, 9, __pyx_tuple__150);
  __Pyx_INCREF(__pyx_tuple__154);
  __Pyx_GIVEREF(__pyx_tuple__154);
  PyList_SET_ITEM(__pyx_t_2, 10, __pyx_tuple__154);
  __Pyx_INCREF(__pyx_tuple__158);
  __Pyx_GIVEREF(__pyx_tuple__158);
  PyList_SET_ITEM(__pyx_t_2, 11, __pyx_tuple__158);
  __pyx_v_rules = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+768: 		((('NP', 'NP', 'PP'), ((0, 1), )), 0.4),
  __pyx_tuple__106 = PyTuple_Pack(3, __pyx_n_u_NP, __pyx_n_u_NP, __pyx_n_u_PP); if (unlikely(!__pyx_tuple__106)) __PYX_ERR(0, 768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__106);
  __Pyx_GIVEREF(__pyx_tuple__106);
  __pyx_tuple__107 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__107)) __PYX_ERR(0, 768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__107);
  __Pyx_GIVEREF(__pyx_tuple__107);
  __pyx_tuple__108 = PyTuple_Pack(1, __pyx_tuple__107); if (unlikely(!__pyx_tuple__108)) __PYX_ERR(0, 768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__108);
  __Pyx_GIVEREF(__pyx_tuple__108);
  __pyx_tuple__109 = PyTuple_Pack(2, __pyx_tuple__106, __pyx_tuple__108); if (unlikely(!__pyx_tuple__109)) __PYX_ERR(0, 768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__109);
  __Pyx_GIVEREF(__pyx_tuple__109);
  __pyx_tuple__110 = PyTuple_Pack(2, __pyx_tuple__109, __pyx_float_0_4); if (unlikely(!__pyx_tuple__110)) __PYX_ERR(0, 768, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__110);
  __Pyx_GIVEREF(__pyx_tuple__110);
+769: 		((('PP', 'P', 'NP'), ((0, 1), )), 1),
  __pyx_tuple__111 = PyTuple_Pack(3, __pyx_n_u_PP, __pyx_n_u_P, __pyx_n_u_NP); if (unlikely(!__pyx_tuple__111)) __PYX_ERR(0, 769, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__111);
  __Pyx_GIVEREF(__pyx_tuple__111);
  __pyx_tuple__112 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__112)) __PYX_ERR(0, 769, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__112);
  __Pyx_GIVEREF(__pyx_tuple__112);
  __pyx_tuple__113 = PyTuple_Pack(1, __pyx_tuple__112); if (unlikely(!__pyx_tuple__113)) __PYX_ERR(0, 769, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__113);
  __Pyx_GIVEREF(__pyx_tuple__113);
  __pyx_tuple__114 = PyTuple_Pack(2, __pyx_tuple__111, __pyx_tuple__113); if (unlikely(!__pyx_tuple__114)) __PYX_ERR(0, 769, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__114);
  __Pyx_GIVEREF(__pyx_tuple__114);
  __pyx_tuple__115 = PyTuple_Pack(2, __pyx_tuple__114, __pyx_int_1); if (unlikely(!__pyx_tuple__115)) __PYX_ERR(0, 769, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__115);
  __Pyx_GIVEREF(__pyx_tuple__115);
+770: 		((('S', 'NP', 'VP'), ((0, 1), )), 1),
  __pyx_tuple__116 = PyTuple_Pack(3, __pyx_n_u_S, __pyx_n_u_NP, __pyx_n_u_VP); if (unlikely(!__pyx_tuple__116)) __PYX_ERR(0, 770, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__116);
  __Pyx_GIVEREF(__pyx_tuple__116);
  __pyx_tuple__117 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__117)) __PYX_ERR(0, 770, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__117);
  __Pyx_GIVEREF(__pyx_tuple__117);
  __pyx_tuple__118 = PyTuple_Pack(1, __pyx_tuple__117); if (unlikely(!__pyx_tuple__118)) __PYX_ERR(0, 770, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__118);
  __Pyx_GIVEREF(__pyx_tuple__118);
  __pyx_tuple__119 = PyTuple_Pack(2, __pyx_tuple__116, __pyx_tuple__118); if (unlikely(!__pyx_tuple__119)) __PYX_ERR(0, 770, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__119);
  __Pyx_GIVEREF(__pyx_tuple__119);
  __pyx_tuple__120 = PyTuple_Pack(2, __pyx_tuple__119, __pyx_int_1); if (unlikely(!__pyx_tuple__120)) __PYX_ERR(0, 770, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__120);
  __Pyx_GIVEREF(__pyx_tuple__120);
+771: 		((('VP', 'V', 'NP'), ((0, 1), )), 0.7),
  __pyx_tuple__121 = PyTuple_Pack(3, __pyx_n_u_VP, __pyx_n_u_V, __pyx_n_u_NP); if (unlikely(!__pyx_tuple__121)) __PYX_ERR(0, 771, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__121);
  __Pyx_GIVEREF(__pyx_tuple__121);
  __pyx_tuple__122 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__122)) __PYX_ERR(0, 771, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__122);
  __Pyx_GIVEREF(__pyx_tuple__122);
  __pyx_tuple__123 = PyTuple_Pack(1, __pyx_tuple__122); if (unlikely(!__pyx_tuple__123)) __PYX_ERR(0, 771, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__123);
  __Pyx_GIVEREF(__pyx_tuple__123);
  __pyx_tuple__124 = PyTuple_Pack(2, __pyx_tuple__121, __pyx_tuple__123); if (unlikely(!__pyx_tuple__124)) __PYX_ERR(0, 771, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__124);
  __Pyx_GIVEREF(__pyx_tuple__124);
  __pyx_tuple__125 = PyTuple_Pack(2, __pyx_tuple__124, __pyx_float_0_7); if (unlikely(!__pyx_tuple__125)) __PYX_ERR(0, 771, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__125);
  __Pyx_GIVEREF(__pyx_tuple__125);
+772: 		((('VP', 'VP', 'PP'), ((0, 1), )), 0.3),
  __pyx_tuple__126 = PyTuple_Pack(3, __pyx_n_u_VP, __pyx_n_u_VP, __pyx_n_u_PP); if (unlikely(!__pyx_tuple__126)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__126);
  __Pyx_GIVEREF(__pyx_tuple__126);
  __pyx_tuple__127 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_1); if (unlikely(!__pyx_tuple__127)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__127);
  __Pyx_GIVEREF(__pyx_tuple__127);
  __pyx_tuple__128 = PyTuple_Pack(1, __pyx_tuple__127); if (unlikely(!__pyx_tuple__128)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__128);
  __Pyx_GIVEREF(__pyx_tuple__128);
  __pyx_tuple__129 = PyTuple_Pack(2, __pyx_tuple__126, __pyx_tuple__128); if (unlikely(!__pyx_tuple__129)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__129);
  __Pyx_GIVEREF(__pyx_tuple__129);
  __pyx_tuple__130 = PyTuple_Pack(2, __pyx_tuple__129, __pyx_float_0_3); if (unlikely(!__pyx_tuple__130)) __PYX_ERR(0, 772, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__130);
  __Pyx_GIVEREF(__pyx_tuple__130);
+773: 		((('NP', 'Epsilon'), ('astronomers', )), 0.1),
  __pyx_tuple__131 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__131)) __PYX_ERR(0, 773, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__131);
  __Pyx_GIVEREF(__pyx_tuple__131);
  __pyx_tuple__132 = PyTuple_Pack(1, __pyx_n_u_astronomers); if (unlikely(!__pyx_tuple__132)) __PYX_ERR(0, 773, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__132);
  __Pyx_GIVEREF(__pyx_tuple__132);
  __pyx_tuple__133 = PyTuple_Pack(2, __pyx_tuple__131, __pyx_tuple__132); if (unlikely(!__pyx_tuple__133)) __PYX_ERR(0, 773, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__133);
  __Pyx_GIVEREF(__pyx_tuple__133);
  __pyx_tuple__134 = PyTuple_Pack(2, __pyx_tuple__133, __pyx_float_0_1); if (unlikely(!__pyx_tuple__134)) __PYX_ERR(0, 773, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__134);
  __Pyx_GIVEREF(__pyx_tuple__134);
+774: 		((('NP', 'Epsilon'), ('ears', )), 0.18),
  __pyx_tuple__135 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__135)) __PYX_ERR(0, 774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__135);
  __Pyx_GIVEREF(__pyx_tuple__135);
  __pyx_tuple__136 = PyTuple_Pack(1, __pyx_n_u_ears); if (unlikely(!__pyx_tuple__136)) __PYX_ERR(0, 774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__136);
  __Pyx_GIVEREF(__pyx_tuple__136);
  __pyx_tuple__137 = PyTuple_Pack(2, __pyx_tuple__135, __pyx_tuple__136); if (unlikely(!__pyx_tuple__137)) __PYX_ERR(0, 774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__137);
  __Pyx_GIVEREF(__pyx_tuple__137);
  __pyx_tuple__138 = PyTuple_Pack(2, __pyx_tuple__137, __pyx_float_0_18); if (unlikely(!__pyx_tuple__138)) __PYX_ERR(0, 774, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__138);
  __Pyx_GIVEREF(__pyx_tuple__138);
+775: 		((('V', 'Epsilon'), ('saw', )), 1),
  __pyx_tuple__139 = PyTuple_Pack(2, __pyx_n_u_V, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__139)) __PYX_ERR(0, 775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__139);
  __Pyx_GIVEREF(__pyx_tuple__139);
  __pyx_tuple__140 = PyTuple_Pack(1, __pyx_n_u_saw); if (unlikely(!__pyx_tuple__140)) __PYX_ERR(0, 775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__140);
  __Pyx_GIVEREF(__pyx_tuple__140);
  __pyx_tuple__141 = PyTuple_Pack(2, __pyx_tuple__139, __pyx_tuple__140); if (unlikely(!__pyx_tuple__141)) __PYX_ERR(0, 775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__141);
  __Pyx_GIVEREF(__pyx_tuple__141);
  __pyx_tuple__142 = PyTuple_Pack(2, __pyx_tuple__141, __pyx_int_1); if (unlikely(!__pyx_tuple__142)) __PYX_ERR(0, 775, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__142);
  __Pyx_GIVEREF(__pyx_tuple__142);
+776: 		((('NP', 'Epsilon'), ('saw', )), 0.04),
  __pyx_tuple__143 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__143)) __PYX_ERR(0, 776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__143);
  __Pyx_GIVEREF(__pyx_tuple__143);
  __pyx_tuple__144 = PyTuple_Pack(1, __pyx_n_u_saw); if (unlikely(!__pyx_tuple__144)) __PYX_ERR(0, 776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__144);
  __Pyx_GIVEREF(__pyx_tuple__144);
  __pyx_tuple__145 = PyTuple_Pack(2, __pyx_tuple__143, __pyx_tuple__144); if (unlikely(!__pyx_tuple__145)) __PYX_ERR(0, 776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__145);
  __Pyx_GIVEREF(__pyx_tuple__145);
  __pyx_tuple__146 = PyTuple_Pack(2, __pyx_tuple__145, __pyx_float_0_04); if (unlikely(!__pyx_tuple__146)) __PYX_ERR(0, 776, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__146);
  __Pyx_GIVEREF(__pyx_tuple__146);
+777: 		((('NP', 'Epsilon'), ('stars', )), 0.18),
  __pyx_tuple__147 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__147)) __PYX_ERR(0, 777, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__147);
  __Pyx_GIVEREF(__pyx_tuple__147);
  __pyx_tuple__148 = PyTuple_Pack(1, __pyx_n_u_stars); if (unlikely(!__pyx_tuple__148)) __PYX_ERR(0, 777, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__148);
  __Pyx_GIVEREF(__pyx_tuple__148);
  __pyx_tuple__149 = PyTuple_Pack(2, __pyx_tuple__147, __pyx_tuple__148); if (unlikely(!__pyx_tuple__149)) __PYX_ERR(0, 777, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__149);
  __Pyx_GIVEREF(__pyx_tuple__149);
  __pyx_tuple__150 = PyTuple_Pack(2, __pyx_tuple__149, __pyx_float_0_18); if (unlikely(!__pyx_tuple__150)) __PYX_ERR(0, 777, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__150);
  __Pyx_GIVEREF(__pyx_tuple__150);
+778: 		((('NP', 'Epsilon'), ('telescopes', )), 0.1),
  __pyx_tuple__151 = PyTuple_Pack(2, __pyx_n_u_NP, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__151)) __PYX_ERR(0, 778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__151);
  __Pyx_GIVEREF(__pyx_tuple__151);
  __pyx_tuple__152 = PyTuple_Pack(1, __pyx_n_u_telescopes); if (unlikely(!__pyx_tuple__152)) __PYX_ERR(0, 778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__152);
  __Pyx_GIVEREF(__pyx_tuple__152);
  __pyx_tuple__153 = PyTuple_Pack(2, __pyx_tuple__151, __pyx_tuple__152); if (unlikely(!__pyx_tuple__153)) __PYX_ERR(0, 778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__153);
  __Pyx_GIVEREF(__pyx_tuple__153);
  __pyx_tuple__154 = PyTuple_Pack(2, __pyx_tuple__153, __pyx_float_0_1); if (unlikely(!__pyx_tuple__154)) __PYX_ERR(0, 778, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__154);
  __Pyx_GIVEREF(__pyx_tuple__154);
+779: 		((('P', 'Epsilon'), ('with', )), 1)]
  __pyx_tuple__155 = PyTuple_Pack(2, __pyx_n_u_P, __pyx_n_u_Epsilon); if (unlikely(!__pyx_tuple__155)) __PYX_ERR(0, 779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__155);
  __Pyx_GIVEREF(__pyx_tuple__155);
  __pyx_tuple__156 = PyTuple_Pack(1, __pyx_n_u_with); if (unlikely(!__pyx_tuple__156)) __PYX_ERR(0, 779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__156);
  __Pyx_GIVEREF(__pyx_tuple__156);
  __pyx_tuple__157 = PyTuple_Pack(2, __pyx_tuple__155, __pyx_tuple__156); if (unlikely(!__pyx_tuple__157)) __PYX_ERR(0, 779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__157);
  __Pyx_GIVEREF(__pyx_tuple__157);
  __pyx_tuple__158 = PyTuple_Pack(2, __pyx_tuple__157, __pyx_int_1); if (unlikely(!__pyx_tuple__158)) __PYX_ERR(0, 779, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__158);
  __Pyx_GIVEREF(__pyx_tuple__158);
+780: 	cfg2 = Grammar(rules, start='S')
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 780, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_rules);
  __Pyx_GIVEREF(__pyx_v_rules);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_rules);
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 780, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_start, __pyx_n_u_S) < 0) __PYX_ERR(0, 780, __pyx_L1_error)
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_v_Grammar, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 780, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_cfg2 = __pyx_t_5;
  __pyx_t_5 = 0;
+781: 	testsent('astronomers saw stars with telescopes', cfg2, 2)
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_testsent); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 781, __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[4] = {__pyx_t_2, __pyx_kp_u_astronomers_saw_stars_with_teles, __pyx_v_cfg2, __pyx_int_2};
    __pyx_t_5 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 781, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_5);
  } else
  #endif
  #if CYTHON_FAST_PYCCALL
  if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) {
    PyObject *__pyx_temp[4] = {__pyx_t_2, __pyx_kp_u_astronomers_saw_stars_with_teles, __pyx_v_cfg2, __pyx_int_2};
    __pyx_t_5 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_4, 3+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 781, __pyx_L1_error)
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_5);
  } else
  #endif
  {
    __pyx_t_1 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 781, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (__pyx_t_2) {
      __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __pyx_t_2 = NULL;
    }
    __Pyx_INCREF(__pyx_kp_u_astronomers_saw_stars_with_teles);
    __Pyx_GIVEREF(__pyx_kp_u_astronomers_saw_stars_with_teles);
    PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_4, __pyx_kp_u_astronomers_saw_stars_with_teles);
    __Pyx_INCREF(__pyx_v_cfg2);
    __Pyx_GIVEREF(__pyx_v_cfg2);
    PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_4, __pyx_v_cfg2);
    __Pyx_INCREF(__pyx_int_2);
    __Pyx_GIVEREF(__pyx_int_2);
    PyTuple_SET_ITEM(__pyx_t_1, 2+__pyx_t_4, __pyx_int_2);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 781, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 782: 
+783: __all__ = ['CFGChart', 'DenseCFGChart', 'SparseCFGChart', 'parse']
  __pyx_t_3 = PyList_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 783, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_n_u_CFGChart);
  __Pyx_GIVEREF(__pyx_n_u_CFGChart);
  PyList_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_CFGChart);
  __Pyx_INCREF(__pyx_n_u_DenseCFGChart);
  __Pyx_GIVEREF(__pyx_n_u_DenseCFGChart);
  PyList_SET_ITEM(__pyx_t_3, 1, __pyx_n_u_DenseCFGChart);
  __Pyx_INCREF(__pyx_n_u_SparseCFGChart);
  __Pyx_GIVEREF(__pyx_n_u_SparseCFGChart);
  PyList_SET_ITEM(__pyx_t_3, 2, __pyx_n_u_SparseCFGChart);
  __Pyx_INCREF(__pyx_n_u_parse);
  __Pyx_GIVEREF(__pyx_n_u_parse);
  PyList_SET_ITEM(__pyx_t_3, 3, __pyx_n_u_parse);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_t_3) < 0) __PYX_ERR(0, 783, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;