Generated by Cython 0.24

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: fast_recursive_ranker.c

 001: #-*- coding: ISO-8859-1 -*-
 002: # cython: boundscheck = False
 003: # cython: profile = False
 004: 
 005: # http://docs.cython.org/src/reference/compilation.html#compiler-directives
 006: 
 007: # cython - libc
 008: from libc.math cimport log, exp
 009: 
 010: # python standard libs
+011: from collections import defaultdict
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_defaultdict);
  __Pyx_GIVEREF(__pyx_n_s_defaultdict);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_defaultdict);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_collections, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __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_defaultdict); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_defaultdict, __pyx_t_1) < 0) __PYX_ERR(0, 11, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+012: from heapq import heappush, heappushpop
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_heappush);
  __Pyx_GIVEREF(__pyx_n_s_heappush);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_heappush);
  __Pyx_INCREF(__pyx_n_s_heappushpop);
  __Pyx_GIVEREF(__pyx_n_s_heappushpop);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_heappushpop);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_heapq, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_heappush); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_heappush, __pyx_t_2) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_heappushpop); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_heappushpop, __pyx_t_2) < 0) __PYX_ERR(0, 12, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+013: from cherrypy import thread_data
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_thread_data);
  __Pyx_GIVEREF(__pyx_n_s_thread_data);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_thread_data);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_cherrypy, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __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_thread_data); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_thread_data, __pyx_t_1) < 0) __PYX_ERR(0, 13, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 014: 
 015: # keyword search
+016: from DAS.keywordsearch.config import get_setting, DEBUG, K_RESULTS_TO_STORE, \
  __pyx_t_2 = PyList_New(6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_get_setting);
  __Pyx_GIVEREF(__pyx_n_s_get_setting);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_setting);
  __Pyx_INCREF(__pyx_n_s_DEBUG);
  __Pyx_GIVEREF(__pyx_n_s_DEBUG);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_DEBUG);
  __Pyx_INCREF(__pyx_n_s_K_RESULTS_TO_STORE);
  __Pyx_GIVEREF(__pyx_n_s_K_RESULTS_TO_STORE);
  PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_K_RESULTS_TO_STORE);
  __Pyx_INCREF(__pyx_n_s_P_NOT_SPECIFIED_RES_TYPE);
  __Pyx_GIVEREF(__pyx_n_s_P_NOT_SPECIFIED_RES_TYPE);
  PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_P_NOT_SPECIFIED_RES_TYPE);
  __Pyx_INCREF(__pyx_n_s_P_NOT_TAKEN);
  __Pyx_GIVEREF(__pyx_n_s_P_NOT_TAKEN);
  PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_P_NOT_TAKEN);
  __Pyx_INCREF(__pyx_n_s_P_NOT_TAKEN_STOPWORD);
  __Pyx_GIVEREF(__pyx_n_s_P_NOT_TAKEN_STOPWORD);
  PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_P_NOT_TAKEN_STOPWORD);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_config, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_get_setting); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_setting, __pyx_t_2) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_DEBUG); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DEBUG, __pyx_t_2) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_K_RESULTS_TO_STORE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_K_RESULTS_TO_STORE, __pyx_t_2) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_P_NOT_SPECIFIED_RES_TYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_P_NOT_SPECIFIED_RES_TYPE, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_P_NOT_TAKEN); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_P_NOT_TAKEN, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_P_NOT_TAKEN_STOPWORD); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_P_NOT_TAKEN_STOPWORD, __pyx_t_2) < 0) __PYX_ERR(0, 17, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 017:     P_NOT_SPECIFIED_RES_TYPE, P_NOT_TAKEN, P_NOT_TAKEN_STOPWORD
+018: from DAS.keywordsearch.metadata import das_ql
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_das_ql);
  __Pyx_GIVEREF(__pyx_n_s_das_ql);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_das_ql);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_metadata, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __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_das_ql); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_das_ql, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+019: from DAS.keywordsearch.nlp import getstem, filter_stopwords
  __pyx_t_2 = PyList_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_getstem);
  __Pyx_GIVEREF(__pyx_n_s_getstem);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_getstem);
  __Pyx_INCREF(__pyx_n_s_filter_stopwords);
  __Pyx_GIVEREF(__pyx_n_s_filter_stopwords);
  PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_filter_stopwords);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_nlp, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_getstem); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_getstem, __pyx_t_2) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_filter_stopwords); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_filter_stopwords, __pyx_t_2) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+020: from DAS.keywordsearch.tokenizer import get_keyword_without_operator
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_get_keyword_without_operator);
  __Pyx_GIVEREF(__pyx_n_s_get_keyword_without_operator);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_get_keyword_without_operator);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_tokenizer, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __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_get_keyword_without_operator); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_keyword_without_operator, __pyx_t_1) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+021: from DAS.keywordsearch.tokenizer import get_operator_and_param
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_get_operator_and_param);
  __Pyx_GIVEREF(__pyx_n_s_get_operator_and_param);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_get_operator_and_param);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_tokenizer, __pyx_t_2, -1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_get_operator_and_param); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_operator_and_param, __pyx_t_2) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+022: from DAS.keywordsearch.rankers.exceptions import TimeLimitExceeded
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_TimeLimitExceeded);
  __Pyx_GIVEREF(__pyx_n_s_TimeLimitExceeded);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_TimeLimitExceeded);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_DAS_keywordsearch_rankers_except, __pyx_t_1, -1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __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_TimeLimitExceeded); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_TimeLimitExceeded, __pyx_t_1) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 023: 
 024: # Heuristics
 025: # /DoubleMu/Run2012A-Zmmg-13Jul2012-v1xx/RAW-RECO --> dataset
+026: cdef double p_value_as_lookup = 0.80
  __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_p_value_as_lookup = 0.80;
+027: cdef bint TRACE = DEBUG
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 27, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_TRACE = __pyx_t_3;
 028: 
 029: 
 030: # TOOD: this is mainly for backward compatibility
+031: cdef inline double logprob(double score):
static CYTHON_INLINE double __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(double __pyx_v_score) {
  double __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("logprob", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+032:    return log(score) if (score > 0.0) else score
  if (((__pyx_v_score > 0.0) != 0)) {
    __pyx_t_1 = log(__pyx_v_score);
  } else {
    __pyx_t_1 = __pyx_v_score;
  }
  __pyx_r = __pyx_t_1;
  goto __pyx_L0;
 033: 
 034: 
 035: # TODO: disabling debug ("trace" variable) would further improve performance
 036: 
 037: 
+038: def cleanup_values_weights(values_ws):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_1cleanup_values_weights(PyObject *__pyx_self, PyObject *__pyx_v_values_ws); /*proto*/
static char __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_cleanup_values_weights[] = "\n\n    ";
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_1cleanup_values_weights = {"cleanup_values_weights", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_1cleanup_values_weights, METH_O, __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_cleanup_values_weights};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_1cleanup_values_weights(PyObject *__pyx_self, PyObject *__pyx_v_values_ws) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("cleanup_values_weights (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_cleanup_values_weights(__pyx_self, ((PyObject *)__pyx_v_values_ws));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_cleanup_values_weights(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_values_ws) {
  PyObject *__pyx_v_values_ws_ = NULL;
  PyObject *__pyx_v_kw = NULL;
  PyObject *__pyx_v_maps = NULL;
  PyObject *__pyx_v_score = NULL;
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("cleanup_values_weights", 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_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.cleanup_values_weights", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_values_ws_);
  __Pyx_XDECREF(__pyx_v_kw);
  __Pyx_XDECREF(__pyx_v_maps);
  __Pyx_XDECREF(__pyx_v_score);
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__11 = PyTuple_Pack(6, __pyx_n_s_values_ws, __pyx_n_s_values_ws_2, __pyx_n_s_kw, __pyx_n_s_maps, __pyx_n_s_score, __pyx_n_s_m); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_1cleanup_values_weights, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cleanup_values_weights, __pyx_t_2) < 0) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_cleanup_values_weights, 38, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 38, __pyx_L1_error)
 039:     """
 040: 
 041:     """
 042:     # TODO: move this to matchers to simplify code
 043:     # cleanup values weights
+044:     values_ws_ = defaultdict(list)
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_defaultdict); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 44, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)(&PyList_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 44, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(((PyObject *)(&PyList_Type)));
    __Pyx_GIVEREF(((PyObject *)(&PyList_Type)));
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, ((PyObject *)(&PyList_Type)));
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_values_ws_ = __pyx_t_1;
  __pyx_t_1 = 0;
+045:     for kw, maps in values_ws.items():
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_values_ws, __pyx_n_s_items); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(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_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_5 = 0;
    __pyx_t_6 = NULL;
  } else {
    __pyx_t_5 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 45, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 45, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_6)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_5 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 45, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_5 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_5); __Pyx_INCREF(__pyx_t_1); __pyx_t_5++; if (unlikely(0 < 0)) __PYX_ERR(0, 45, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_5); __pyx_t_5++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 45, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_6(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 45, __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_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 45, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_3);
      #else
      __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 45, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 45, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      #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, 45, __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_4 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_4);
      index = 1; __pyx_t_3 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) __PYX_ERR(0, 45, __pyx_L1_error)
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 45, __pyx_L1_error)
      __pyx_L6_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_kw, __pyx_t_4);
    __pyx_t_4 = 0;
    __Pyx_XDECREF_SET(__pyx_v_maps, __pyx_t_3);
    __pyx_t_3 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+046:         for score, m in maps:
    if (likely(PyList_CheckExact(__pyx_v_maps)) || PyTuple_CheckExact(__pyx_v_maps)) {
      __pyx_t_1 = __pyx_v_maps; __Pyx_INCREF(__pyx_t_1); __pyx_t_9 = 0;
      __pyx_t_10 = NULL;
    } else {
      __pyx_t_9 = -1; __pyx_t_1 = PyObject_GetIter(__pyx_v_maps); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_10 = Py_TYPE(__pyx_t_1)->tp_iternext; if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 46, __pyx_L1_error)
    }
    for (;;) {
      if (likely(!__pyx_t_10)) {
        if (likely(PyList_CheckExact(__pyx_t_1))) {
          if (__pyx_t_9 >= PyList_GET_SIZE(__pyx_t_1)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 46, __pyx_L1_error)
          #else
          __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          #endif
        } else {
          if (__pyx_t_9 >= PyTuple_GET_SIZE(__pyx_t_1)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_9); __Pyx_INCREF(__pyx_t_3); __pyx_t_9++; if (unlikely(0 < 0)) __PYX_ERR(0, 46, __pyx_L1_error)
          #else
          __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_9); __pyx_t_9++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_3);
          #endif
        }
      } else {
        __pyx_t_3 = __pyx_t_10(__pyx_t_1);
        if (unlikely(!__pyx_t_3)) {
          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, 46, __pyx_L1_error)
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_3);
      }
      if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) {
        PyObject* sequence = __pyx_t_3;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          __PYX_ERR(0, 46, __pyx_L1_error)
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_4 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_7);
        #else
        __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 46, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_4);
        __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 46, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        #endif
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_11 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 46, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_t_8 = Py_TYPE(__pyx_t_11)->tp_iternext;
        index = 0; __pyx_t_4 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_4)) goto __pyx_L9_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_4);
        index = 1; __pyx_t_7 = __pyx_t_8(__pyx_t_11); if (unlikely(!__pyx_t_7)) goto __pyx_L9_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_7);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_11), 2) < 0) __PYX_ERR(0, 46, __pyx_L1_error)
        __pyx_t_8 = NULL;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        goto __pyx_L10_unpacking_done;
        __pyx_L9_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_8 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        __PYX_ERR(0, 46, __pyx_L1_error)
        __pyx_L10_unpacking_done:;
      }
      __Pyx_XDECREF_SET(__pyx_v_score, __pyx_t_4);
      __pyx_t_4 = 0;
      __Pyx_XDECREF_SET(__pyx_v_m, __pyx_t_7);
      __pyx_t_7 = 0;
/* … */
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+047:             if not isinstance(m, dict):
      __pyx_t_12 = PyDict_Check(__pyx_v_m); 
      __pyx_t_13 = ((!(__pyx_t_12 != 0)) != 0);
      if (__pyx_t_13) {
/* … */
      }
 048:                 m = {
+049:                     'map_to': m,
        __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_map_to, __pyx_v_m) < 0) __PYX_ERR(0, 49, __pyx_L1_error)
        __Pyx_DECREF_SET(__pyx_v_m, __pyx_t_3);
        __pyx_t_3 = 0;
 050:                     # 'adjusted_keyword' # TODO: shall be renamed into _value
 051:                 }
+052:             values_ws_[kw].append((score, m))
      __pyx_t_3 = PyObject_GetItem(__pyx_v_values_ws_, __pyx_v_kw); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 52, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 52, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_INCREF(__pyx_v_score);
      __Pyx_GIVEREF(__pyx_v_score);
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_score);
      __Pyx_INCREF(__pyx_v_m);
      __Pyx_GIVEREF(__pyx_v_m);
      PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_m);
      __pyx_t_14 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_t_7); if (unlikely(__pyx_t_14 == -1)) __PYX_ERR(0, 52, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+053:     return values_ws_
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_values_ws_);
  __pyx_r = __pyx_v_values_ws_;
  goto __pyx_L0;
 054: 
 055: 
+056: cdef class QueryContext:
struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext {
  PyObject_HEAD
  PyObject *schema_ws;
  PyObject *values_ws;
  PyObject *chunks;
  PyObject *kw_list;
  int n_kw;
  int n_kw_uniq_no_stopw;
  clock_t time_limit;
  int time_limit_exceeded;
};

 057:     #char*
 058:     # TODO: context in cpython
 059:     #cdef cmap[string, vector[pair[double, string]]] schema_ws
 060:     cdef dict schema_ws, values_ws, chunks
 061:     cdef list kw_list
 062:     cdef int n_kw
 063:     cdef int n_kw_uniq_no_stopw
 064:     cdef clock_t time_limit
 065:     cdef bint time_limit_exceeded
 066:     #cdef int N_kw_non_stopword
 067:     # TODO: cdef list[bint] is_stopword
 068: 
 069: 
+070:     def __cinit__(self, schema_ws, values_ws, kw_list, chunks, time_limit):
/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12QueryContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12QueryContext_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_schema_ws = 0;
  PyObject *__pyx_v_values_ws = 0;
  PyObject *__pyx_v_kw_list = 0;
  PyObject *__pyx_v_chunks = 0;
  PyObject *__pyx_v_time_limit = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_schema_ws,&__pyx_n_s_values_ws,&__pyx_n_s_kw_list,&__pyx_n_s_chunks,&__pyx_n_s_time_limit,0};
    PyObject* values[5] = {0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_schema_ws)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_values_ws)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 1); __PYX_ERR(0, 70, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kw_list)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 2); __PYX_ERR(0, 70, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_chunks)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 3); __PYX_ERR(0, 70, __pyx_L3_error)
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_time_limit)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, 4); __PYX_ERR(0, 70, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 70, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 5) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
    }
    __pyx_v_schema_ws = values[0];
    __pyx_v_values_ws = values[1];
    __pyx_v_kw_list = values[2];
    __pyx_v_chunks = values[3];
    __pyx_v_time_limit = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 70, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.QueryContext.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12QueryContext___cinit__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *)__pyx_v_self), __pyx_v_schema_ws, __pyx_v_values_ws, __pyx_v_kw_list, __pyx_v_chunks, __pyx_v_time_limit);

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12QueryContext___cinit__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_self, PyObject *__pyx_v_schema_ws, PyObject *__pyx_v_values_ws, PyObject *__pyx_v_kw_list, PyObject *__pyx_v_chunks, PyObject *__pyx_v_time_limit) {
  clock_t __pyx_v_start;
  clock_t __pyx_v_end;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.QueryContext.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+071:         self.schema_ws = dict(schema_ws)
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_schema_ws);
  __Pyx_GIVEREF(__pyx_v_schema_ws);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_schema_ws);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyDict_Type)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 71, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->schema_ws);
  __Pyx_DECREF(__pyx_v_self->schema_ws);
  __pyx_v_self->schema_ws = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+072:         self.values_ws = dict(values_ws)
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_values_ws);
  __Pyx_GIVEREF(__pyx_v_values_ws);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_values_ws);
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&PyDict_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->values_ws);
  __Pyx_DECREF(__pyx_v_self->values_ws);
  __pyx_v_self->values_ws = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+073:         self.kw_list = kw_list
  if (!(likely(PyList_CheckExact(__pyx_v_kw_list))||((__pyx_v_kw_list) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_v_kw_list)->tp_name), 0))) __PYX_ERR(0, 73, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_kw_list;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->kw_list);
  __Pyx_DECREF(__pyx_v_self->kw_list);
  __pyx_v_self->kw_list = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+074:         self.n_kw = len(kw_list)
  __pyx_t_3 = PyObject_Length(__pyx_v_kw_list); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 74, __pyx_L1_error)
  __pyx_v_self->n_kw = __pyx_t_3;
+075:         self.n_kw_uniq_no_stopw = len(filter_stopwords(set(kw_list)))
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_filter_stopwords); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PySet_New(__pyx_v_kw_list); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_5) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 75, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_self->n_kw_uniq_no_stopw = __pyx_t_3;
+076:         self.chunks = dict(chunks)
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_chunks);
  __Pyx_GIVEREF(__pyx_v_chunks);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_chunks);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyDict_Type)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 76, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->chunks);
  __Pyx_DECREF(__pyx_v_self->chunks);
  __pyx_v_self->chunks = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
 077: 
 078:         # calculate max cpu-time after which execution is not allowed
 079:         cdef clock_t start, end
+080:         start = clock()
  __pyx_v_start = clock();
+081:         end = start + CLOCKS_PER_SEC * time_limit
  __pyx_t_2 = __Pyx_PyInt_From_clock_t(__pyx_v_start); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyInt_From_int(CLOCKS_PER_SEC); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = PyNumber_Multiply(__pyx_t_1, __pyx_v_time_limit); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_7 = __Pyx_PyInt_As_clock_t(__pyx_t_1); if (unlikely((__pyx_t_7 == (clock_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 81, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_end = __pyx_t_7;
+082:         self.time_limit = end
  __pyx_v_self->time_limit = __pyx_v_end;
+083:         self.time_limit_exceeded = False
  __pyx_v_self->time_limit_exceeded = 0;
 084: 
 085: 
+086: cdef class PartialSearchResult:
struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult {
  PyObject_HEAD
  struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_vtab;
  PyObject *result_type;
  int result_type_enumerated;
  PyObject *values;
  PyObject *wildcards_set;
  PyObject *params_set;
  PyObject *greps;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_default;
  PyObject *kw_used;
  double score;
  PyObject *trace;
};
/* … */
struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult {
  PyObject *(*init)(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *);
  PyObject *(*reset)(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *, PyObject *, PyObject *, double, struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_reset *__pyx_optional_args);
};
static struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_vtabptr_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult;
 087:     """
 088:     a helper class for storing results.
 089:      each time calling reset() it is re-initialized with the earlier default object
 090:      and can be later overridden.
 091:     """
+092:     cdef public str result_type # lookup, shall be str but get: unicode/str
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->result_type);
  __pyx_r = __pyx_v_self->result_type;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyString_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 92, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->result_type);
  __Pyx_DECREF(__pyx_v_self->result_type);
  __pyx_v_self->result_type = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.result_type.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_11result_type_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->result_type);
  __Pyx_DECREF(__pyx_v_self->result_type);
  __pyx_v_self->result_type = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+093:     cdef public bint result_type_enumerated
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->result_type_enumerated); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 93, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.result_type_enumerated.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_22result_type_enumerated_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 93, __pyx_L1_error)
  __pyx_v_self->result_type_enumerated = __pyx_t_1;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.result_type_enumerated.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+094:     cdef public dict values
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->values);
  __pyx_r = __pyx_v_self->values;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 94, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->values);
  __Pyx_DECREF(__pyx_v_self->values);
  __pyx_v_self->values = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.values.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_6values_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->values);
  __Pyx_DECREF(__pyx_v_self->values);
  __pyx_v_self->values = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+095:     cdef public set wildcards_set, params_set
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->wildcards_set);
  __pyx_r = __pyx_v_self->wildcards_set;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 95, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->wildcards_set);
  __Pyx_DECREF(__pyx_v_self->wildcards_set);
  __pyx_v_self->wildcards_set = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.wildcards_set.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_13wildcards_set_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->wildcards_set);
  __Pyx_DECREF(__pyx_v_self->wildcards_set);
  __pyx_v_self->wildcards_set = ((PyObject*)Py_None);

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

/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->params_set);
  __pyx_r = __pyx_v_self->params_set;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 95, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->params_set);
  __Pyx_DECREF(__pyx_v_self->params_set);
  __pyx_v_self->params_set = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.params_set.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_10params_set_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->params_set);
  __Pyx_DECREF(__pyx_v_self->params_set);
  __pyx_v_self->params_set = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+096:     cdef public list greps
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->greps);
  __pyx_r = __pyx_v_self->greps;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyList_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 96, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->greps);
  __Pyx_DECREF(__pyx_v_self->greps);
  __pyx_v_self->greps = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.greps.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5greps_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->greps);
  __Pyx_DECREF(__pyx_v_self->greps);
  __pyx_v_self->greps = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 097:     cdef PartialSearchResult default
+098:     cdef public set kw_used # TODO: shall it be set instead?
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->kw_used);
  __pyx_r = __pyx_v_self->kw_used;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PySet_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 98, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->kw_used);
  __Pyx_DECREF(__pyx_v_self->kw_used);
  __pyx_v_self->kw_used = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.kw_used.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_7kw_used_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->kw_used);
  __Pyx_DECREF(__pyx_v_self->kw_used);
  __pyx_v_self->kw_used = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+099:     cdef public double score
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->score); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 99, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.score.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5score_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __pyx_t_1 = __pyx_PyFloat_AsDouble(__pyx_v_value); if (unlikely((__pyx_t_1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 99, __pyx_L1_error)
  __pyx_v_self->score = __pyx_t_1;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.score.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+100:     cdef public list trace
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->trace);
  __pyx_r = __pyx_v_self->trace;
  goto __pyx_L0;

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

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_2__set__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), ((PyObject *)__pyx_v_value));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_2__set__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyList_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 100, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->trace);
  __Pyx_DECREF(__pyx_v_self->trace);
  __pyx_v_self->trace = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.trace.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_4__del__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_5trace_4__del__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->trace);
  __Pyx_DECREF(__pyx_v_self->trace);
  __pyx_v_self->trace = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 101: 
+102:     cdef public inline init(self, PartialSearchResult d):
CYTHON_INLINE PyObject *__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_init(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_d) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("init", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.init", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+103:         if d:
  __pyx_t_1 = __Pyx_PyObject_IsTrue(((PyObject *)__pyx_v_d)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 103, __pyx_L1_error)
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+104:             self.result_type = d.result_type
    __pyx_t_2 = __pyx_v_d->result_type;
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->result_type);
    __Pyx_DECREF(__pyx_v_self->result_type);
    __pyx_v_self->result_type = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+105:             self.result_type_enumerated = d.result_type_enumerated
    __pyx_t_1 = __pyx_v_d->result_type_enumerated;
    __pyx_v_self->result_type_enumerated = __pyx_t_1;
+106:             self.greps = d.greps[:]
    if (unlikely(__pyx_v_d->greps == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 106, __pyx_L1_error)
    }
    __pyx_t_2 = __Pyx_PyList_GetSlice(__pyx_v_d->greps, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->greps);
    __Pyx_DECREF(__pyx_v_self->greps);
    __pyx_v_self->greps = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+107:             self.kw_used = d.kw_used.copy()
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_d->kw_used, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 107, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (!(likely(PySet_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 107, __pyx_L1_error)
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->kw_used);
    __Pyx_DECREF(__pyx_v_self->kw_used);
    __pyx_v_self->kw_used = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+108:             self.score = d.score
    __pyx_t_5 = __pyx_v_d->score;
    __pyx_v_self->score = __pyx_t_5;
+109:             self.trace = d.trace[:]
    if (unlikely(__pyx_v_d->trace == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 109, __pyx_L1_error)
    }
    __pyx_t_2 = __Pyx_PyList_GetSlice(__pyx_v_d->trace, 0, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->trace);
    __Pyx_DECREF(__pyx_v_self->trace);
    __pyx_v_self->trace = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+110:             self.values = d.values.copy()
    if (unlikely(__pyx_v_d->values == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "copy");
      __PYX_ERR(0, 110, __pyx_L1_error)
    }
    __pyx_t_2 = PyDict_Copy(__pyx_v_d->values); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 110, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->values);
    __Pyx_DECREF(__pyx_v_self->values);
    __pyx_v_self->values = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
 111: 
+112:             self.wildcards_set = d.wildcards_set.copy()
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_d->wildcards_set, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 112, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 112, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (!(likely(PySet_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 112, __pyx_L1_error)
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->wildcards_set);
    __Pyx_DECREF(__pyx_v_self->wildcards_set);
    __pyx_v_self->wildcards_set = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+113:             self.params_set  = d.params_set.copy()
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_d->params_set, __pyx_n_s_copy); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 113, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 113, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (!(likely(PySet_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 113, __pyx_L1_error)
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->params_set);
    __Pyx_DECREF(__pyx_v_self->params_set);
    __pyx_v_self->params_set = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
 114:         else:
+115:             self.result_type = ''
  /*else*/ {
    __Pyx_INCREF(__pyx_kp_s_iso88591_);
    __Pyx_GIVEREF(__pyx_kp_s_iso88591_);
    __Pyx_GOTREF(__pyx_v_self->result_type);
    __Pyx_DECREF(__pyx_v_self->result_type);
    __pyx_v_self->result_type = __pyx_kp_s_iso88591_;
+116:             self.result_type_enumerated = False
    __pyx_v_self->result_type_enumerated = 0;
+117:             self.values = {}
    __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 117, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->values);
    __Pyx_DECREF(__pyx_v_self->values);
    __pyx_v_self->values = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+118:             self.greps = []
    __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->greps);
    __Pyx_DECREF(__pyx_v_self->greps);
    __pyx_v_self->greps = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+119:             self.kw_used = set()
    __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 119, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->kw_used);
    __Pyx_DECREF(__pyx_v_self->kw_used);
    __pyx_v_self->kw_used = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+120:             self.score = 0.0
    __pyx_v_self->score = 0.0;
+121:             self.trace = []
    __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 121, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->trace);
    __Pyx_DECREF(__pyx_v_self->trace);
    __pyx_v_self->trace = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
 122: 
+123:             self.wildcards_set = set()
    __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 123, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->wildcards_set);
    __Pyx_DECREF(__pyx_v_self->wildcards_set);
    __pyx_v_self->wildcards_set = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+124:             self.params_set  = set()
    __pyx_t_2 = PySet_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->params_set);
    __Pyx_DECREF(__pyx_v_self->params_set);
    __pyx_v_self->params_set = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
  }
  __pyx_L3:;
 125: 
 126: 
+127:     def __cinit__(self, PartialSearchResult d):
/* Python wrapper */
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_d = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_d,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) __PYX_ERR(0, 127, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_d = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)values[0]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 127, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_d), __pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult, 1, "d", 0))) __PYX_ERR(0, 127, __pyx_L1_error)
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult___cinit__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self), __pyx_v_d);

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

static int __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult___cinit__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_d) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__", 0);
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 128:         # TODO: empty strngs in cython
+129:         self.init(d)
  __pyx_t_1 = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_init(__pyx_v_self, __pyx_v_d); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+130:         self.default = d
  __Pyx_INCREF(((PyObject *)__pyx_v_d));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_d));
  __Pyx_GOTREF(__pyx_v_self->__pyx_default);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->__pyx_default));
  __pyx_v_self->__pyx_default = __pyx_v_d;
 131: 
+132:     def __str__(self):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_3__str__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_3__str__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_2__str__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_2__str__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+133:         return str((self.result_type, self.values))
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_self->result_type);
  __Pyx_GIVEREF(__pyx_v_self->result_type);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->result_type);
  __Pyx_INCREF(__pyx_v_self->values);
  __Pyx_GIVEREF(__pyx_v_self->values);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->values);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 133, __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(((PyObject *)(&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;
 134: 
 135:     # TODO: maybe multipe ops,e.g.:
 136:     # addGrep
 137:     # addInput
 138:     # addValue
+139:     cdef reset(self, act, new_kw, double delta_score, field=None,
static PyObject *__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_reset(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_self, PyObject *__pyx_v_act, PyObject *__pyx_v_new_kw, double __pyx_v_delta_score, struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_reset *__pyx_optional_args) {
  PyObject *__pyx_v_field = ((PyObject *)Py_None);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.PartialSearchResult.reset", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_upd);
  __Pyx_XDECREF(__pyx_v_kw);
  __Pyx_XDECREF(__pyx_v_t);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_reset {
  int __pyx_n;
  PyObject *field;
  PyObject *new_value;
  PyObject *add_grep;
  PyObject *grep_req_kwds;
};
+140:                 new_value=None, add_grep=None, list grep_req_kwds=None):
  PyObject *__pyx_v_new_value = ((PyObject *)Py_None);
  PyObject *__pyx_v_add_grep = ((PyObject *)Py_None);
  PyObject *__pyx_v_grep_req_kwds = ((PyObject*)Py_None);
  int __pyx_v__DEBUG_DETAIL;
  PyObject *__pyx_v_upd = NULL;
  PyObject *__pyx_v_kw = NULL;
  PyObject *__pyx_v_t = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("reset", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_field = __pyx_optional_args->field;
      if (__pyx_optional_args->__pyx_n > 1) {
        __pyx_v_new_value = __pyx_optional_args->new_value;
        if (__pyx_optional_args->__pyx_n > 2) {
          __pyx_v_add_grep = __pyx_optional_args->add_grep;
          if (__pyx_optional_args->__pyx_n > 3) {
            __pyx_v_grep_req_kwds = __pyx_optional_args->grep_req_kwds;
          }
        }
      }
    }
  }
+141:         cdef bint _DEBUG_DETAIL = True
  __pyx_v__DEBUG_DETAIL = 1;
 142: 
+143:         self.init(self.default)
  __pyx_t_1 = ((PyObject *)__pyx_v_self->__pyx_default);
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19PartialSearchResult_init(__pyx_v_self, ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 144: 
+145:         upd = field
  __Pyx_INCREF(__pyx_v_field);
  __pyx_v_upd = __pyx_v_field;
 146: 
+147:         if field and (act =='lookup' or act == 'lookup-enum'):
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_field); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 147, __pyx_L1_error)
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_act, __pyx_n_s_iso88591_lookup, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 147, __pyx_L1_error)
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_act, __pyx_kp_s_iso88591_lookup_enum, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 147, __pyx_L1_error)
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_3) {
/* … */
  }
+148:             self.result_type = str(field)
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_field);
    __Pyx_GIVEREF(__pyx_v_field);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_field);
    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (!(likely(PyString_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(0, 148, __pyx_L1_error)
    __Pyx_GIVEREF(__pyx_t_1);
    __Pyx_GOTREF(__pyx_v_self->result_type);
    __Pyx_DECREF(__pyx_v_self->result_type);
    __pyx_v_self->result_type = ((PyObject*)__pyx_t_1);
    __pyx_t_1 = 0;
+149:             if act == 'lookup-enum':
    __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_act, __pyx_kp_s_iso88591_lookup_enum, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 149, __pyx_L1_error)
    if (__pyx_t_3) {
/* … */
    }
+150:                 self.result_type_enumerated = True
      __pyx_v_self->result_type_enumerated = 1;
+151:             upd = field
    __Pyx_INCREF(__pyx_v_field);
    __Pyx_DECREF_SET(__pyx_v_upd, __pyx_v_field);
 152: 
+153:         if act == 'val+result_type':
  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_act, __pyx_kp_s_iso88591_val_result_type, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 153, __pyx_L1_error)
  if (__pyx_t_3) {
/* … */
  }
+154:             self.result_type = str(field)
    __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 154, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_field);
    __Pyx_GIVEREF(__pyx_v_field);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_field);
    __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 154, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 154, __pyx_L1_error)
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_self->result_type);
    __Pyx_DECREF(__pyx_v_self->result_type);
    __pyx_v_self->result_type = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+155:             self.result_type_enumerated = False
    __pyx_v_self->result_type_enumerated = 0;
 156: 
 157: 
+158:         if new_kw:
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_new_kw); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 158, __pyx_L1_error)
  if (__pyx_t_3) {
/* … */
  }
+159:             self.kw_used.add(new_kw)
    if (unlikely(__pyx_v_self->kw_used == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add");
      __PYX_ERR(0, 159, __pyx_L1_error)
    }
    __pyx_t_5 = PySet_Add(__pyx_v_self->kw_used, __pyx_v_new_kw); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 159, __pyx_L1_error)
 160: 
 161: 
+162:         if act == 'grep' and add_grep and grep_req_kwds:
  __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_v_act, __pyx_n_s_iso88591_grep, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 162, __pyx_L1_error)
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_add_grep); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 162, __pyx_L1_error)
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L11_bool_binop_done;
  }
  __pyx_t_4 = (__pyx_v_grep_req_kwds != Py_None) && (PyList_GET_SIZE(__pyx_v_grep_req_kwds) != 0);
  __pyx_t_3 = __pyx_t_4;
  __pyx_L11_bool_binop_done:;
  if (__pyx_t_3) {
/* … */
  }
+163:             upd = str(add_grep)
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 163, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_add_grep);
    __Pyx_GIVEREF(__pyx_v_add_grep);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_add_grep);
    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 163, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_upd, __pyx_t_1);
    __pyx_t_1 = 0;
 164: 
+165:             self.greps.append(add_grep)
    if (unlikely(__pyx_v_self->greps == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append");
      __PYX_ERR(0, 165, __pyx_L1_error)
    }
    __pyx_t_5 = __Pyx_PyList_Append(__pyx_v_self->greps, __pyx_v_add_grep); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 165, __pyx_L1_error)
+166:             for kw in grep_req_kwds:
    if (unlikely(__pyx_v_grep_req_kwds == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
      __PYX_ERR(0, 166, __pyx_L1_error)
    }
    __pyx_t_1 = __pyx_v_grep_req_kwds; __Pyx_INCREF(__pyx_t_1); __pyx_t_6 = 0;
    for (;;) {
      if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_1)) break;
      #if CYTHON_COMPILING_IN_CPYTHON
      __pyx_t_2 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_6); __Pyx_INCREF(__pyx_t_2); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 166, __pyx_L1_error)
      #else
      __pyx_t_2 = PySequence_ITEM(__pyx_t_1, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 166, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      #endif
      __Pyx_XDECREF_SET(__pyx_v_kw, __pyx_t_2);
      __pyx_t_2 = 0;
/* … */
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+167:                 self.kw_used.add(kw)
      if (unlikely(__pyx_v_self->kw_used == Py_None)) {
        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add");
        __PYX_ERR(0, 167, __pyx_L1_error)
      }
      __pyx_t_5 = PySet_Add(__pyx_v_self->kw_used, __pyx_v_kw); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 167, __pyx_L1_error)
 168: 
 169: 
+170:         if delta_score is not None:
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_delta_score); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 170, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = (__pyx_t_1 != Py_None);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {
/* … */
  }
+171:             self.score += delta_score
    __pyx_v_self->score = (__pyx_v_self->score + __pyx_v_delta_score);
 172: 
+173:         if field and new_value:
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_field); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 173, __pyx_L1_error)
  if (__pyx_t_3) {
  } else {
    __pyx_t_4 = __pyx_t_3;
    goto __pyx_L18_bool_binop_done;
  }
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_new_value); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 173, __pyx_L1_error)
  __pyx_t_4 = __pyx_t_3;
  __pyx_L18_bool_binop_done:;
  if (__pyx_t_4) {
/* … */
  }
 174:             # TODO: or we could modify the var only if needed
+175:             self.values[field] = new_value
    if (unlikely(__pyx_v_self->values == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 175, __pyx_L1_error)
    }
    if (unlikely(PyDict_SetItem(__pyx_v_self->values, __pyx_v_field, __pyx_v_new_value) < 0)) __PYX_ERR(0, 175, __pyx_L1_error)
+176:             self.params_set.add(field)
    if (unlikely(__pyx_v_self->params_set == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add");
      __PYX_ERR(0, 176, __pyx_L1_error)
    }
    __pyx_t_5 = PySet_Add(__pyx_v_self->params_set, __pyx_v_field); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 176, __pyx_L1_error)
+177:             if '*' in new_value:
    __pyx_t_4 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591__2, __pyx_v_new_value, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 177, __pyx_L1_error)
    __pyx_t_3 = (__pyx_t_4 != 0);
    if (__pyx_t_3) {
/* … */
    }
+178:                 self.wildcards_set.add(field)
      if (unlikely(__pyx_v_self->wildcards_set == Py_None)) {
        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "add");
        __PYX_ERR(0, 178, __pyx_L1_error)
      }
      __pyx_t_5 = PySet_Add(__pyx_v_self->wildcards_set, __pyx_v_field); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 178, __pyx_L1_error)
+179:             upd = '%s=%s' % (field, new_value)
    __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 179, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_field);
    __Pyx_GIVEREF(__pyx_v_field);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_field);
    __Pyx_INCREF(__pyx_v_new_value);
    __Pyx_GIVEREF(__pyx_v_new_value);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_new_value);
    __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_iso88591_s_s, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 179, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF_SET(__pyx_v_upd, __pyx_t_2);
    __pyx_t_2 = 0;
 180: 
 181:         # disable extensive trace in production as it's not shown to users...
+182:         if TRACE:
  __pyx_t_3 = (__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_TRACE != 0);
  if (__pyx_t_3) {
/* … */
  }
+183:             if _DEBUG_DETAIL:
    __pyx_t_3 = (__pyx_v__DEBUG_DETAIL != 0);
    if (__pyx_t_3) {
/* … */
    }
+184:                 upd += "; params: %s;       kw_used: %s, no rt: %s, sc: %.2f" % \
      __pyx_t_8 = __Pyx_PyString_Format(__pyx_kp_s_iso88591_params_s_kw_used_s_no_rt_s_sc_2, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 184, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_9 = PyNumber_InPlaceAdd(__pyx_v_upd, __pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 184, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF_SET(__pyx_v_upd, __pyx_t_9);
      __pyx_t_9 = 0;
+185:                        (str(self.params_set),
      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 185, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_self->params_set);
      __Pyx_GIVEREF(__pyx_v_self->params_set);
      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->params_set);
      __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 185, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
      __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 185, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_GIVEREF(__pyx_t_1);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_1);
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_8);
      __pyx_t_1 = 0;
      __pyx_t_7 = 0;
      __pyx_t_2 = 0;
      __pyx_t_8 = 0;
+186:                         str(self.kw_used),
      __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 186, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_self->kw_used);
      __Pyx_GIVEREF(__pyx_v_self->kw_used);
      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->kw_used);
      __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_2, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 186, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+187:                         str(self.result_type_enumerated),
      __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_v_self->result_type_enumerated); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_8 = PyTuple_New(1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 187, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
+188:                         self.score
      __pyx_t_8 = PyFloat_FromDouble(__pyx_v_self->score); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 188, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
 189:                         )
+190:             t = (new_kw, act, upd, '%.2f' % exp(delta_score))
    __pyx_t_9 = PyFloat_FromDouble(exp(__pyx_v_delta_score)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 190, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_8 = __Pyx_PyString_Format(__pyx_kp_s_iso88591_2f, __pyx_t_9); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 190, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_9 = PyTuple_New(4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 190, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_v_new_kw);
    __Pyx_GIVEREF(__pyx_v_new_kw);
    PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_v_new_kw);
    __Pyx_INCREF(__pyx_v_act);
    __Pyx_GIVEREF(__pyx_v_act);
    PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_v_act);
    __Pyx_INCREF(__pyx_v_upd);
    __Pyx_GIVEREF(__pyx_v_upd);
    PyTuple_SET_ITEM(__pyx_t_9, 2, __pyx_v_upd);
    __Pyx_GIVEREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_9, 3, __pyx_t_8);
    __pyx_t_8 = 0;
    __pyx_v_t = ((PyObject*)__pyx_t_9);
    __pyx_t_9 = 0;
+191:             self.trace.append(t)
    if (unlikely(__pyx_v_self->trace == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append");
      __PYX_ERR(0, 191, __pyx_L1_error)
    }
    __pyx_t_5 = __Pyx_PyList_Append(__pyx_v_self->trace, __pyx_v_t); if (unlikely(__pyx_t_5 == -1)) __PYX_ERR(0, 191, __pyx_L1_error)
 192: 
+193:         return self
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;
 194: 
 195: 
 196: 
 197:     #object *aggregations
 198: 
 199: # INITIALIZATION
 200: 
 201: 
 202: #ctypedef cset[string] ApiParamSet
 203: #ctypedef pair[ApiParamList, ApiParamList] ApiParamDefinition
 204: 
 205: # Construct the C-Style List of Api Parameter declarations
 206: 
 207: 
 208: # TODO: for now using just plain python types
+209: cdef class ApiParamDefinition:
struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition {
  PyObject_HEAD
  PyObject *api_params_set;
  PyObject *req_params;
  PyObject *lookup;
};

+210:     cdef readonly frozenset api_params_set, req_params
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_14api_params_set_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_14api_params_set_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_14api_params_set___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_14api_params_set___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->api_params_set);
  __pyx_r = __pyx_v_self->api_params_set;
  goto __pyx_L0;

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

/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_10req_params_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_10req_params_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_10req_params___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_10req_params___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->req_params);
  __pyx_r = __pyx_v_self->req_params;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+211:     cdef readonly str lookup
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_6lookup_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_6lookup_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_6lookup___get__(((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *)__pyx_v_self));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_18ApiParamDefinition_6lookup___get__(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->lookup);
  __pyx_r = __pyx_v_self->lookup;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 212: 
+213: cpdef ApiParamDefinition create_api_param_definition(frozenset api_params_set, frozenset req_params, str lookup):
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_3create_api_param_definition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_create_api_param_definition(PyObject *__pyx_v_api_params_set, PyObject *__pyx_v_req_params, PyObject *__pyx_v_lookup, CYTHON_UNUSED int __pyx_skip_dispatch) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_v_inst = 0;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("create_api_param_definition", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.create_api_param_definition", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_inst);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_3create_api_param_definition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_3create_api_param_definition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_api_params_set = 0;
  PyObject *__pyx_v_req_params = 0;
  PyObject *__pyx_v_lookup = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("create_api_param_definition (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_api_params_set,&__pyx_n_s_req_params,&__pyx_n_s_lookup,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_api_params_set)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_req_params)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("create_api_param_definition", 1, 3, 3, 1); __PYX_ERR(0, 213, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lookup)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("create_api_param_definition", 1, 3, 3, 2); __PYX_ERR(0, 213, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "create_api_param_definition") < 0)) __PYX_ERR(0, 213, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_api_params_set = ((PyObject*)values[0]);
    __pyx_v_req_params = ((PyObject*)values[1]);
    __pyx_v_lookup = ((PyObject*)values[2]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("create_api_param_definition", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 213, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.create_api_param_definition", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_api_params_set), (&PyFrozenSet_Type), 1, "api_params_set", 1))) __PYX_ERR(0, 213, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_req_params), (&PyFrozenSet_Type), 1, "req_params", 1))) __PYX_ERR(0, 213, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_lookup), (&PyString_Type), 1, "lookup", 1))) __PYX_ERR(0, 213, __pyx_L1_error)
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_2create_api_param_definition(__pyx_self, __pyx_v_api_params_set, __pyx_v_req_params, __pyx_v_lookup);

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_2create_api_param_definition(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_api_params_set, PyObject *__pyx_v_req_params, PyObject *__pyx_v_lookup) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("create_api_param_definition", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((PyObject *)__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_create_api_param_definition(__pyx_v_api_params_set, __pyx_v_req_params, __pyx_v_lookup, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.create_api_param_definition", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+214:         cdef ApiParamDefinition inst = ApiParamDefinition.__new__(ApiParamDefinition)
  __pyx_t_1 = __pyx_tp_new_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition(((PyTypeObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 214, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!(likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition)))) __PYX_ERR(0, 214, __pyx_L1_error)
  __pyx_v_inst = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *)__pyx_t_1);
  __pyx_t_1 = 0;
+215:         inst.api_params_set = api_params_set
  __Pyx_INCREF(__pyx_v_api_params_set);
  __Pyx_GIVEREF(__pyx_v_api_params_set);
  __Pyx_GOTREF(__pyx_v_inst->api_params_set);
  __Pyx_DECREF(__pyx_v_inst->api_params_set);
  __pyx_v_inst->api_params_set = __pyx_v_api_params_set;
+216:         inst.req_params = req_params
  __Pyx_INCREF(__pyx_v_req_params);
  __Pyx_GIVEREF(__pyx_v_req_params);
  __Pyx_GOTREF(__pyx_v_inst->req_params);
  __Pyx_DECREF(__pyx_v_inst->req_params);
  __pyx_v_inst->req_params = __pyx_v_req_params;
+217:         inst.lookup = lookup
  __Pyx_INCREF(__pyx_v_lookup);
  __Pyx_GIVEREF(__pyx_v_lookup);
  __Pyx_GOTREF(__pyx_v_inst->lookup);
  __Pyx_DECREF(__pyx_v_inst->lookup);
  __pyx_v_inst->lookup = __pyx_v_lookup;
+218:         return inst
  __Pyx_XDECREF(((PyObject *)__pyx_r));
  __Pyx_INCREF(((PyObject *)__pyx_v_inst));
  __pyx_r = __pyx_v_inst;
  goto __pyx_L0;
 219: 
 220: # GLOBALS
 221: #cdef clist[char*] lookup_keys = schema.lookup_keys
 222: #cdef vector[ApiParamDefinition] api_definitions = vector[ApiParamDefinition]()
+223: cdef list api_definitions = list()
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 223, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions, ((PyObject*)__pyx_t_2));
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
+224: cdef list lookup_keys = list()
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 224, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys, ((PyObject*)__pyx_t_2));
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
 225: 
 226: 
+227: def initialize_ranker(schema):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_5initialize_ranker(PyObject *__pyx_self, PyObject *__pyx_v_schema); /*proto*/
static char __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_4initialize_ranker[] = " initialize the ranker: update cached data (cython) ";
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_5initialize_ranker = {"initialize_ranker", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_5initialize_ranker, METH_O, __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_4initialize_ranker};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_5initialize_ranker(PyObject *__pyx_self, PyObject *__pyx_v_schema) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("initialize_ranker (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_4initialize_ranker(__pyx_self, ((PyObject *)__pyx_v_schema));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_4initialize_ranker(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_schema) {
  PyObject *__pyx_v_api_params = NULL;
  PyObject *__pyx_v_req_params = NULL;
  PyObject *__pyx_v_lookup = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("initialize_ranker", 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_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.initialize_ranker", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_api_params);
  __Pyx_XDECREF(__pyx_v_req_params);
  __Pyx_XDECREF(__pyx_v_lookup);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__13 = PyTuple_Pack(4, __pyx_n_s_schema, __pyx_n_s_api_params, __pyx_n_s_req_params, __pyx_n_s_lookup); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 227, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_5initialize_ranker, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 227, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_initialize_ranker, __pyx_t_2) < 0) __PYX_ERR(0, 227, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(1, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_initialize_ranker, 227, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 227, __pyx_L1_error)
 228:     """ initialize the ranker: update cached data (cython) """
 229:     global lookup_keys, api_definitions
+230:     lookup_keys = schema.lookup_keys
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_schema, __pyx_n_s_lookup_keys); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 230, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (!(likely(PyList_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(0, 230, __pyx_L1_error)
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys, ((PyObject*)__pyx_t_1));
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
+231:     api_definitions = list()
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 231, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions, ((PyObject*)__pyx_t_1));
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
+232:     for api_params, req_params, lookup in schema.get_api_param_definitions():
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_schema, __pyx_n_s_get_api_param_definitions); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 232, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && 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, 232, __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, 232, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_4 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 232, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 232, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 232, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 232, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_4); __Pyx_INCREF(__pyx_t_1); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 232, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 232, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_5(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 232, __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_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 3)) {
        if (size > 3) __Pyx_RaiseTooManyValuesError(3);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 232, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 2); 
      } else {
        __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
        __pyx_t_7 = PyList_GET_ITEM(sequence, 2); 
      }
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_7);
      #else
      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 232, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 232, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 232, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_8 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 232, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
      index = 0; __pyx_t_3 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      index = 1; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      index = 2; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_7);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 3) < 0) __PYX_ERR(0, 232, __pyx_L1_error)
      __pyx_t_9 = NULL;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_9 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 232, __pyx_L1_error)
      __pyx_L6_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_api_params, __pyx_t_3);
    __pyx_t_3 = 0;
    __Pyx_XDECREF_SET(__pyx_v_req_params, __pyx_t_6);
    __pyx_t_6 = 0;
    __Pyx_XDECREF_SET(__pyx_v_lookup, __pyx_t_7);
    __pyx_t_7 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+233:         api_definitions.append(create_api_param_definition(
    if (unlikely(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "append");
      __PYX_ERR(0, 233, __pyx_L1_error)
    }
/* … */
    __pyx_t_6 = ((PyObject *)__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_create_api_param_definition(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_7), ((PyObject*)__pyx_t_3), 0)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 233, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions, __pyx_t_6); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 233, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+234:                                    api_params_set=frozenset(api_params),
    __pyx_t_1 = __Pyx_PyFrozenSet_New(__pyx_v_api_params); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
+235:                                    req_params=frozenset(req_params),
    __pyx_t_7 = __Pyx_PyFrozenSet_New(__pyx_v_req_params); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 235, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
+236:                                    lookup=str(lookup)))
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 236, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_v_lookup);
    __Pyx_GIVEREF(__pyx_v_lookup);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_lookup);
    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (!(likely(PyString_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 236, __pyx_L1_error)
 237: 
 238: 
 239: #inline
+240: cdef  bint are_wildcards_allowed(str entity,  set wildcards, set params):
static int __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_are_wildcards_allowed(PyObject *__pyx_v_entity, PyObject *__pyx_v_wildcards, PyObject *__pyx_v_params) {
  int __pyx_v_ok;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("are_wildcards_allowed", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.are_wildcards_allowed", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 241:         """
 242:         Whether wildcards are allowed for given inputs
 243: 
 244:         currently only these simple rules allowed:
 245:         site=W*
 246:         dataset=W*
 247:         dataset site=T1_CH_*
 248:         dataset site=T1_CH_* dataset=/BprimeBprimeToBZBZinc_M-375_7TeV-madgraph/Summer11-START311_V2-v3/GEN
 249:         file dataset=/DoubleMu/Run2012A-Zmmg-13Jul2012-v1/RAW-RECO site=T1_*
 250:         file block=/DoubleMu/Run2012A-Zmmg-13Jul2012-v1/RAW-RECO#b45f3476-cfb6-11e1-bb62-00221959e69e
 251:         file file=W* dataset=FULL
 252:         file file=W* block=FULL
 253: 
 254:         # these are supported (probably) because of DAS-wrappers
 255:         file dataset=*DoubleMuParked25ns*
 256:         file dataset=*DoubleMuParked25ns* site=T2_RU_JINR
 257:         """
 258:         # TODO: shall we allow params not defined in the rules?
+259:         cdef bint ok = True
  __pyx_v_ok = 1;
+260:         if not wildcards or not entity:
  __pyx_t_2 = (__pyx_v_wildcards != Py_None) && (PySet_GET_SIZE(__pyx_v_wildcards) != 0);
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (!__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_entity); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 260, __pyx_L1_error)
  __pyx_t_2 = ((!__pyx_t_3) != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+261:             return True
    __pyx_r = 1;
    goto __pyx_L0;
 262: 
 263:         # TODO: how to compare cset's?
 264: 
+265:         if entity == 'dataset' and wildcards == set(['dataset.name',]):
  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_dataset, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 265, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L7_bool_binop_done;
  }
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_dataset_name) < 0) __PYX_ERR(0, 265, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = __pyx_t_3;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
 266:             pass
+267:         elif entity == 'file' and wildcards == set(['file.name',]) and \
  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_file, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 267, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_5 = PySet_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 267, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_file_name) < 0) __PYX_ERR(0, 267, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 267, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 267, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L9_bool_binop_done;
  }
/* … */
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
+268:                 ('dataset.name' in params or 'block.name' in params):
  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591_dataset_name, __pyx_v_params, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 268, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (!__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591_block_name, __pyx_v_params, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 268, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  __pyx_t_1 = __pyx_t_2;
  __pyx_L9_bool_binop_done:;
 269:             pass
+270:         elif entity == 'file' and wildcards == set(['site.name',]) and \
  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_file, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 270, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L13_bool_binop_done;
  }
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 270, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L13_bool_binop_done;
  }
/* … */
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
+271:                 ('dataset.name' in params or 'block.name' in params):
  __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591_dataset_name, __pyx_v_params, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 271, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L13_bool_binop_done;
  }
  __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591_block_name, __pyx_v_params, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 271, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L13_bool_binop_done:;
 272:             pass
+273:         elif entity == 'site' and wildcards == set(['site.name',]):
  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_site, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 273, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L17_bool_binop_done;
  }
  __pyx_t_5 = PySet_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 273, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = __pyx_t_2;
  __pyx_L17_bool_binop_done:;
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
 274:             pass
+275:         elif entity == 'dataset' and wildcards == set(['site.name',]):
  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_dataset, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 275, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L19_bool_binop_done;
  }
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 275, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 275, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 275, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 275, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = __pyx_t_3;
  __pyx_L19_bool_binop_done:;
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
 276:             pass
+277:         elif entity == 'dataset' and wildcards == set(['dataset.name', 'site.name']):
  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_dataset, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 277, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L21_bool_binop_done;
  }
  __pyx_t_5 = PySet_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_dataset_name) < 0) __PYX_ERR(0, 277, __pyx_L1_error)
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 277, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = __pyx_t_2;
  __pyx_L21_bool_binop_done:;
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
 278:             pass
+279:         elif entity == 'dataset' and wildcards <= set (['dataset.name', 'release.name']):
  __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_dataset, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 279, __pyx_L1_error)
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L23_bool_binop_done;
  }
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 279, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_dataset_name) < 0) __PYX_ERR(0, 279, __pyx_L1_error)
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_release_name) < 0) __PYX_ERR(0, 279, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_LE); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 279, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 279, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = __pyx_t_3;
  __pyx_L23_bool_binop_done:;
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
 280:             pass
 281:         # these are supported (probably) because of DAS-wrapper
+282:         elif entity == 'file' and (
  __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_entity, __pyx_n_s_iso88591_file, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 282, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L25_bool_binop_done;
  }
/* … */
  if (__pyx_t_1) {
    goto __pyx_L6;
  }
+283:                 wildcards == set(['site.name', 'dataset.name']) or
  __pyx_t_5 = PySet_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 283, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 283, __pyx_L1_error)
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_dataset_name) < 0) __PYX_ERR(0, 283, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 283, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 283, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L25_bool_binop_done;
  }
+284:                 wildcards == set(['site.name', 'block.name']) or
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 284, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_site_name) < 0) __PYX_ERR(0, 284, __pyx_L1_error)
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_block_name) < 0) __PYX_ERR(0, 284, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 284, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 284, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L25_bool_binop_done;
  }
+285:                 wildcards == set(['dataset.name']) or
  __pyx_t_5 = PySet_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 285, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (PySet_Add(__pyx_t_5, __pyx_kp_s_iso88591_dataset_name) < 0) __PYX_ERR(0, 285, __pyx_L1_error)
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 285, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 285, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (!__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L25_bool_binop_done;
  }
+286:                 wildcards == set(['block.name'])
  __pyx_t_4 = PySet_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 286, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PySet_Add(__pyx_t_4, __pyx_kp_s_iso88591_block_name) < 0) __PYX_ERR(0, 286, __pyx_L1_error)
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_wildcards, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 286, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 286, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = __pyx_t_2;
  __pyx_L25_bool_binop_done:;
 287:                 ):
 288:             pass
 289:         else:
+290:             ok = False
  /*else*/ {
    __pyx_v_ok = 0;
  }
  __pyx_L6:;
+291:         return ok
  __pyx_r = __pyx_v_ok;
  goto __pyx_L0;
 292: 
 293: 
 294: # TODO: for now we use python types...
+295: cdef bint validate_input_params_das_cpy(set params, str entity, bint final_step, set wildcards):
static int __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_validate_input_params_das_cpy(PyObject *__pyx_v_params, PyObject *__pyx_v_entity, int __pyx_v_final_step, PyObject *__pyx_v_wildcards) {
  PyObject *__pyx_v_lookup = NULL;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *__pyx_v_api_item = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("validate_input_params_das_cpy", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.validate_input_params_das_cpy", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_lookup);
  __Pyx_XDECREF((PyObject *)__pyx_v_api_item);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 296:     """
 297:     slightly cython-optimized version of schema.validate_input_params
 298:     """
 299:     # could still be added later...
+300:     if final_step and not entity:
  __pyx_t_2 = (__pyx_v_final_step != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_entity); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 300, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+301:         return False
    __pyx_r = 0;
    goto __pyx_L0;
 302: 
 303:     # check if wildcards are allowed
 304:     # TODO: this is just a quick hack to use lookup instead of PK
 305:     # TODO: now entity is a lookup? but not always as matching returns PK ...
+306:     lookup = entity and entity.split('.')[0]
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_entity); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 306, __pyx_L1_error)
  if (__pyx_t_1) {
  } else {
    __Pyx_INCREF(__pyx_v_entity);
    __pyx_t_4 = __pyx_v_entity;
    goto __pyx_L6_bool_binop_done;
  }
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_entity, __pyx_n_s_split); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = __Pyx_GetItemInt(__pyx_t_6, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_INCREF(__pyx_t_5);
  __pyx_t_4 = __pyx_t_5;
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_L6_bool_binop_done:;
  __pyx_v_lookup = __pyx_t_4;
  __pyx_t_4 = 0;
/* … */
  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_iso88591__3); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 306, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
 307:     #cdef char*
 308:     #long_entity = lookup and lookup.split(',')[0] + '.name'
+309:     if final_step and wildcards and \
  __pyx_t_3 = (__pyx_v_final_step != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L9_bool_binop_done;
  }
  __pyx_t_3 = (__pyx_v_wildcards != Py_None) && (PySet_GET_SIZE(__pyx_v_wildcards) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L9_bool_binop_done;
  }
/* … */
  if (__pyx_t_1) {
/* … */
  }
+310:             not are_wildcards_allowed(lookup, wildcards, params):
  if (!(likely(PyString_CheckExact(__pyx_v_lookup))||((__pyx_v_lookup) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_lookup)->tp_name), 0))) __PYX_ERR(0, 310, __pyx_L1_error)
  __pyx_t_3 = ((!(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_are_wildcards_allowed(((PyObject*)__pyx_v_lookup), __pyx_v_wildcards, __pyx_v_params) != 0)) != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L9_bool_binop_done:;
+311:         return False
    __pyx_r = 0;
    goto __pyx_L0;
 312: 
 313:     # given input parameters mapping (from keywords to input parameters)
 314:     # there must exist an API, covering these input params
 315:     cdef ApiParamDefinition api_item
+316:     for api_item in api_definitions:
  if (unlikely(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 316, __pyx_L1_error)
  }
  __pyx_t_4 = __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_api_definitions; __Pyx_INCREF(__pyx_t_4); __pyx_t_7 = 0;
  for (;;) {
    if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_4)) break;
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_5 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 316, __pyx_L1_error)
    #else
    __pyx_t_5 = PySequence_ITEM(__pyx_t_4, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 316, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    #endif
    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition))))) __PYX_ERR(0, 316, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_api_item, ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_ApiParamDefinition *)__pyx_t_5));
    __pyx_t_5 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+317:         if params.issubset(api_item.api_params_set) and \
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_params, __pyx_n_s_issubset); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 317, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (!__pyx_t_8) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_api_item->api_params_set); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 317, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
    } else {
      __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 317, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_8); __pyx_t_8 = NULL;
      __Pyx_INCREF(__pyx_v_api_item->api_params_set);
      __Pyx_GIVEREF(__pyx_v_api_item->api_params_set);
      PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_v_api_item->api_params_set);
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 317, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 317, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L15_bool_binop_done;
    }
/* … */
    if (__pyx_t_1) {
/* … */
    }
+318:                 (not lookup or lookup == api_item.lookup):
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_v_lookup); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 318, __pyx_L1_error)
    __pyx_t_2 = ((!__pyx_t_3) != 0);
    if (!__pyx_t_2) {
    } else {
      __pyx_t_1 = __pyx_t_2;
      goto __pyx_L15_bool_binop_done;
    }
    __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_v_lookup, __pyx_v_api_item->lookup, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 318, __pyx_L1_error)
    __pyx_t_1 = __pyx_t_2;
    __pyx_L15_bool_binop_done:;
+319:             if not final_step:
      __pyx_t_1 = ((!(__pyx_v_final_step != 0)) != 0);
      if (__pyx_t_1) {
/* … */
      }
+320:                 return True
        __pyx_r = 1;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        goto __pyx_L0;
+321:             if params.issuperset(api_item.req_params):
      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_params, __pyx_n_s_issuperset); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 321, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_9 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
        __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6);
        if (likely(__pyx_t_9)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
          __Pyx_INCREF(__pyx_t_9);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_6, function);
        }
      }
      if (!__pyx_t_9) {
        __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_api_item->req_params); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
      } else {
        __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_9); __pyx_t_9 = NULL;
        __Pyx_INCREF(__pyx_v_api_item->req_params);
        __Pyx_GIVEREF(__pyx_v_api_item->req_params);
        PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_v_api_item->req_params);
        __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 321, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 321, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (__pyx_t_1) {
/* … */
      }
+322:                 return True
        __pyx_r = 1;
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        goto __pyx_L0;
 323: 
+324:     return False
  __pyx_r = 0;
  goto __pyx_L0;
 325: 
 326: 
+327: def is_valid_result_py(params_set, result_type, final_step, wildcards):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_7is_valid_result_py(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_7is_valid_result_py = {"is_valid_result_py", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_7is_valid_result_py, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_7is_valid_result_py(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_params_set = 0;
  PyObject *__pyx_v_result_type = 0;
  PyObject *__pyx_v_final_step = 0;
  PyObject *__pyx_v_wildcards = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_valid_result_py (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_params_set,&__pyx_n_s_result_type,&__pyx_n_s_final_step,&__pyx_n_s_wildcards,0};
    PyObject* values[4] = {0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_params_set)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_result_type)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("is_valid_result_py", 1, 4, 4, 1); __PYX_ERR(0, 327, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_final_step)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("is_valid_result_py", 1, 4, 4, 2); __PYX_ERR(0, 327, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_wildcards)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("is_valid_result_py", 1, 4, 4, 3); __PYX_ERR(0, 327, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "is_valid_result_py") < 0)) __PYX_ERR(0, 327, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_params_set = values[0];
    __pyx_v_result_type = values[1];
    __pyx_v_final_step = values[2];
    __pyx_v_wildcards = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("is_valid_result_py", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 327, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.is_valid_result_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_6is_valid_result_py(__pyx_self, __pyx_v_params_set, __pyx_v_result_type, __pyx_v_final_step, __pyx_v_wildcards);

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_6is_valid_result_py(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_params_set, PyObject *__pyx_v_result_type, PyObject *__pyx_v_final_step, PyObject *__pyx_v_wildcards) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_valid_result_py", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.is_valid_result_py", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__15 = PyTuple_Pack(4, __pyx_n_s_params_set, __pyx_n_s_result_type, __pyx_n_s_final_step, __pyx_n_s_wildcards); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 327, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_7is_valid_result_py, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 327, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_valid_result_py, __pyx_t_2) < 0) __PYX_ERR(0, 327, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_is_valid_result_py, 327, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 327, __pyx_L1_error)
 328:     # TODO: now PartialSearchResult could be a direct argument...
+329:     return validate_input_params_das_cpy(
  __Pyx_XDECREF(__pyx_r);
/* … */
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_validate_input_params_das_cpy(((PyObject*)__pyx_v_params_set), ((PyObject*)__pyx_v_result_type), __pyx_t_1, ((PyObject*)__pyx_v_wildcards))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 329, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
+330:         params_set, result_type, final_step, wildcards)
  if (!(likely(PySet_CheckExact(__pyx_v_params_set))||((__pyx_v_params_set) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_params_set)->tp_name), 0))) __PYX_ERR(0, 330, __pyx_L1_error)
  if (!(likely(PyString_CheckExact(__pyx_v_result_type))||((__pyx_v_result_type) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_v_result_type)->tp_name), 0))) __PYX_ERR(0, 330, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_final_step); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 330, __pyx_L1_error)
  if (!(likely(PySet_CheckExact(__pyx_v_wildcards))||((__pyx_v_wildcards) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_v_wildcards)->tp_name), 0))) __PYX_ERR(0, 330, __pyx_L1_error)
 331: 
 332: 
+333: cdef inline bint is_valid_result(PartialSearchResult _r, bint final_step=False):
static CYTHON_INLINE int __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v__r, struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result *__pyx_optional_args) {
  int __pyx_v_final_step = ((int)0);
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_valid_result", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_final_step = __pyx_optional_args->final_step;
    }
  }
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result {
  int __pyx_n;
  int final_step;
};
 334:     # TODO: now PartialSearchResult could be a direct argument...
+335:     return validate_input_params_das_cpy(_r.params_set,
  __pyx_t_1 = __pyx_v__r->params_set;
  __Pyx_INCREF(__pyx_t_1);
/* … */
  __pyx_r = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_validate_input_params_das_cpy(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_2), __pyx_v_final_step, ((PyObject*)__pyx_t_3));
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  goto __pyx_L0;
+336:                                  entity=_r.result_type,
  __pyx_t_2 = __pyx_v__r->result_type;
  __Pyx_INCREF(__pyx_t_2);
 337:                                  final_step=final_step,
+338:                                  wildcards=_r.wildcards_set)
  __pyx_t_3 = __pyx_v__r->wildcards_set;
  __Pyx_INCREF(__pyx_t_3);
 339: 
+340: def perform_search(schema_ws, values_ws, kw_list, chunks, time_limit=3):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_9perform_search(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_9perform_search = {"perform_search", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_9perform_search, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_9perform_search(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_schema_ws = 0;
  PyObject *__pyx_v_values_ws = 0;
  PyObject *__pyx_v_kw_list = 0;
  PyObject *__pyx_v_chunks = 0;
  PyObject *__pyx_v_time_limit = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("perform_search (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_schema_ws,&__pyx_n_s_values_ws,&__pyx_n_s_kw_list,&__pyx_n_s_chunks,&__pyx_n_s_time_limit,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[4] = ((PyObject *)__pyx_int_3);
    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);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_schema_ws)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_values_ws)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_search", 0, 4, 5, 1); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kw_list)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_search", 0, 4, 5, 2); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_chunks)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("perform_search", 0, 4, 5, 3); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_time_limit);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "perform_search") < 0)) __PYX_ERR(0, 340, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 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_schema_ws = values[0];
    __pyx_v_values_ws = values[1];
    __pyx_v_kw_list = values[2];
    __pyx_v_chunks = values[3];
    __pyx_v_time_limit = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("perform_search", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 340, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.perform_search", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_8perform_search(__pyx_self, __pyx_v_schema_ws, __pyx_v_values_ws, __pyx_v_kw_list, __pyx_v_chunks, __pyx_v_time_limit);

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_8perform_search(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_schema_ws, PyObject *__pyx_v_values_ws, PyObject *__pyx_v_kw_list, PyObject *__pyx_v_chunks, PyObject *__pyx_v_time_limit) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c = 0;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("perform_search", 0);
  __Pyx_INCREF(__pyx_v_values_ws);
/* … */
  /* 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_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker.perform_search", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_c);
  __Pyx_XDECREF((PyObject *)__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_values_ws);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__17 = PyTuple_Pack(7, __pyx_n_s_schema_ws, __pyx_n_s_values_ws, __pyx_n_s_kw_list, __pyx_n_s_chunks, __pyx_n_s_time_limit, __pyx_n_s_c, __pyx_n_s_r); if (unlikely(!__pyx_tuple__17)) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_9perform_search, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_perform_search, __pyx_t_2) < 0) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__18 = (PyObject*)__Pyx_PyCode_New(5, 0, 7, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__17, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_perform_search, 340, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__18)) __PYX_ERR(0, 340, __pyx_L1_error)
+341:     values_ws = cleanup_values_weights(values_ws)
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_cleanup_values_weights); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 341, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_values_ws); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 341, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 341, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_values_ws);
    __Pyx_GIVEREF(__pyx_v_values_ws);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_values_ws);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 341, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF_SET(__pyx_v_values_ws, __pyx_t_1);
  __pyx_t_1 = 0;
 342: 
+343:     cdef QueryContext c = QueryContext(schema_ws=schema_ws,
  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 343, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_schema_ws, __pyx_v_schema_ws) < 0) __PYX_ERR(0, 343, __pyx_L1_error)
/* … */
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 343, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_c = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *)__pyx_t_2);
  __pyx_t_2 = 0;
+344:                                          values_ws=values_ws,
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_values_ws, __pyx_v_values_ws) < 0) __PYX_ERR(0, 343, __pyx_L1_error)
+345:                                          kw_list=kw_list,
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_kw_list, __pyx_v_kw_list) < 0) __PYX_ERR(0, 343, __pyx_L1_error)
+346:                                          chunks=chunks,
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_chunks, __pyx_v_chunks) < 0) __PYX_ERR(0, 343, __pyx_L1_error)
+347:                                          time_limit=time_limit)
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_time_limit, __pyx_v_time_limit) < 0) __PYX_ERR(0, 343, __pyx_L1_error)
 348: 
+349:     cdef PartialSearchResult r = PartialSearchResult(None)
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult), __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_r = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_t_2);
  __pyx_t_2 = 0;
/* … */
  __pyx_tuple__5 = PyTuple_Pack(1, Py_None); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
+350:     run_search(c, r, i=0)
  __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, 0);
+351:     if c.time_limit_exceeded:
  __pyx_t_5 = (__pyx_v_c->time_limit_exceeded != 0);
  if (__pyx_t_5) {
/* … */
  }
+352:         raise TimeLimitExceeded()
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_TimeLimitExceeded); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_Raise(__pyx_t_2, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __PYX_ERR(0, 352, __pyx_L1_error)
 353: 
 354: 
 355: 
+356: cdef void seach_for_filters(QueryContext c, PartialSearchResult _r, int i):
static void __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_seach_for_filters(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v__r, int __pyx_v_i) {
  PyObject *__pyx_v_requested_entity_short = NULL;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r = 0;
  PyObject *__pyx_v_chunks = 0;
  PyObject *__pyx_v_match = 0;
  int __pyx_v_index;
  PyObject *__pyx_v_target_fieldname = NULL;
  PyObject *__pyx_v_req_kwds = NULL;
  PyObject *__pyx_v_target = NULL;
  PyObject *__pyx_v_delta_score = NULL;
  PyObject *__pyx_v_pred = NULL;
  PyObject *__pyx_v_tokens = NULL;
  PyObject *__pyx_v_penalties = NULL;
  PyObject *__pyx_v_kwd = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("seach_for_filters", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.seach_for_filters", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_requested_entity_short);
  __Pyx_XDECREF((PyObject *)__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_chunks);
  __Pyx_XDECREF(__pyx_v_match);
  __Pyx_XDECREF(__pyx_v_target_fieldname);
  __Pyx_XDECREF(__pyx_v_req_kwds);
  __Pyx_XDECREF(__pyx_v_target);
  __Pyx_XDECREF(__pyx_v_delta_score);
  __Pyx_XDECREF(__pyx_v_pred);
  __Pyx_XDECREF(__pyx_v_tokens);
  __Pyx_XDECREF(__pyx_v_penalties);
  __Pyx_XDECREF(__pyx_v_kwd);
  __Pyx_RefNannyFinishContext();
}
+357:     if check_time_limit(c):
  __pyx_t_1 = (__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_check_time_limit(__pyx_v_c) != 0);
  if (__pyx_t_1) {
/* … */
  }
+358:         return
    goto __pyx_L0;
 359: 
+360:     requested_entity_short = _r.result_type.split('.')[0]
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v__r->result_type, __pyx_n_s_split); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 360, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 360, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 360, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_requested_entity_short = __pyx_t_2;
  __pyx_t_2 = 0;
/* … */
  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_iso88591__3); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 360, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
 361: 
+362:     cdef PartialSearchResult r = PartialSearchResult(_r)
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(((PyObject *)__pyx_v__r));
  __Pyx_GIVEREF(((PyObject *)__pyx_v__r));
  PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v__r));
  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult), __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_r = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_t_3);
  __pyx_t_3 = 0;
 363: 
+364:     cdef list chunks = c.chunks.get(requested_entity_short, [])
  if (unlikely(__pyx_v_c->chunks == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
    __PYX_ERR(0, 364, __pyx_L1_error)
  }
  __pyx_t_3 = PyList_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 364, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyDict_GetItemDefault(__pyx_v_c->chunks, __pyx_v_requested_entity_short, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 364, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (!(likely(PyList_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 364, __pyx_L1_error)
  __pyx_v_chunks = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
 365:     cdef dict match
 366:     cdef int index
 367: 
+368:     for index in xrange(i, len(chunks)):
  if (unlikely(__pyx_v_chunks == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 368, __pyx_L1_error)
  }
  __pyx_t_4 = PyList_GET_SIZE(__pyx_v_chunks); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 368, __pyx_L1_error)
  for (__pyx_t_5 = __pyx_v_i; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_index = __pyx_t_5;
+369:         match = chunks[index]
    if (unlikely(__pyx_v_chunks == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 369, __pyx_L1_error)
    }
    __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_chunks, __pyx_v_index, int, 1, __Pyx_PyInt_From_int, 1, 1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 369, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (!(likely(PyDict_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 369, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_match, ((PyObject*)__pyx_t_2));
    __pyx_t_2 = 0;
+370:         target_fieldname = match['field_name']
    if (unlikely(__pyx_v_match == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 370, __pyx_L1_error)
    }
    __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_field_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 370, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_XDECREF_SET(__pyx_v_target_fieldname, __pyx_t_2);
    __pyx_t_2 = 0;
 371: 
 372:         # we are anyway including this into filter
+373:         if target_fieldname == _r.result_type:
    __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_v_target_fieldname, __pyx_v__r->result_type, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 373, __pyx_L1_error)
    if (__pyx_t_1) {
/* … */
    }
+374:             continue
      goto __pyx_L4_continue;
 375: 
+376:         req_kwds = match['tokens_required']
    if (unlikely(__pyx_v_match == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 376, __pyx_L1_error)
    }
    __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_tokens_required); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 376, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_XDECREF_SET(__pyx_v_req_kwds, __pyx_t_2);
    __pyx_t_2 = 0;
 377:         # if all required keywords are still available
+378:         if set(req_kwds).isdisjoint(_r.kw_used) and \
    __pyx_t_3 = PySet_New(__pyx_v_req_kwds); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_isdisjoint); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 378, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (!__pyx_t_3) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v__r->kw_used); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
    } else {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 378, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); __pyx_t_3 = NULL;
      __Pyx_INCREF(__pyx_v__r->kw_used);
      __Pyx_GIVEREF(__pyx_v__r->kw_used);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v__r->kw_used);
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 378, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_8) {
    } else {
      __pyx_t_1 = __pyx_t_8;
      goto __pyx_L8_bool_binop_done;
    }
/* … */
    if (__pyx_t_1) {
/* … */
    }
    __pyx_L4_continue:;
  }
+379:                 (target_fieldname not in _r.greps):
    __pyx_t_8 = (__Pyx_PySequence_ContainsTF(__pyx_v_target_fieldname, __pyx_v__r->greps, Py_NE)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 379, __pyx_L1_error)
    __pyx_t_9 = (__pyx_t_8 != 0);
    __pyx_t_1 = __pyx_t_9;
    __pyx_L8_bool_binop_done:;
+380:             if DEBUG: print 'required fields available for:', match
      __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 380, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (__pyx_t_1) {
        __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_INCREF(__pyx_kp_s_iso88591_required_fields_available_for);
        __Pyx_GIVEREF(__pyx_kp_s_iso88591_required_fields_available_for);
        PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_kp_s_iso88591_required_fields_available_for);
        __Pyx_INCREF(__pyx_v_match);
        __Pyx_GIVEREF(__pyx_v_match);
        PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_match);
        if (__Pyx_Print(0, __pyx_t_2, 1) < 0) __PYX_ERR(0, 380, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      }
 381: 
+382:             target = target_fieldname
      __Pyx_INCREF(__pyx_v_target_fieldname);
      __Pyx_XDECREF_SET(__pyx_v_target, __pyx_v_target_fieldname);
 383: 
+384:             delta_score = match['score']
      if (unlikely(__pyx_v_match == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 384, __pyx_L1_error)
      }
      __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_score); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_XDECREF_SET(__pyx_v_delta_score, __pyx_t_2);
      __pyx_t_2 = 0;
 385: 
+386:             if match['predicate']:
      if (unlikely(__pyx_v_match == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 386, __pyx_L1_error)
      }
      __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_predicate); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 386, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (__pyx_t_1) {
/* … */
      }
+387:                 pred = match['predicate']
        if (unlikely(__pyx_v_match == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
          __PYX_ERR(0, 387, __pyx_L1_error)
        }
        __pyx_t_2 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_predicate); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 387, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_XDECREF_SET(__pyx_v_pred, __pyx_t_2);
        __pyx_t_2 = 0;
+388:                 target = (target_fieldname, pred['op'], pred['param'])
        __pyx_t_2 = PyObject_GetItem(__pyx_v_pred, __pyx_n_s_iso88591_op); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 388, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __pyx_t_6 = PyObject_GetItem(__pyx_v_pred, __pyx_n_s_iso88591_param); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 388, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 388, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_INCREF(__pyx_v_target_fieldname);
        __Pyx_GIVEREF(__pyx_v_target_fieldname);
        PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_target_fieldname);
        __Pyx_GIVEREF(__pyx_t_2);
        PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_2);
        __Pyx_GIVEREF(__pyx_t_6);
        PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_6);
        __pyx_t_2 = 0;
        __pyx_t_6 = 0;
        __Pyx_DECREF_SET(__pyx_v_target, __pyx_t_7);
        __pyx_t_7 = 0;
 389: 
+390:             tokens = match['tokens_required_non_stopw'] # filter_stopwords(match['tokens_required'])
      if (unlikely(__pyx_v_match == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 390, __pyx_L1_error)
      }
      __pyx_t_7 = __Pyx_PyDict_GetItem(__pyx_v_match, __pyx_n_s_iso88591_tokens_required_non_stopw); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 390, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_XDECREF_SET(__pyx_v_tokens, __pyx_t_7);
      __pyx_t_7 = 0;
+391:             if len(tokens) == 1:
      __pyx_t_10 = PyObject_Length(__pyx_v_tokens); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 391, __pyx_L1_error)
      __pyx_t_1 = ((__pyx_t_10 == 1) != 0);
      if (__pyx_t_1) {
/* … */
        goto __pyx_L12;
      }
 392:                 # TODO: these penalties shall be moved within entry points (?)
+393:                 delta_score += penalize_highly_possible_schema_terms_as_values(
        __pyx_t_6 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_highly_possible_schema_terms_as_values(__pyx_t_7, Py_None)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 393, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_7 = PyNumber_InPlaceAdd(__pyx_v_delta_score, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 393, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF_SET(__pyx_v_delta_score, __pyx_t_7);
        __pyx_t_7 = 0;
+394:                     tokens[0], None)
        __pyx_t_7 = __Pyx_GetItemInt(__pyx_v_tokens, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 394, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
 395:             else:
 396: 
+397:                 penalties = [penalize_highly_possible_schema_terms_as_values(
      /*else*/ {
        __pyx_t_7 = PyList_New(0); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 397, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_7);
/* … */
          __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_highly_possible_schema_terms_as_values(__pyx_v_kwd, Py_None)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 397, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_2);
          if (unlikely(__Pyx_ListComp_Append(__pyx_t_7, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 397, __pyx_L1_error)
          __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+398:                         kwd, None) for kwd in tokens]
        if (likely(PyList_CheckExact(__pyx_v_tokens)) || PyTuple_CheckExact(__pyx_v_tokens)) {
          __pyx_t_6 = __pyx_v_tokens; __Pyx_INCREF(__pyx_t_6); __pyx_t_10 = 0;
          __pyx_t_11 = NULL;
        } else {
          __pyx_t_10 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_tokens); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 398, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_6);
          __pyx_t_11 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 398, __pyx_L1_error)
        }
        for (;;) {
          if (likely(!__pyx_t_11)) {
            if (likely(PyList_CheckExact(__pyx_t_6))) {
              if (__pyx_t_10 >= PyList_GET_SIZE(__pyx_t_6)) break;
              #if CYTHON_COMPILING_IN_CPYTHON
              __pyx_t_2 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 398, __pyx_L1_error)
              #else
              __pyx_t_2 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 398, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_2);
              #endif
            } else {
              if (__pyx_t_10 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
              #if CYTHON_COMPILING_IN_CPYTHON
              __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_10); __Pyx_INCREF(__pyx_t_2); __pyx_t_10++; if (unlikely(0 < 0)) __PYX_ERR(0, 398, __pyx_L1_error)
              #else
              __pyx_t_2 = PySequence_ITEM(__pyx_t_6, __pyx_t_10); __pyx_t_10++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 398, __pyx_L1_error)
              __Pyx_GOTREF(__pyx_t_2);
              #endif
            }
          } else {
            __pyx_t_2 = __pyx_t_11(__pyx_t_6);
            if (unlikely(!__pyx_t_2)) {
              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, 398, __pyx_L1_error)
              }
              break;
            }
            __Pyx_GOTREF(__pyx_t_2);
          }
          __Pyx_XDECREF_SET(__pyx_v_kwd, __pyx_t_2);
          __pyx_t_2 = 0;
/* … */
        }
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_XDECREF_SET(__pyx_v_penalties, ((PyObject*)__pyx_t_7));
        __pyx_t_7 = 0;
 399:                 # for now, use average
+400:                 delta_score += len(penalties) and sum(penalties) / len(
        __pyx_t_10 = PyList_GET_SIZE(__pyx_v_penalties); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 400, __pyx_L1_error)
        if (!__pyx_t_10) {
          goto __pyx_L16_next_or;
        } else {
        }
        __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 400, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_INCREF(__pyx_v_penalties);
        __Pyx_GIVEREF(__pyx_v_penalties);
        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_penalties);
        __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_sum, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 400, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
/* … */
        __pyx_t_10 = PyList_GET_SIZE(__pyx_v_penalties); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 400, __pyx_L1_error)
/* … */
        __pyx_t_6 = PyInt_FromSsize_t(__pyx_t_10); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 400, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __pyx_t_3 = __Pyx_PyNumber_Divide(__pyx_t_2, __pyx_t_6); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 400, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 400, __pyx_L1_error)
        if (!__pyx_t_1) {
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        } else {
          __Pyx_INCREF(__pyx_t_3);
          __pyx_t_7 = __pyx_t_3;
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
          goto __pyx_L15_bool_binop_done;
        }
        __pyx_L16_next_or:;
/* … */
        __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_delta_score, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 400, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __Pyx_DECREF_SET(__pyx_v_delta_score, __pyx_t_3);
        __pyx_t_3 = 0;
      }
      __pyx_L12:;
+401:                     penalties) or 0.0
        __pyx_t_3 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 401, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_7 = __pyx_t_3;
        __pyx_t_3 = 0;
        __pyx_L15_bool_binop_done:;
 402: 
 403:             #_r_filters.append(target)
 404: 
 405:             # we count each token separately in scoring
+406:             delta_score = len(tokens) * logprob(delta_score)
      __pyx_t_10 = PyObject_Length(__pyx_v_tokens); if (unlikely(__pyx_t_10 == -1)) __PYX_ERR(0, 406, __pyx_L1_error)
      __pyx_t_12 = __pyx_PyFloat_AsDouble(__pyx_v_delta_score); if (unlikely((__pyx_t_12 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 406, __pyx_L1_error)
      __pyx_t_3 = PyFloat_FromDouble((__pyx_t_10 * __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(__pyx_t_12))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 406, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF_SET(__pyx_v_delta_score, __pyx_t_3);
      __pyx_t_3 = 0;
+407:             r.reset('grep', new_kw=None, delta_score=delta_score, field=target_fieldname,
      __pyx_t_12 = __pyx_PyFloat_AsDouble(__pyx_v_delta_score); if (unlikely((__pyx_t_12 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 407, __pyx_L1_error)
/* … */
      __pyx_t_13.__pyx_n = 4;
      __pyx_t_13.field = __pyx_v_target_fieldname;
      __pyx_t_13.new_value = Py_None;
      __pyx_t_13.add_grep = __pyx_v_target;
      __pyx_t_13.grep_req_kwds = ((PyObject*)__pyx_v_req_kwds);
      __pyx_t_3 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_n_s_iso88591_grep, Py_None, __pyx_t_12, &__pyx_t_13); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 407, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+408:                     new_value=None, add_grep=target, grep_req_kwds=req_kwds)
      if (!(likely(PyList_CheckExact(__pyx_v_req_kwds))||((__pyx_v_req_kwds) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "list", Py_TYPE(__pyx_v_req_kwds)->tp_name), 0))) __PYX_ERR(0, 408, __pyx_L1_error)
+409:             store_result(c, r)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_store_result(__pyx_v_c, __pyx_v_r);
+410:             seach_for_filters(c, r, i+1)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_seach_for_filters(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 411: 
 412: 
+413: cdef inline bint check_time_limit(QueryContext c):
static CYTHON_INLINE int __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_check_time_limit(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("check_time_limit", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 414:     """
 415:     check time limit
 416:     """
 417:     # TODO: we may throw python exception here, but it may be slighly slower
+418:     if  clock() > c.time_limit:
  __pyx_t_1 = ((clock() > __pyx_v_c->time_limit) != 0);
  if (__pyx_t_1) {
/* … */
  }
 419:         # time limit exceeded
 420:         # TODO: would it help checking time bounds only each whatever # calls
+421:         c.time_limit_exceeded = True
    __pyx_v_c->time_limit_exceeded = 1;
+422:         return True
    __pyx_r = 1;
    goto __pyx_L0;
+423:     return False
  __pyx_r = 0;
  goto __pyx_L0;
 424: 
 425: 
 426: # TODO: one could do lazy log-score calculation
 427: # TODO: nicier exception handling
+428: cdef void run_search(QueryContext c, PartialSearchResult _r,
static void __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v__r, int __pyx_v_i) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r = 0;
  PyObject *__pyx_v_lookup = NULL;
  PyObject *__pyx_v_kw = NULL;
  PyObject *__pyx_v_schema_ws = NULL;
  PyObject *__pyx_v_values_ws = NULL;
  PyObject *__pyx_v_kw_val = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_kw_field = NULL;
  PyObject *__pyx_v_op_param = NULL;
  PyObject *__pyx_v_score = NULL;
  PyObject *__pyx_v_field = NULL;
  PyObject *__pyx_v_vscore = NULL;
  PyObject *__pyx_v_mapping = NULL;
  PyObject *__pyx_v_vfield = NULL;
  PyObject *__pyx_v_val = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("run_search", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.run_search", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_lookup);
  __Pyx_XDECREF(__pyx_v_kw);
  __Pyx_XDECREF(__pyx_v_schema_ws);
  __Pyx_XDECREF(__pyx_v_values_ws);
  __Pyx_XDECREF(__pyx_v_kw_val);
  __Pyx_XDECREF(__pyx_v_kw_field);
  __Pyx_XDECREF(__pyx_v_op_param);
  __Pyx_XDECREF(__pyx_v_score);
  __Pyx_XDECREF(__pyx_v_field);
  __Pyx_XDECREF(__pyx_v_vscore);
  __Pyx_XDECREF(__pyx_v_mapping);
  __Pyx_XDECREF(__pyx_v_vfield);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_RefNannyFinishContext();
}
 429:                 int i): #
 430:     """
 431:     classify either as:
 432:     - input name
 433:     - input value
 434: 
 435:     greps:
 436:     - grep filter
 437:     - grep selector
 438: 
 439:     not supported yet: aggregation operators (min, max)
 440:     """
 441: 
+442:     if check_time_limit(c):
  __pyx_t_1 = (__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_check_time_limit(__pyx_v_c) != 0);
  if (__pyx_t_1) {
/* … */
  }
+443:         return
    goto __pyx_L0;
 444: 
 445:     #cdef char* lookup
 446:     global lookup_keys
 447: 
 448: 
 449:     # is this a valid to continue
+450:     if i > 0 and not is_valid_result(_r, False):
  __pyx_t_2 = ((__pyx_v_i > 0) != 0);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L5_bool_binop_done;
  }
  __pyx_t_3.__pyx_n = 1;
  __pyx_t_3.final_step = 0;
  __pyx_t_2 = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result(__pyx_v__r, &__pyx_t_3); 
  __pyx_t_4 = ((!(__pyx_t_2 != 0)) != 0);
  __pyx_t_1 = __pyx_t_4;
  __pyx_L5_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
 451:         #print 'bad:', _r
+452:         return
    goto __pyx_L0;
 453: 
+454:     cdef PartialSearchResult r = PartialSearchResult(_r)
  __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 454, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_INCREF(((PyObject *)__pyx_v__r));
  __Pyx_GIVEREF(((PyObject *)__pyx_v__r));
  PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v__r));
  __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 454, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_r = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_t_6);
  __pyx_t_6 = 0;
 455: 
 456:     # check if this could be a valid final result
+457:     if i >= c.n_kw:
  __pyx_t_1 = ((__pyx_v_i >= __pyx_v_c->n_kw) != 0);
  if (__pyx_t_1) {
/* … */
  }
 458:         #if not _r.result_type:
 459:         #    print 'lookup:', _r.result_type
 460: 
+461:         if  r.result_type and is_valid_result(r, final_step=True):
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_r->result_type); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 461, __pyx_L1_error)
    if (__pyx_t_4) {
    } else {
      __pyx_t_1 = __pyx_t_4;
      goto __pyx_L9_bool_binop_done;
    }
    __pyx_t_3.__pyx_n = 1;
    __pyx_t_3.final_step = 1;
    __pyx_t_4 = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result(__pyx_v_r, &__pyx_t_3); 
    __pyx_t_2 = (__pyx_t_4 != 0);
    __pyx_t_1 = __pyx_t_2;
    __pyx_L9_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
      goto __pyx_L8;
    }
+462:             store_result(c, r)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_store_result(__pyx_v_c, __pyx_v_r);
+463:             seach_for_filters(c, r, 0)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_seach_for_filters(__pyx_v_c, __pyx_v_r, 0);
 464: 
+465:         elif not _r.result_type:
    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v__r->result_type); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 465, __pyx_L1_error)
    __pyx_t_2 = ((!__pyx_t_1) != 0);
    if (__pyx_t_2) {
/* … */
    }
    __pyx_L8:;
 466:             #print 'no result type... for:', r
 467: 
 468:             # handle the case when result type is NOT mapped
 469: 
 470:             # iterate over result types
 471:             # TODO: this fact must be available afterwards for ranking...
+472:             for lookup in lookup_keys:
      if (unlikely(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
        __PYX_ERR(0, 472, __pyx_L1_error)
      }
      __pyx_t_6 = __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_lookup_keys; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
      for (;;) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 472, __pyx_L1_error)
        #else
        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 472, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        #endif
        __Pyx_XDECREF_SET(__pyx_v_lookup, __pyx_t_5);
        __pyx_t_5 = 0;
/* … */
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 473:                 # TODO: support multi-value lookup
+474:                 r.reset('lookup-enum', '',
        __pyx_t_9.__pyx_n = 1;
        __pyx_t_9.field = __pyx_v_lookup;
        __pyx_t_5 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_kp_s_iso88591_lookup_enum, __pyx_kp_s_iso88591_, __pyx_t_8, &__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 474, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 475:                         # rank multi-term lookup slightly lower
+476:                         delta_score=-0.001 if ',' in lookup else 0.0,
        __pyx_t_2 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591__7, __pyx_v_lookup, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 476, __pyx_L1_error)
        if ((__pyx_t_2 != 0)) {
          __pyx_t_8 = -0.001;
        } else {
          __pyx_t_8 = 0.0;
        }
 477:                         field = lookup)
+478:                 if is_valid_result(r, final_step=True):
        __pyx_t_3.__pyx_n = 1;
        __pyx_t_3.final_step = 1;
        __pyx_t_2 = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_is_valid_result(__pyx_v_r, &__pyx_t_3); 
        __pyx_t_1 = (__pyx_t_2 != 0);
        if (__pyx_t_1) {
/* … */
        }
+479:                     store_result(c, r)
          __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_store_result(__pyx_v_c, __pyx_v_r);
 480:                     # search for post filters and aggregations, if any
+481:                     seach_for_filters(c, r, 0)
          __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_seach_for_filters(__pyx_v_c, __pyx_v_r, 0);
 482: 
+483:         return
    goto __pyx_L0;
 484: 
 485: 
+486:     kw = c.kw_list[i]
  if (unlikely(__pyx_v_c->kw_list == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
    __PYX_ERR(0, 486, __pyx_L1_error)
  }
  __pyx_t_6 = __Pyx_GetItemInt_List(__pyx_v_c->kw_list, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 486, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_v_kw = __pyx_t_6;
  __pyx_t_6 = 0;
 487: 
 488:     # TODO: what if no kwd mapps into lookup? loop all or try to find which are supported?
 489: 
 490:     # skip this KW
 491:     # TODO: or I could add the score here
+492:     run_search(c, _r, i+1)
  __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v__r, (__pyx_v_i + 1));
 493: 
+494:     schema_ws = c.schema_ws.get(kw, [])
  if (unlikely(__pyx_v_c->schema_ws == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
    __PYX_ERR(0, 494, __pyx_L1_error)
  }
  __pyx_t_6 = PyList_New(0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyDict_GetItemDefault(__pyx_v_c->schema_ws, __pyx_v_kw, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 494, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_schema_ws = __pyx_t_5;
  __pyx_t_5 = 0;
+495:     values_ws = c.values_ws.get(kw, [])
  if (unlikely(__pyx_v_c->values_ws == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
    __PYX_ERR(0, 495, __pyx_L1_error)
  }
  __pyx_t_5 = PyList_New(0); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyDict_GetItemDefault(__pyx_v_c->values_ws, __pyx_v_kw, __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_v_values_ws = __pyx_t_6;
  __pyx_t_6 = 0;
 496: 
 497: 
+498:     kw_val = kw.split('=')[-1] # without "=", if any...
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_kw, __pyx_n_s_split); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_5, -1L, long, 1, __Pyx_PyInt_From_long, 0, 1, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_kw_val = __pyx_t_6;
  __pyx_t_6 = 0;
/* … */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_iso88591__8); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
+499:     kw_field = get_keyword_without_operator(kw)
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_keyword_without_operator); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 499, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_10 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_10)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_10) {
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_kw); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
  } else {
    __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_10); __pyx_t_10 = NULL;
    __Pyx_INCREF(__pyx_v_kw);
    __Pyx_GIVEREF(__pyx_v_kw);
    PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_v_kw);
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_11, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 499, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_kw_field = __pyx_t_6;
  __pyx_t_6 = 0;
 500: 
+501:     op_param = get_operator_and_param(kw)
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_operator_and_param); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_11 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_11)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_11);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_11) {
    __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_kw); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 501, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
  } else {
    __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 501, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11); __pyx_t_11 = NULL;
    __Pyx_INCREF(__pyx_v_kw);
    __Pyx_GIVEREF(__pyx_v_kw);
    PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_v_kw);
    __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_10, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 501, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_op_param = __pyx_t_6;
  __pyx_t_6 = 0;
 502: 
 503: 
 504: 
+505:     for score, field in schema_ws:
  if (likely(PyList_CheckExact(__pyx_v_schema_ws)) || PyTuple_CheckExact(__pyx_v_schema_ws)) {
    __pyx_t_6 = __pyx_v_schema_ws; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
    __pyx_t_12 = NULL;
  } else {
    __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_schema_ws); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 505, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_12 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 505, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_12)) {
      if (likely(PyList_CheckExact(__pyx_t_6))) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 505, __pyx_L1_error)
        #else
        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 505, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        #endif
      } else {
        if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 505, __pyx_L1_error)
        #else
        __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 505, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        #endif
      }
    } else {
      __pyx_t_5 = __pyx_t_12(__pyx_t_6);
      if (unlikely(!__pyx_t_5)) {
        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, 505, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_5);
    }
    if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
      PyObject* sequence = __pyx_t_5;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 505, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(__pyx_t_11);
      #else
      __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __pyx_t_11 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      #endif
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_13 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 505, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
      index = 0; __pyx_t_10 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_10)) goto __pyx_L16_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_10);
      index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L16_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_11);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 2) < 0) __PYX_ERR(0, 505, __pyx_L1_error)
      __pyx_t_14 = NULL;
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      goto __pyx_L17_unpacking_done;
      __pyx_L16_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __pyx_t_14 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 505, __pyx_L1_error)
      __pyx_L17_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_score, __pyx_t_10);
    __pyx_t_10 = 0;
    __Pyx_XDECREF_SET(__pyx_v_field, __pyx_t_11);
    __pyx_t_11 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 506:         # part of (TODO:possibly multi-daskey) lookup (!)
+507:         if not '=' in kw:
    __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591__8, __pyx_v_kw, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 507, __pyx_L1_error)
    __pyx_t_2 = (__pyx_t_1 != 0);
    if (__pyx_t_2) {
/* … */
    }
+508:             r.reset('lookup', new_kw=kw, delta_score=log(score), field = field)
      __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 508, __pyx_L1_error)
      __pyx_t_9.__pyx_n = 1;
      __pyx_t_9.field = __pyx_v_field;
      __pyx_t_5 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_n_s_iso88591_lookup, __pyx_v_kw, log(__pyx_t_8), &__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 508, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+509:             run_search(c, r, i+1)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 510: 
 511:         # input name
+512:         if not field in _r.values:
    if (unlikely(__pyx_v__r->values == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
      __PYX_ERR(0, 512, __pyx_L1_error)
    }
    __pyx_t_2 = (__Pyx_PyDict_ContainsTF(__pyx_v_field, __pyx_v__r->values, Py_NE)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 512, __pyx_L1_error)
    __pyx_t_1 = (__pyx_t_2 != 0);
    if (__pyx_t_1) {
/* … */
    }
+513:             r.values[field] = ''
      if (unlikely(__pyx_v_r->values == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 513, __pyx_L1_error)
      }
      if (unlikely(PyDict_SetItem(__pyx_v_r->values, __pyx_v_field, __pyx_kp_s_iso88591_) < 0)) __PYX_ERR(0, 513, __pyx_L1_error)
+514:         r.reset('inputn', new_kw=kw, delta_score=log(score), field=field)
    __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 514, __pyx_L1_error)
    __pyx_t_9.__pyx_n = 1;
    __pyx_t_9.field = __pyx_v_field;
    __pyx_t_5 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_n_s_iso88591_inputn, __pyx_v_kw, log(__pyx_t_8), &__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 514, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+515:         run_search(c, r, i+1)
    __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 516: 
 517:         # TODO: it almost doesn't make sense iterating over schema_ws and when value_ws!!!
 518: 
 519:         # some kwds may be in  daskey=value form
+520:         if op_param and op_param['op'] == '=':
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_op_param); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 520, __pyx_L1_error)
    if (__pyx_t_2) {
    } else {
      __pyx_t_1 = __pyx_t_2;
      goto __pyx_L21_bool_binop_done;
    }
    __pyx_t_5 = PyObject_GetItem(__pyx_v_op_param, __pyx_n_s_iso88591_op); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 520, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_2 = (__Pyx_PyString_Equals(__pyx_t_5, __pyx_kp_s_iso88591__8, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 520, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_1 = __pyx_t_2;
    __pyx_L21_bool_binop_done:;
    if (__pyx_t_1) {
/* … */
    }
+521:             for vscore, mapping in values_ws:
      if (likely(PyList_CheckExact(__pyx_v_values_ws)) || PyTuple_CheckExact(__pyx_v_values_ws)) {
        __pyx_t_5 = __pyx_v_values_ws; __Pyx_INCREF(__pyx_t_5); __pyx_t_15 = 0;
        __pyx_t_16 = NULL;
      } else {
        __pyx_t_15 = -1; __pyx_t_5 = PyObject_GetIter(__pyx_v_values_ws); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 521, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_16 = Py_TYPE(__pyx_t_5)->tp_iternext; if (unlikely(!__pyx_t_16)) __PYX_ERR(0, 521, __pyx_L1_error)
      }
      for (;;) {
        if (likely(!__pyx_t_16)) {
          if (likely(PyList_CheckExact(__pyx_t_5))) {
            if (__pyx_t_15 >= PyList_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_11 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_15); __Pyx_INCREF(__pyx_t_11); __pyx_t_15++; if (unlikely(0 < 0)) __PYX_ERR(0, 521, __pyx_L1_error)
            #else
            __pyx_t_11 = PySequence_ITEM(__pyx_t_5, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 521, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_11);
            #endif
          } else {
            if (__pyx_t_15 >= PyTuple_GET_SIZE(__pyx_t_5)) break;
            #if CYTHON_COMPILING_IN_CPYTHON
            __pyx_t_11 = PyTuple_GET_ITEM(__pyx_t_5, __pyx_t_15); __Pyx_INCREF(__pyx_t_11); __pyx_t_15++; if (unlikely(0 < 0)) __PYX_ERR(0, 521, __pyx_L1_error)
            #else
            __pyx_t_11 = PySequence_ITEM(__pyx_t_5, __pyx_t_15); __pyx_t_15++; if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 521, __pyx_L1_error)
            __Pyx_GOTREF(__pyx_t_11);
            #endif
          }
        } else {
          __pyx_t_11 = __pyx_t_16(__pyx_t_5);
          if (unlikely(!__pyx_t_11)) {
            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, 521, __pyx_L1_error)
            }
            break;
          }
          __Pyx_GOTREF(__pyx_t_11);
        }
        if ((likely(PyTuple_CheckExact(__pyx_t_11))) || (PyList_CheckExact(__pyx_t_11))) {
          PyObject* sequence = __pyx_t_11;
          #if CYTHON_COMPILING_IN_CPYTHON
          Py_ssize_t size = Py_SIZE(sequence);
          #else
          Py_ssize_t size = PySequence_Size(sequence);
          #endif
          if (unlikely(size != 2)) {
            if (size > 2) __Pyx_RaiseTooManyValuesError(2);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            __PYX_ERR(0, 521, __pyx_L1_error)
          }
          #if CYTHON_COMPILING_IN_CPYTHON
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_10 = PyTuple_GET_ITEM(sequence, 0); 
            __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
          } else {
            __pyx_t_10 = PyList_GET_ITEM(sequence, 0); 
            __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
          }
          __Pyx_INCREF(__pyx_t_10);
          __Pyx_INCREF(__pyx_t_13);
          #else
          __pyx_t_10 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 521, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_10);
          __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 521, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_13);
          #endif
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_17 = PyObject_GetIter(__pyx_t_11); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 521, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_17);
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
          __pyx_t_14 = Py_TYPE(__pyx_t_17)->tp_iternext;
          index = 0; __pyx_t_10 = __pyx_t_14(__pyx_t_17); if (unlikely(!__pyx_t_10)) goto __pyx_L25_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_10);
          index = 1; __pyx_t_13 = __pyx_t_14(__pyx_t_17); if (unlikely(!__pyx_t_13)) goto __pyx_L25_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_13);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_17), 2) < 0) __PYX_ERR(0, 521, __pyx_L1_error)
          __pyx_t_14 = NULL;
          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
          goto __pyx_L26_unpacking_done;
          __pyx_L25_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
          __pyx_t_14 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          __PYX_ERR(0, 521, __pyx_L1_error)
          __pyx_L26_unpacking_done:;
        }
        __Pyx_XDECREF_SET(__pyx_v_vscore, __pyx_t_10);
        __pyx_t_10 = 0;
        __Pyx_XDECREF_SET(__pyx_v_mapping, __pyx_t_13);
        __pyx_t_13 = 0;
/* … */
        __pyx_L23_continue:;
      }
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+522:                 vfield = mapping['map_to']
        __pyx_t_11 = PyObject_GetItem(__pyx_v_mapping, __pyx_n_s_iso88591_map_to); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 522, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_XDECREF_SET(__pyx_v_vfield, __pyx_t_11);
        __pyx_t_11 = 0;
+523:                 val = mapping.get('adjusted_keyword', kw_val)
        __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_mapping, __pyx_n_s_get); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 523, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        __pyx_t_10 = NULL;
        __pyx_t_18 = 0;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_13))) {
          __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_13);
          if (likely(__pyx_t_10)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
            __Pyx_INCREF(__pyx_t_10);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_13, function);
            __pyx_t_18 = 1;
          }
        }
        __pyx_t_17 = PyTuple_New(2+__pyx_t_18); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 523, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_17);
        if (__pyx_t_10) {
          __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_10); __pyx_t_10 = NULL;
        }
        __Pyx_INCREF(__pyx_n_s_iso88591_adjusted_keyword);
        __Pyx_GIVEREF(__pyx_n_s_iso88591_adjusted_keyword);
        PyTuple_SET_ITEM(__pyx_t_17, 0+__pyx_t_18, __pyx_n_s_iso88591_adjusted_keyword);
        __Pyx_INCREF(__pyx_v_kw_val);
        __Pyx_GIVEREF(__pyx_v_kw_val);
        PyTuple_SET_ITEM(__pyx_t_17, 1+__pyx_t_18, __pyx_v_kw_val);
        __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_17, NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 523, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_11);
        __pyx_t_11 = 0;
 524: 
 525:                 # TODO: reward matches which honor pre-specified daskey=val
+526:                 if vfield == field:
        __pyx_t_11 = PyObject_RichCompare(__pyx_v_vfield, __pyx_v_field, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 526, __pyx_L1_error)
        __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 526, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        if (__pyx_t_1) {
/* … */
          goto __pyx_L27;
        }
+527:                     vscore *= 1.6
          __pyx_t_11 = PyNumber_InPlaceMultiply(__pyx_v_vscore, __pyx_float_1_6); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 527, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_11);
          __Pyx_DECREF_SET(__pyx_v_vscore, __pyx_t_11);
          __pyx_t_11 = 0;
 528:                 else:
+529:                     continue
        /*else*/ {
          goto __pyx_L23_continue;
        }
        __pyx_L27:;
 530: 
 531:                 # TODO: are A=B currently account as two KWDS in penalize?!
+532:                 r.reset('val', new_kw=kw,
        __pyx_t_9.__pyx_n = 2;
        __pyx_t_9.field = __pyx_v_vfield;
        __pyx_t_9.new_value = __pyx_v_val;
        __pyx_t_11 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_n_s_iso88591_val, __pyx_v_kw, (log(__pyx_t_8) + log(__pyx_t_19)), &__pyx_t_9); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 532, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
+533:                         delta_score=log(score)+log(vscore),
        __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 533, __pyx_L1_error)
        __pyx_t_19 = __pyx_PyFloat_AsDouble(__pyx_v_vscore); if (unlikely((__pyx_t_19 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 533, __pyx_L1_error)
 534:                         field=vfield, new_value=val)
+535:                 run_search(c, r, i+1)
        __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 536: 
 537: 
 538:     # value
+539:     if not op_param or op_param['op'] == '=':
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_op_param); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 539, __pyx_L1_error)
  __pyx_t_4 = ((!__pyx_t_2) != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_1 = __pyx_t_4;
    goto __pyx_L29_bool_binop_done;
  }
  __pyx_t_6 = PyObject_GetItem(__pyx_v_op_param, __pyx_n_s_iso88591_op); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 539, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = (__Pyx_PyString_Equals(__pyx_t_6, __pyx_kp_s_iso88591__8, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 539, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = __pyx_t_4;
  __pyx_L29_bool_binop_done:;
  if (__pyx_t_1) {
/* … */
  }
+540:         for score, mapping in values_ws:
    if (likely(PyList_CheckExact(__pyx_v_values_ws)) || PyTuple_CheckExact(__pyx_v_values_ws)) {
      __pyx_t_6 = __pyx_v_values_ws; __Pyx_INCREF(__pyx_t_6); __pyx_t_7 = 0;
      __pyx_t_12 = NULL;
    } else {
      __pyx_t_7 = -1; __pyx_t_6 = PyObject_GetIter(__pyx_v_values_ws); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 540, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_12 = Py_TYPE(__pyx_t_6)->tp_iternext; if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 540, __pyx_L1_error)
    }
    for (;;) {
      if (likely(!__pyx_t_12)) {
        if (likely(PyList_CheckExact(__pyx_t_6))) {
          if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_6)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_5 = PyList_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 540, __pyx_L1_error)
          #else
          __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 540, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          #endif
        } else {
          if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_6)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_5 = PyTuple_GET_ITEM(__pyx_t_6, __pyx_t_7); __Pyx_INCREF(__pyx_t_5); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 540, __pyx_L1_error)
          #else
          __pyx_t_5 = PySequence_ITEM(__pyx_t_6, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 540, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_5);
          #endif
        }
      } else {
        __pyx_t_5 = __pyx_t_12(__pyx_t_6);
        if (unlikely(!__pyx_t_5)) {
          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, 540, __pyx_L1_error)
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_5);
      }
      if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
        PyObject* sequence = __pyx_t_5;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          __PYX_ERR(0, 540, __pyx_L1_error)
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_11 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_11 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_11);
        __Pyx_INCREF(__pyx_t_13);
        #else
        __pyx_t_11 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 540, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 540, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        #endif
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_17 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 540, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_17);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __pyx_t_14 = Py_TYPE(__pyx_t_17)->tp_iternext;
        index = 0; __pyx_t_11 = __pyx_t_14(__pyx_t_17); if (unlikely(!__pyx_t_11)) goto __pyx_L33_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_11);
        index = 1; __pyx_t_13 = __pyx_t_14(__pyx_t_17); if (unlikely(!__pyx_t_13)) goto __pyx_L33_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_13);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_17), 2) < 0) __PYX_ERR(0, 540, __pyx_L1_error)
        __pyx_t_14 = NULL;
        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
        goto __pyx_L34_unpacking_done;
        __pyx_L33_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
        __pyx_t_14 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        __PYX_ERR(0, 540, __pyx_L1_error)
        __pyx_L34_unpacking_done:;
      }
      __Pyx_XDECREF_SET(__pyx_v_score, __pyx_t_11);
      __pyx_t_11 = 0;
      __Pyx_XDECREF_SET(__pyx_v_mapping, __pyx_t_13);
      __pyx_t_13 = 0;
/* … */
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+541:             field = mapping['map_to']
      __pyx_t_5 = PyObject_GetItem(__pyx_v_mapping, __pyx_n_s_iso88591_map_to); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 541, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_XDECREF_SET(__pyx_v_field, __pyx_t_5);
      __pyx_t_5 = 0;
+542:             val = mapping.get('adjusted_keyword', kw_val)
      __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_mapping, __pyx_n_s_get); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 542, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      __pyx_t_11 = NULL;
      __pyx_t_15 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_13))) {
        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_13);
        if (likely(__pyx_t_11)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_13, function);
          __pyx_t_15 = 1;
        }
      }
      __pyx_t_17 = PyTuple_New(2+__pyx_t_15); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 542, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_17);
      if (__pyx_t_11) {
        __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_17, 0, __pyx_t_11); __pyx_t_11 = NULL;
      }
      __Pyx_INCREF(__pyx_n_s_iso88591_adjusted_keyword);
      __Pyx_GIVEREF(__pyx_n_s_iso88591_adjusted_keyword);
      PyTuple_SET_ITEM(__pyx_t_17, 0+__pyx_t_15, __pyx_n_s_iso88591_adjusted_keyword);
      __Pyx_INCREF(__pyx_v_kw_val);
      __Pyx_GIVEREF(__pyx_v_kw_val);
      PyTuple_SET_ITEM(__pyx_t_17, 1+__pyx_t_15, __pyx_v_kw_val);
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_17, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 542, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_5);
      __pyx_t_5 = 0;
 543: 
 544:             # if both field name and value is matched
+545:             if _r.values.get(field, False) == '':
      if (unlikely(__pyx_v__r->values == Py_None)) {
        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "get");
        __PYX_ERR(0, 545, __pyx_L1_error)
      }
      __pyx_t_5 = __Pyx_PyDict_GetItemDefault(__pyx_v__r->values, __pyx_v_field, Py_False); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 545, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_1 = (__Pyx_PyString_Equals(__pyx_t_5, __pyx_kp_s_iso88591_, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 545, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if (__pyx_t_1) {
/* … */
      }
+546:                 score *= 1.15
        __pyx_t_5 = PyNumber_InPlaceMultiply(__pyx_v_score, __pyx_float_1_15); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 546, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF_SET(__pyx_v_score, __pyx_t_5);
        __pyx_t_5 = 0;
 547: 
+548:             r.reset('val', new_kw=kw, delta_score=log(score), field=field, new_value=val)
      __pyx_t_19 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_19 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 548, __pyx_L1_error)
      __pyx_t_9.__pyx_n = 2;
      __pyx_t_9.field = __pyx_v_field;
      __pyx_t_9.new_value = __pyx_v_val;
      __pyx_t_5 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_n_s_iso88591_val, __pyx_v_kw, log(__pyx_t_19), &__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 548, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+549:             run_search(c, r, i+1)
      __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 550: 
 551:             # TODO: isn't this expanding the search scope as I'm anyways adding all result_types afterwards!?
 552:             # and TODO: this complicates the control flow...
+553:             if not _r.result_type:
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v__r->result_type); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 553, __pyx_L1_error)
      __pyx_t_4 = ((!__pyx_t_1) != 0);
      if (__pyx_t_4) {
/* … */
      }
+554:                 r.reset('val+result_type', new_kw=kw,
        __pyx_t_9.__pyx_n = 2;
        __pyx_t_9.field = __pyx_v_field;
        __pyx_t_9.new_value = __pyx_v_val;
        __pyx_t_5 = ((struct __pyx_vtabstruct_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_v_r->__pyx_vtab)->reset(__pyx_v_r, __pyx_kp_s_iso88591_val_result_type, __pyx_v_kw, (log(__pyx_t_19) + log(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_p_value_as_lookup)), &__pyx_t_9); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 554, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
 555:                         # TODO: this makes more sense in beginning
+556:                         delta_score=log(score)+log(p_value_as_lookup), field=field, new_value=val)
        __pyx_t_19 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_19 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 556, __pyx_L1_error)
+557:                 run_search(c, r, i+1)
        __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_run_search(__pyx_v_c, __pyx_v_r, (__pyx_v_i + 1));
 558: 
 559: 
 560: 
 561: 
 562: 
 563: 
 564:     # filters...
 565: 
 566: 
+567: cdef void store_result(QueryContext c, PartialSearchResult r):
static void __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_store_result(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r) {
  PyObject *__pyx_v_value_list = NULL;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r_new = 0;
  double __pyx_v__score;
  PyObject *__pyx_v_result = NULL;
  PyObject *__pyx_v_heap_tuple = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_popped_out = NULL;
  PyObject *__pyx_v_k = NULL;
  PyObject *__pyx_v_v = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("store_result", 0);
/* … */
  /* function exit code */
  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_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.store_result", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_value_list);
  __Pyx_XDECREF((PyObject *)__pyx_v_r_new);
  __Pyx_XDECREF(__pyx_v_result);
  __Pyx_XDECREF(__pyx_v_heap_tuple);
  __Pyx_XDECREF(__pyx_v_popped_out);
  __Pyx_XDECREF(__pyx_v_k);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_RefNannyFinishContext();
}
 568:     # require some values to be mapped
 569: 
+570:     value_list  = [(k, v) for k, v in r.values.items()
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (unlikely(__pyx_v_r->values == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%s'", "items");
    __PYX_ERR(0, 570, __pyx_L1_error)
  }
  __pyx_t_2 = __Pyx_PyDict_Items(__pyx_v_r->values); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 570, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
    __pyx_t_3 = __pyx_t_2; __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
  } else {
    __pyx_t_4 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 570, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 570, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  for (;;) {
    if (likely(!__pyx_t_5)) {
      if (likely(PyList_CheckExact(__pyx_t_3))) {
        if (__pyx_t_4 >= PyList_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_2 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 570, __pyx_L1_error)
        #else
        __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 570, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        #endif
      } else {
        if (__pyx_t_4 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_4); __Pyx_INCREF(__pyx_t_2); __pyx_t_4++; if (unlikely(0 < 0)) __PYX_ERR(0, 570, __pyx_L1_error)
        #else
        __pyx_t_2 = PySequence_ITEM(__pyx_t_3, __pyx_t_4); __pyx_t_4++; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 570, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_2);
        #endif
      }
    } else {
      __pyx_t_2 = __pyx_t_5(__pyx_t_3);
      if (unlikely(!__pyx_t_2)) {
        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, 570, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_2);
    }
    if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
      PyObject* sequence = __pyx_t_2;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        __PYX_ERR(0, 570, __pyx_L1_error)
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_7);
      #else
      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 570, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 570, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      #endif
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_8 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 570, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_9 = Py_TYPE(__pyx_t_8)->tp_iternext;
      index = 0; __pyx_t_6 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_8); if (unlikely(!__pyx_t_7)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_7);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_8), 2) < 0) __PYX_ERR(0, 570, __pyx_L1_error)
      __pyx_t_9 = NULL;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_9 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      __PYX_ERR(0, 570, __pyx_L1_error)
      __pyx_L6_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_k, __pyx_t_6);
    __pyx_t_6 = 0;
    __Pyx_XDECREF_SET(__pyx_v_v, __pyx_t_7);
    __pyx_t_7 = 0;
/* … */
      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 570, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_k);
      __Pyx_GIVEREF(__pyx_v_k);
      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_k);
      __Pyx_INCREF(__pyx_v_v);
      __Pyx_GIVEREF(__pyx_v_v);
      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_v);
      if (unlikely(__Pyx_ListComp_Append(__pyx_t_1, (PyObject*)__pyx_t_2))) __PYX_ERR(0, 570, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_value_list = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+571:                    if v != '' ]
    __pyx_t_10 = (__Pyx_PyString_Equals(__pyx_v_v, __pyx_kp_s_iso88591_, Py_NE)); if (unlikely(__pyx_t_10 < 0)) __PYX_ERR(0, 571, __pyx_L1_error)
    if (__pyx_t_10) {
/* … */
    }
+572:     if not value_list:
  __pyx_t_10 = (__pyx_v_value_list != Py_None) && (PyList_GET_SIZE(__pyx_v_value_list) != 0);
  __pyx_t_11 = ((!__pyx_t_10) != 0);
  if (__pyx_t_11) {
/* … */
  }
+573:         return
    goto __pyx_L0;
 574: 
 575: 
+576:     cdef PartialSearchResult r_new = PartialSearchResult(r)
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 576, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)__pyx_v_r));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_r));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_r));
  __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult), __pyx_t_1, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 576, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_r_new = ((struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *)__pyx_t_3);
  __pyx_t_3 = 0;
 577: 
+578:     cdef double _score = penalize_non_mapped_keywords_(c, r_new)
  __pyx_v__score = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_non_mapped_keywords_(__pyx_v_c, __pyx_v_r_new, NULL);
 579: 
 580:     #TODO: struct can be transformed into dict automatically
+581:     result = {'score': _score,
  __pyx_t_3 = PyDict_New(); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v__score); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_score, __pyx_t_1) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+582:               'result_type': r.result_type,
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_result_type, __pyx_v_r->result_type) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
+583:               'input_values': value_list,
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_input_values, __pyx_v_value_list) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
+584:               'result_filters': tuple(r.greps),
  if (unlikely(__pyx_v_r->greps == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 584, __pyx_L1_error)
  }
  __pyx_t_1 = PyList_AsTuple(__pyx_v_r->greps); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 584, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_result_filters, __pyx_t_1) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+585:               'trace': tuple(r_new.trace + [('adjusted_score', _score),]),
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v__score); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_iso88591_adjusted_score);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_adjusted_score);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_iso88591_adjusted_score);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Add(__pyx_v_r_new->trace, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyList_AsTuple(((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 585, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_trace, __pyx_t_1) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+586:               'missing_inputs': []}
  __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 586, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_iso88591_missing_inputs, __pyx_t_1) < 0) __PYX_ERR(0, 581, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_result = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;
 587: 
+588:     heap_tuple = (_score, result)
  __pyx_t_3 = PyFloat_FromDouble(__pyx_v__score); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 588, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 588, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
  __Pyx_INCREF(__pyx_v_result);
  __Pyx_GIVEREF(__pyx_v_result);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_result);
  __pyx_t_3 = 0;
  __pyx_v_heap_tuple = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 589: 
+590:     if DEBUG:
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 590, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 590, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_11) {
/* … */
  }
+591:         print 'adding a result:'
    if (__Pyx_PrintOne(0, __pyx_kp_s_iso88591_adding_a_result) < 0) __PYX_ERR(0, 591, __pyx_L1_error)
+592:         print heap_tuple
    if (__Pyx_PrintOne(0, __pyx_v_heap_tuple) < 0) __PYX_ERR(0, 592, __pyx_L1_error)
 593: 
 594: 
 595:     # store only K-best results (if needed)
+596:     if not K_RESULTS_TO_STORE:
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_K_RESULTS_TO_STORE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_11 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_11 < 0)) __PYX_ERR(0, 596, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_10 = ((!__pyx_t_11) != 0);
  if (__pyx_t_10) {
/* … */
    goto __pyx_L10;
  }
+597:         thread_data.results.append(result)
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_thread_data); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 597, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_results); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 597, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = __Pyx_PyObject_Append(__pyx_t_3, __pyx_v_result); if (unlikely(__pyx_t_12 == -1)) __PYX_ERR(0, 597, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 598:     else:
+599:         if len(thread_data.results) > K_RESULTS_TO_STORE:
  /*else*/ {
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_thread_data); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_results); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = PyObject_Length(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_K_RESULTS_TO_STORE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_10 < 0)) __PYX_ERR(0, 599, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_10) {
/* … */
      goto __pyx_L11;
    }
 600:             # this adds the item, and removes the smallest
+601:             popped_out = heappushpop(thread_data.results, heap_tuple)
      __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_heappushpop); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_thread_data); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_results); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 601, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_1 = NULL;
      __pyx_t_4 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && 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;
        }
      }
      __pyx_t_6 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 601, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__pyx_t_1) {
        __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); __pyx_t_1 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_4, __pyx_t_7);
      __Pyx_INCREF(__pyx_v_heap_tuple);
      __Pyx_GIVEREF(__pyx_v_heap_tuple);
      PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_4, __pyx_v_heap_tuple);
      __pyx_t_7 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 601, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_popped_out = __pyx_t_2;
      __pyx_t_2 = 0;
 602:         else:
+603:             heappush(thread_data.results, heap_tuple)
    /*else*/ {
      __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_heappush); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 603, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_thread_data); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 603, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_results); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 603, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_6 = NULL;
      __pyx_t_4 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
          __pyx_t_4 = 1;
        }
      }
      __pyx_t_1 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 603, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (__pyx_t_6) {
        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __pyx_t_6 = NULL;
      }
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_4, __pyx_t_7);
      __Pyx_INCREF(__pyx_v_heap_tuple);
      __Pyx_GIVEREF(__pyx_v_heap_tuple);
      PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_4, __pyx_v_heap_tuple);
      __pyx_t_7 = 0;
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 603, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    }
    __pyx_L11:;
  }
  __pyx_L10:;
 604: 
 605: 
 606: 
+607: cdef inline double penalize_non_mapped_keywords_(QueryContext c, PartialSearchResult r,
static CYTHON_INLINE double __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_non_mapped_keywords_(struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_QueryContext *__pyx_v_c, struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_PartialSearchResult *__pyx_v_r, struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_non_mapped_keywords_ *__pyx_optional_args) {
/* … */
  /* 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_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.penalize_non_mapped_keywords_", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_keywords_used);
  __Pyx_XDECREF(__pyx_v_keywords_used_no_stopw);
  __Pyx_XDECREF(__pyx_v_score);
  __Pyx_XDECREF(__pyx_v_keywords_list);
  __Pyx_XDECREF(__pyx_v_n_total_kw);
  __Pyx_XDECREF(__pyx_v_n_kw_without_stopw);
  __Pyx_XDECREF(__pyx_v_n_kw_not_used);
  __Pyx_XDECREF(__pyx_v_n_not_mapped_all);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
struct __pyx_opt_args_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_non_mapped_keywords_ {
  int __pyx_n;
  PyObject *result_type;
};
+608:                                   result_type=False):
  PyObject *__pyx_v_result_type = ((PyObject *)Py_False);
  PyObject *__pyx_v_keywords_used = NULL;
  PyObject *__pyx_v_keywords_used_no_stopw = NULL;
  PyObject *__pyx_v_score = NULL;
  PyObject *__pyx_v_keywords_list = NULL;
  PyObject *__pyx_v_n_total_kw = NULL;
  PyObject *__pyx_v_n_kw_without_stopw = NULL;
  PyObject *__pyx_v_n_kw_not_used = NULL;
  double __pyx_v_dscore;
  PyObject *__pyx_v_n_not_mapped_all = NULL;
  int __pyx_v_r_type_specified;
  double __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("penalize_non_mapped_keywords_", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_result_type = __pyx_optional_args->result_type;
    }
  }
 609:     """
 610:     penalizes keywords that have not been mapped.
 611:     """
+612:     keywords_used = r.kw_used
  __pyx_t_1 = __pyx_v_r->kw_used;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_keywords_used = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+613:     keywords_used_no_stopw = filter_stopwords(r.kw_used)
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_filter_stopwords); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 613, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_r->kw_used); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 613, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 613, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_r->kw_used);
    __Pyx_GIVEREF(__pyx_v_r->kw_used);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_r->kw_used);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 613, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_keywords_used_no_stopw = __pyx_t_1;
  __pyx_t_1 = 0;
+614:     score = r.score
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_r->score); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 614, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_score = __pyx_t_1;
  __pyx_t_1 = 0;
 615: 
+616:     keywords_list= c.kw_list,
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 616, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_c->kw_list);
  __Pyx_GIVEREF(__pyx_v_c->kw_list);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_c->kw_list);
  __pyx_v_keywords_list = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 617: 
+618:     n_total_kw = c.n_kw
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_c->n_kw); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 618, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_n_total_kw = __pyx_t_1;
  __pyx_t_1 = 0;
+619:     n_kw_without_stopw = c.n_kw_uniq_no_stopw
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_c->n_kw_uniq_no_stopw); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 619, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_n_kw_without_stopw = __pyx_t_1;
  __pyx_t_1 = 0;
 620: 
 621:     # TODO: is keywords_used only non-stopword?!
 622:     # no,but sometimes a semi-stopword can be useful: where, when, .. in beginning of Q
 623: 
+624:     n_kw_not_used = max(n_kw_without_stopw - len(keywords_used_no_stopw), 0)
  __pyx_t_5 = 0;
  __pyx_t_6 = PyObject_Length(__pyx_v_keywords_used_no_stopw); if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 624, __pyx_L1_error)
  __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 624, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_n_kw_without_stopw, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 624, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_long(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 624, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_t_4, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 624, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 624, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_7) {
    __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 624, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = __pyx_t_3;
    __pyx_t_3 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_n_kw_not_used = __pyx_t_2;
  __pyx_t_2 = 0;
+625:     cdef double dscore = logprob(P_NOT_TAKEN) * n_kw_not_used
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_P_NOT_TAKEN); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 625, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(__pyx_t_8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 625, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_v_n_kw_not_used); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 625, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_dscore = __pyx_t_8;
 626: 
+627:     score += dscore
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_dscore); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 627, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_score, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 627, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF_SET(__pyx_v_score, __pyx_t_2);
  __pyx_t_2 = 0;
 628: 
 629:     # TODO: shall we map field>=value twice as in averaging approach? then not taking is penalized twice...
 630:     # we add the score twice anyways...!!!
 631:     # TODO: how about multi-keyword "qouted string"
 632: 
+633:     n_not_mapped_all = max(n_total_kw - len(keywords_used) - n_kw_not_used,0)
  __pyx_t_5 = 0;
  if (unlikely(__pyx_v_keywords_used == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 633, __pyx_L1_error)
  }
  __pyx_t_6 = PySet_GET_SIZE(__pyx_v_keywords_used); if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 633, __pyx_L1_error)
  __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_6); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_Subtract(__pyx_v_n_total_kw, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_v_n_kw_not_used); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyInt_From_long(__pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_t_2, Py_GT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 633, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_7) {
    __pyx_t_4 = __Pyx_PyInt_From_long(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 633, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_t_1;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_n_not_mapped_all = __pyx_t_2;
  __pyx_t_2 = 0;
+634:     r.trace += [
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 634, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_r->trace, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 634, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_r->trace);
  __Pyx_DECREF(__pyx_v_r->trace);
  __pyx_v_r->trace = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+635:         str(locals()),
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (((PyObject *)__pyx_v_c)) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_c, ((PyObject *)__pyx_v_c)) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_dscore); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (__pyx_t_1) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dscore, __pyx_t_1) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_v_keywords_list) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_keywords_list, __pyx_v_keywords_list) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_keywords_used) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_keywords_used, __pyx_v_keywords_used) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_keywords_used_no_stopw) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_keywords_used_no_stopw, __pyx_v_keywords_used_no_stopw) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_n_kw_not_used) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_n_kw_not_used, __pyx_v_n_kw_not_used) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_n_kw_without_stopw) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_n_kw_without_stopw, __pyx_v_n_kw_without_stopw) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_n_not_mapped_all) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_n_not_mapped_all, __pyx_v_n_not_mapped_all) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_n_total_kw) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_n_total_kw, __pyx_v_n_total_kw) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (((PyObject *)__pyx_v_r)) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_r, ((PyObject *)__pyx_v_r)) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_r_type_specified); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (__pyx_t_1) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_r_type_specified, __pyx_t_1) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_v_result_type) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_result_type, __pyx_v_result_type) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  if (__pyx_v_score) {
    if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_score, __pyx_v_score) < 0) __PYX_ERR(0, 635, __pyx_L1_error)
  }
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 635, __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_2 = __Pyx_PyObject_Call(((PyObject *)(&PyString_Type)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 635, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 636:     ]
+637:     score += logprob(P_NOT_TAKEN_STOPWORD) * n_not_mapped_all
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_P_NOT_TAKEN_STOPWORD); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 637, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(__pyx_t_8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_v_n_not_mapped_all); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_score, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF_SET(__pyx_v_score, __pyx_t_2);
  __pyx_t_2 = 0;
 638: 
 639: 
+640:     cdef bint r_type_specified = r.result_type and not r.result_type_enumerated
  __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_r->result_type); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 640, __pyx_L1_error)
  if (__pyx_t_9) {
  } else {
    __pyx_t_7 = __pyx_t_9;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_9 = ((!(__pyx_v_r->result_type_enumerated != 0)) != 0);
  __pyx_t_7 = __pyx_t_9;
  __pyx_L3_bool_binop_done:;
  __pyx_v_r_type_specified = __pyx_t_7;
+641:     if r_type_specified:
  __pyx_t_7 = (__pyx_v_r_type_specified != 0);
  if (__pyx_t_7) {
    goto __pyx_L5;
  }
 642:         pass
+643:     elif r.greps:
  __pyx_t_7 = (__pyx_v_r->greps != Py_None) && (PyList_GET_SIZE(__pyx_v_r->greps) != 0);
  if (__pyx_t_7) {
/* … */
    goto __pyx_L5;
  }
 644:         # grep (filter) is also sort of defining the result type, but not allways...
 645:         # this has already +/- accounted for result_type (probability was multiplied)
 646:         # we could add a high probability, so slightly favour explicit result types
+647:         score += logprob(0.8)
    __pyx_t_2 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(0.8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 647, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_score, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 647, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_score, __pyx_t_1);
    __pyx_t_1 = 0;
 648:     else:
+649:         score += logprob(P_NOT_SPECIFIED_RES_TYPE)
  /*else*/ {
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_P_NOT_SPECIFIED_RES_TYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 649, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 649, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyFloat_FromDouble(__pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(__pyx_t_8)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 649, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyNumber_InPlaceAdd(__pyx_v_score, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 649, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF_SET(__pyx_v_score, __pyx_t_2);
    __pyx_t_2 = 0;
  }
  __pyx_L5:;
 650: 
+651:     return score
  __pyx_t_8 = __pyx_PyFloat_AsDouble(__pyx_v_score); if (unlikely((__pyx_t_8 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 651, __pyx_L1_error)
  __pyx_r = __pyx_t_8;
  goto __pyx_L0;
 652: 
 653: 
+654: def normalization_factor_by_query_len(keywords_list):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_11normalization_factor_by_query_len(PyObject *__pyx_self, PyObject *__pyx_v_keywords_list); /*proto*/
static char __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_10normalization_factor_by_query_len[] = "\n    provides query score normalization factor (expected very good score)\n     based on query length (excluding stopwords).\n    keywords with operators get double score (as they are scored twice in the ranking)\n\n    TODO: multi word phrases get multiplied score as well\n\n    + 0.3 extra for entity_type and other boost features\n    ";
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_11normalization_factor_by_query_len = {"normalization_factor_by_query_len", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_11normalization_factor_by_query_len, METH_O, __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_10normalization_factor_by_query_len};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_11normalization_factor_by_query_len(PyObject *__pyx_self, PyObject *__pyx_v_keywords_list) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("normalization_factor_by_query_len (wrapper)", 0);
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_10normalization_factor_by_query_len(__pyx_self, ((PyObject *)__pyx_v_keywords_list));

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

static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_10normalization_factor_by_query_len(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_keywords_list) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("normalization_factor_by_query_len", 0);
/* … */
  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_n_s_keywords_list); if (unlikely(!__pyx_tuple__19)) __PYX_ERR(0, 654, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_11normalization_factor_by_query_len, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 654, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_normalization_factor_by_query_le, __pyx_t_2) < 0) __PYX_ERR(0, 654, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__20 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__19, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_normalization_factor_by_query_le, 654, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__20)) __PYX_ERR(0, 654, __pyx_L1_error)
 655:     """
 656:     provides query score normalization factor (expected very good score)
 657:      based on query length (excluding stopwords).
 658:     keywords with operators get double score (as they are scored twice in the ranking)
 659: 
 660:     TODO: multi word phrases get multiplied score as well
 661: 
 662:     + 0.3 extra for entity_type and other boost features
 663:     """
+664:     return 1.0 # probabilistic ranking only
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_float_1_0);
  __pyx_r = __pyx_float_1_0;
  goto __pyx_L0;
 665: 
 666: 
 667: # TODO: this has to be implemented in a better way
 668: # TODO: shall this go into entity_matcher directly?
 669: cdef bint _penalize_highly_possible_schema_terms_as_values_enabled = \
+670:     get_setting('DOWNRANK_TERMS_REFERRING_TO_SCHEMA')
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_setting); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely((__pyx_t_3 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 670, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__penalize_highly_possible_schema_terms_as_values_enabled = __pyx_t_3;
/* … */
  __pyx_tuple__21 = PyTuple_Pack(1, __pyx_n_s_iso88591_DOWNRANK_TERMS_REFERRING_TO_SCHE); if (unlikely(!__pyx_tuple__21)) __PYX_ERR(0, 670, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);
 671: 
 672: 
+673: def _penalise_subroutine_schematerms(keyword, schema_ws):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_13_penalise_subroutine_schematerms(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_13_penalise_subroutine_schematerms = {"_penalise_subroutine_schematerms", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_13_penalise_subroutine_schematerms, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_13_penalise_subroutine_schematerms(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_keyword = 0;
  PyObject *__pyx_v_schema_ws = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_penalise_subroutine_schematerms (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_keyword,&__pyx_n_s_schema_ws,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_keyword)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_schema_ws)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_penalise_subroutine_schematerms", 1, 2, 2, 1); __PYX_ERR(0, 673, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_penalise_subroutine_schematerms") < 0)) __PYX_ERR(0, 673, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_keyword = values[0];
    __pyx_v_schema_ws = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_penalise_subroutine_schematerms", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 673, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12_penalise_subroutine_schematerms(__pyx_self, __pyx_v_keyword, __pyx_v_schema_ws);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_12_penalise_subroutine_schematerms(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_keyword, PyObject *__pyx_v_schema_ws) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *__pyx_cur_scope;
  long __pyx_v__DEBUG;
  PyObject *__pyx_v_f_avg_score = NULL;
  PyObject *__pyx_v_avg_score = NULL;
  PyObject *__pyx_v_keyword_schema_score = NULL;
  PyObject *__pyx_v_keyword_scores = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_penalise_subroutine_schematerms", 0);
  __pyx_cur_scope = (struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *)__pyx_tp_new_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms(__pyx_ptype_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
/* … */
  /* 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_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_f_avg_score);
  __Pyx_XDECREF(__pyx_v_avg_score);
  __Pyx_XDECREF(__pyx_v_keyword_schema_score);
  __Pyx_XDECREF(__pyx_v_keyword_scores);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__22 = PyTuple_Pack(9, __pyx_n_s_keyword, __pyx_n_s_schema_ws, __pyx_n_s_DEBUG_2, __pyx_n_s_f_avg, __pyx_n_s_f_avg_2, __pyx_n_s_f_avg_score, __pyx_n_s_avg_score, __pyx_n_s_keyword_schema_score, __pyx_n_s_keyword_scores); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 673, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_13_penalise_subroutine_schematerms, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 673, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_penalise_subroutine_schematerms_3, __pyx_t_1) < 0) __PYX_ERR(0, 673, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(2, 0, 9, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_vk_CMS_DMWM_GIT_DAS_src_p, __pyx_n_s_penalise_subroutine_schematerms_3, 673, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 673, __pyx_L1_error)
/* … */
struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms {
  PyObject_HEAD
  PyObject *__pyx_v_f_avg;
  PyObject *__pyx_v_f_avg_;
};


+674:     _DEBUG = 0
  /* "DAS/keywordsearch/rankers/fast_recursive_ranker.pyx":674
 * 
 * def _penalise_subroutine_schematerms(keyword, schema_ws):
 *     _DEBUG = 0             # <<<<<<<<<<<<<<
 * 
 *     # e.g. configuration of dataset Zmmg-13Jul2012-v1 site=T1_* location is at T1_*
 */
  __pyx_v__DEBUG = 0;
 675: 
 676:     # e.g. configuration of dataset Zmmg-13Jul2012-v1 site=T1_* location is at T1_*
 677:     # 4.37: dataset dataset=*Zmmg-13Jul2012-v1* site=T1_*
 678:     # 4.37: dataset dataset=*dataset* site=T1_*
 679:     # I should look at distribution and compare with other keywords
+680:     f_avg_ = lambda items: len(items) and sum(items) / len(items) or None
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_lambda(PyObject *__pyx_self, PyObject *__pyx_v_items); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_lambda = {"lambda", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_lambda, METH_O, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_lambda(PyObject *__pyx_self, PyObject *__pyx_v_items) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda(__pyx_self, ((PyObject *)__pyx_v_items));

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

static PyObject *__pyx_lambda_funcdef_lambda(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_items) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyObject_Length(__pyx_v_items); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 680, __pyx_L1_error)
  if (!__pyx_t_2) {
    goto __pyx_L4_next_or;
  } else {
  }
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_INCREF(__pyx_v_items);
  __Pyx_GIVEREF(__pyx_v_items);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_items);
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_sum, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = PyObject_Length(__pyx_v_items); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 680, __pyx_L1_error)
  __pyx_t_3 = PyInt_FromSsize_t(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyNumber_Divide(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 680, __pyx_L1_error)
  if (!__pyx_t_6) {
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_5);
    __pyx_t_1 = __pyx_t_5;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_L4_next_or:;
  __Pyx_INCREF(Py_None);
  __pyx_t_1 = Py_None;
  __pyx_L3_bool_binop_done:;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms.lambda", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_lambda, 0, __pyx_n_s_penalise_subroutine_schematerms_2, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r, __pyx_d, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 680, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_f_avg_ = __pyx_t_1;
  __pyx_t_1 = 0;
+681:     f_avg = lambda items: f_avg_(filter(None, items))
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_1lambda1(PyObject *__pyx_self, PyObject *__pyx_v_items); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_1lambda1 = {"lambda1", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_1lambda1, METH_O, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_1lambda1(PyObject *__pyx_self, PyObject *__pyx_v_items) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self, ((PyObject *)__pyx_v_items));

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

static PyObject *__pyx_lambda_funcdef_lambda1(PyObject *__pyx_self, PyObject *__pyx_v_items) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *__pyx_cur_scope;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda1", 0);
  __pyx_outer_scope = (struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_1, 0, Py_None);
  __Pyx_INCREF(__pyx_v_items);
  __Pyx_GIVEREF(__pyx_v_items);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_items);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_filter, __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_cur_scope->__pyx_v_f_avg_)) { __Pyx_RaiseClosureNameError("f_avg_"); __PYX_ERR(0, 681, __pyx_L1_error) }
  __pyx_t_1 = __pyx_lambda_funcdef_lambda(__pyx_cur_scope->__pyx_v_f_avg_, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_1lambda1, 0, __pyx_n_s_penalise_subroutine_schematerms_2, ((PyObject*)__pyx_cur_scope), __pyx_n_s_DAS_keywordsearch_rankers_fast_r, __pyx_d, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 681, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_f_avg = __pyx_t_1;
  __pyx_t_1 = 0;
+682:     f_avg_score = lambda interpretations: f_avg(
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_2lambda2(PyObject *__pyx_self, PyObject *__pyx_v_interpretations); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_2lambda2 = {"lambda2", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_2lambda2, METH_O, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_2lambda2(PyObject *__pyx_self, PyObject *__pyx_v_interpretations) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda2 (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda2(__pyx_self, ((PyObject *)__pyx_v_interpretations));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_lambda_funcdef_lambda2(PyObject *__pyx_self, PyObject *__pyx_v_interpretations) {
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *__pyx_cur_scope;
  struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda2", 0);
  __pyx_outer_scope = (struct __pyx_obj_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker___pyx_scope_struct___penalise_subroutine_schematerms *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
  __Pyx_XDECREF(__pyx_r);
/* … */
  if (unlikely(!__pyx_cur_scope->__pyx_v_f_avg)) { __Pyx_RaiseClosureNameError("f_avg"); __PYX_ERR(0, 682, __pyx_L1_error) }
  __pyx_t_2 = __pyx_lambda_funcdef_lambda1(__pyx_cur_scope->__pyx_v_f_avg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms.lambda2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_2lambda2, 0, __pyx_n_s_penalise_subroutine_schematerms_2, ((PyObject*)__pyx_cur_scope), __pyx_n_s_DAS_keywordsearch_rankers_fast_r, __pyx_d, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 682, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_f_avg_score = __pyx_t_1;
  __pyx_t_1 = 0;
+683:         map(lambda item: item[0], interpretations))
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_7lambda2_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_item); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_7lambda2_lambda3 = {"lambda3", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_7lambda2_lambda3, METH_O, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_7lambda2_lambda3(PyObject *__pyx_self, PyObject *__pyx_v_item) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda3 (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda3(__pyx_self, ((PyObject *)__pyx_v_item));

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

static PyObject *__pyx_lambda_funcdef_lambda3(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_item) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda3", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_item, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._penalise_subroutine_schematerms.lambda2.lambda3", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_32_penalise_subroutine_schematerms_7lambda2_lambda3, 0, __pyx_n_s_penalise_subroutine_schematerms, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r, __pyx_d, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 683, __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_interpretations);
  __Pyx_GIVEREF(__pyx_v_interpretations);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_interpretations);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_map, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 683, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 684:     # global average schema score
+685:     avg_score = f_avg([f_avg_score(keyword_scores)
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 685, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
/* … */
    __pyx_t_3 = __pyx_lambda_funcdef_lambda2(__pyx_v_f_avg_score, __pyx_v_keyword_scores); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 685, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (unlikely(__Pyx_ListComp_Append(__pyx_t_2, (PyObject*)__pyx_t_3))) __PYX_ERR(0, 685, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
/* … */
  __pyx_t_4 = __pyx_lambda_funcdef_lambda1(__pyx_cur_scope->__pyx_v_f_avg, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 685, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 685, __pyx_L1_error)
  if (!__pyx_t_8) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L3_bool_binop_done;
  }
+686:                        for keyword_scores in schema_ws.values()]) or 0.0
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_schema_ws, __pyx_n_s_values); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && 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, 686, __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, 686, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) {
    __pyx_t_4 = __pyx_t_3; __Pyx_INCREF(__pyx_t_4); __pyx_t_6 = 0;
    __pyx_t_7 = NULL;
  } else {
    __pyx_t_6 = -1; __pyx_t_4 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 686, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_7 = Py_TYPE(__pyx_t_4)->tp_iternext; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 686, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  for (;;) {
    if (likely(!__pyx_t_7)) {
      if (likely(PyList_CheckExact(__pyx_t_4))) {
        if (__pyx_t_6 >= PyList_GET_SIZE(__pyx_t_4)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_4, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 686, __pyx_L1_error)
        #else
        __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 686, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        #endif
      } else {
        if (__pyx_t_6 >= PyTuple_GET_SIZE(__pyx_t_4)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_4, __pyx_t_6); __Pyx_INCREF(__pyx_t_3); __pyx_t_6++; if (unlikely(0 < 0)) __PYX_ERR(0, 686, __pyx_L1_error)
        #else
        __pyx_t_3 = PySequence_ITEM(__pyx_t_4, __pyx_t_6); __pyx_t_6++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 686, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        #endif
      }
    } else {
      __pyx_t_3 = __pyx_t_7(__pyx_t_4);
      if (unlikely(!__pyx_t_3)) {
        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, 686, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_3);
    }
    __Pyx_XDECREF_SET(__pyx_v_keyword_scores, __pyx_t_3);
    __pyx_t_3 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_t_4 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 686, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_L3_bool_binop_done:;
  __pyx_v_avg_score = __pyx_t_1;
  __pyx_t_1 = 0;
 687:     # average score for this keyword
+688:     keyword_schema_score = f_avg_score(schema_ws[keyword]) or 0.0
  __pyx_t_4 = PyObject_GetItem(__pyx_v_schema_ws, __pyx_v_keyword); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __pyx_lambda_funcdef_lambda2(__pyx_v_f_avg_score, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 688, __pyx_L1_error)
  if (!__pyx_t_8) {
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    goto __pyx_L7_bool_binop_done;
  }
  __pyx_t_2 = PyFloat_FromDouble(0.0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 688, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_L7_bool_binop_done:;
  __pyx_v_keyword_schema_score = __pyx_t_1;
  __pyx_t_1 = 0;
+689:     if _DEBUG:
  __pyx_t_8 = (__pyx_v__DEBUG != 0);
  if (__pyx_t_8) {
/* … */
  }
+690:         print "avg schema score for '%s' is %.2f; avg schema = %.2f " % (
    __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_iso88591_avg_schema_score_for_s_is_2f_avg, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 690, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (__Pyx_PrintOne(0, __pyx_t_2) < 0) __PYX_ERR(0, 690, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+691:             keyword, keyword_schema_score, avg_score)
    __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 691, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_keyword);
    __Pyx_GIVEREF(__pyx_v_keyword);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_keyword);
    __Pyx_INCREF(__pyx_v_keyword_schema_score);
    __Pyx_GIVEREF(__pyx_v_keyword_schema_score);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_keyword_schema_score);
    __Pyx_INCREF(__pyx_v_avg_score);
    __Pyx_GIVEREF(__pyx_v_avg_score);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_avg_score);
+692:     if avg_score < keyword_schema_score:
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_avg_score, __pyx_v_keyword_schema_score, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 692, __pyx_L1_error)
  __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 692, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_8) {
/* … */
  }
+693:         return 3 * min(-0.5, -(keyword_schema_score - avg_score))
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = PyNumber_Subtract(__pyx_v_keyword_schema_score, __pyx_v_avg_score); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyNumber_Negative(__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_9 = -0.5;
    __pyx_t_4 = PyFloat_FromDouble(__pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyObject_RichCompare(__pyx_t_1, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (__pyx_t_8) {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_2 = __pyx_t_1;
    } else {
      __pyx_t_3 = PyFloat_FromDouble(__pyx_t_9); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 693, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_2 = __pyx_t_3;
      __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Multiply(__pyx_int_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 694:     else:
+695:         return 0.0
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_float_0_0);
    __pyx_r = __pyx_float_0_0;
    goto __pyx_L0;
  }
 696: 
 697: 
 698: 
 699: 
+700: def _get_reserved_terms(stem=False):
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_15_get_reserved_terms(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_14_get_reserved_terms[] = "\n    terms that shall be down-ranked if contained in values or in grep-field names\n    ";
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_15_get_reserved_terms = {"_get_reserved_terms", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_15_get_reserved_terms, METH_VARARGS|METH_KEYWORDS, __pyx_doc_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_14_get_reserved_terms};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_15_get_reserved_terms(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_stem = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_get_reserved_terms (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_stem,0};
    PyObject* values[1] = {0};
    values[0] = ((PyObject *)Py_False);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_stem);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_get_reserved_terms") < 0)) __PYX_ERR(0, 700, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_stem = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_get_reserved_terms", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 700, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._get_reserved_terms", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_14_get_reserved_terms(__pyx_self, __pyx_v_stem);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
static PyObject *__pyx_pf_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_14_get_reserved_terms(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_stem) {
  PyObject *__pyx_v_entities = NULL;
  PyObject *__pyx_v_operators = NULL;
  PyObject *__pyx_v_r = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_get_reserved_terms", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("DAS.keywordsearch.rankers.fast_recursive_ranker._get_reserved_terms", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_entities);
  __Pyx_XDECREF(__pyx_v_operators);
  __Pyx_XDECREF(__pyx_v_r);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__24 = PyTuple_Pack(4, __pyx_n_s_stem, __pyx_n_s_entities, __pyx_n_s_operators, __pyx_n_s_r); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
/* … */
  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_15_get_reserved_terms, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 700, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_reserved_terms, __pyx_t_1) < 0) __PYX_ERR(0, 700, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 701:     """
 702:     terms that shall be down-ranked if contained in values or in grep-field names
 703:     """
 704:     # TODO: list of entities shall be taken from das_schema_adapter
+705:     entities = ['dataset', 'run', 'block', 'file', 'site', 'config', 'time',
  __pyx_t_1 = PyList_New(8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 705, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_iso88591_dataset);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_dataset);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_iso88591_dataset);
  __Pyx_INCREF(__pyx_n_s_iso88591_run);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_run);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_iso88591_run);
  __Pyx_INCREF(__pyx_n_s_iso88591_block);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_block);
  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_iso88591_block);
  __Pyx_INCREF(__pyx_n_s_iso88591_file);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_file);
  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_iso88591_file);
  __Pyx_INCREF(__pyx_n_s_iso88591_site);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_site);
  PyList_SET_ITEM(__pyx_t_1, 4, __pyx_n_s_iso88591_site);
  __Pyx_INCREF(__pyx_n_s_iso88591_config);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_config);
  PyList_SET_ITEM(__pyx_t_1, 5, __pyx_n_s_iso88591_config);
  __Pyx_INCREF(__pyx_n_s_iso88591_time);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_time);
  PyList_SET_ITEM(__pyx_t_1, 6, __pyx_n_s_iso88591_time);
  __Pyx_INCREF(__pyx_n_s_iso88591_lumi);
  __Pyx_GIVEREF(__pyx_n_s_iso88591_lumi);
  PyList_SET_ITEM(__pyx_t_1, 7, __pyx_n_s_iso88591_lumi);
  __pyx_v_entities = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 706:                 'lumi']
+707:     operators = das_ql.get_operator_synonyms()
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_das_ql); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 707, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_get_operator_synonyms); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 707, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && 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);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 707, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 707, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_operators = __pyx_t_1;
  __pyx_t_1 = 0;
+708:     r = set(entities) | set(operators)
  __pyx_t_1 = PySet_New(__pyx_v_entities); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 708, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PySet_New(__pyx_v_operators); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 708, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyNumber_Or(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 708, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_r = __pyx_t_2;
  __pyx_t_2 = 0;
 709: 
+710:     if stem:
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_stem); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 710, __pyx_L1_error)
  if (__pyx_t_4) {
/* … */
  }
+711:         r = map(lambda w: getstem(w), r)
/* Python wrapper */
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19_get_reserved_terms_lambda4(PyObject *__pyx_self, PyObject *__pyx_v_w); /*proto*/
static PyMethodDef __pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19_get_reserved_terms_lambda4 = {"lambda4", (PyCFunction)__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19_get_reserved_terms_lambda4, METH_O, 0};
static PyObject *__pyx_pw_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19_get_reserved_terms_lambda4(PyObject *__pyx_self, PyObject *__pyx_v_w) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda4 (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda4(__pyx_self, ((PyObject *)__pyx_v_w));

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

static PyObject *__pyx_lambda_funcdef_lambda4(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_w) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda4", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_getstem); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 711, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_w); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_w);
    __Pyx_GIVEREF(__pyx_v_w);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_w);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* 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("DAS.keywordsearch.rankers.fast_recursive_ranker._get_reserved_terms.lambda4", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
    __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_19_get_reserved_terms_lambda4, 0, __pyx_n_s_get_reserved_terms_locals_lambd, NULL, __pyx_n_s_DAS_keywordsearch_rankers_fast_r, __pyx_d, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
    __Pyx_INCREF(__pyx_v_r);
    __Pyx_GIVEREF(__pyx_v_r);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_r);
    __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_map, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 711, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF_SET(__pyx_v_r, __pyx_t_2);
    __pyx_t_2 = 0;
+712:     return set(r)
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PySet_New(__pyx_v_r); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 712, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 713: 
+714: cdef set _reserved_terms = _get_reserved_terms(stem=False)
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_reserved_terms); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_stem, Py_False) < 0) __PYX_ERR(0, 714, __pyx_L1_error)
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 714, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!(likely(PySet_CheckExact(__pyx_t_4))||((__pyx_t_4) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_t_4)->tp_name), 0))) __PYX_ERR(0, 714, __pyx_L1_error)
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms, ((PyObject*)__pyx_t_4));
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
+715: cdef set _reserved_terms_stemed = _get_reserved_terms(stem=True)
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_reserved_terms); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 715, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 715, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_stem, Py_True) < 0) __PYX_ERR(0, 715, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_empty_tuple, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 715, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "set", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(0, 715, __pyx_L1_error)
  __Pyx_XGOTREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed);
  __Pyx_DECREF_SET(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed, ((PyObject*)__pyx_t_1));
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
 716: 
 717: 
+718: cdef double penalize_highly_possible_schema_terms_as_values(keyword, schema_ws):
static double __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_penalize_highly_possible_schema_terms_as_values(PyObject *__pyx_v_keyword, PyObject *__pyx_v_schema_ws) {
  double __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("penalize_highly_possible_schema_terms_as_values", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_WriteUnraisable("DAS.keywordsearch.rankers.fast_recursive_ranker.penalize_highly_possible_schema_terms_as_values", __pyx_clineno, __pyx_lineno, __pyx_filename, 0, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 719:     """
 720:     it is important to avoid missclassifying dataset, run as values.
 721:     these shall be allowed only if explicitly requested.
 722:     """
 723: 
+724:     if not _penalize_highly_possible_schema_terms_as_values_enabled:
  __pyx_t_1 = ((!(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__penalize_highly_possible_schema_terms_as_values_enabled != 0)) != 0);
  if (__pyx_t_1) {
/* … */
  }
+725:         return 0.0
    __pyx_r = 0.0;
    goto __pyx_L0;
 726: 
 727:     # TODO: this is just a quick workaround
+728:     if keyword in _reserved_terms: #['dataset', 'run', 'block', 'file', 'site']:
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_v_keyword, __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms, Py_EQ)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 728, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {
/* … */
  }
 729:         # TODO: each reserved term shall have a different weight, e.g. operators lower than entity?
+730:         return logprob(-5.0)
    __pyx_r = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(-5.0);
    goto __pyx_L0;
 731: 
+732:     if DEBUG: print '_get_reserved_terms(stem=True):', _reserved_terms_stemed
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_DEBUG); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 732, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 732, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 732, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_kp_s_iso88591_get_reserved_terms_stem_True);
    __Pyx_GIVEREF(__pyx_kp_s_iso88591_get_reserved_terms_stem_True);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_kp_s_iso88591_get_reserved_terms_stem_True);
    __Pyx_INCREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed);
    __Pyx_GIVEREF(__pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed);
    if (__Pyx_Print(0, __pyx_t_3, 1) < 0) __PYX_ERR(0, 732, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
 733: 
+734:     if not ' ' in keyword and getstem(keyword) in _reserved_terms_stemed: #['dataset', 'run', 'block', 'file', 'site']:
  __pyx_t_1 = (__Pyx_PySequence_ContainsTF(__pyx_kp_s_iso88591__10, __pyx_v_keyword, Py_NE)); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 734, __pyx_L1_error)
  __pyx_t_4 = (__pyx_t_1 != 0);
  if (__pyx_t_4) {
  } else {
    __pyx_t_2 = __pyx_t_4;
    goto __pyx_L7_bool_binop_done;
  }
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_getstem); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 734, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  if (!__pyx_t_6) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_keyword); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 734, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 734, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
    __Pyx_INCREF(__pyx_v_keyword);
    __Pyx_GIVEREF(__pyx_v_keyword);
    PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_keyword);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 734, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_4 = (__Pyx_PySequence_ContainsTF(__pyx_t_3, __pyx_v_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker__reserved_terms_stemed, Py_EQ)); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 734, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_1 = (__pyx_t_4 != 0);
  __pyx_t_2 = __pyx_t_1;
  __pyx_L7_bool_binop_done:;
  if (__pyx_t_2) {
/* … */
  }
 735:         # TODO: each reserved term shall have a different weight, e.g. operators lower than entity?
+736:         return logprob(-3.0)
    __pyx_r = __pyx_f_3DAS_13keywordsearch_7rankers_21fast_recursive_ranker_logprob(-3.0);
    goto __pyx_L0;
 737: 
+738:     if schema_ws:
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_schema_ws); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 738, __pyx_L1_error)
  if (__pyx_t_2) {
/* … */
  }
+739:         return _penalise_subroutine_schematerms(keyword, schema_ws)
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_penalise_subroutine_schematerms_3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 739, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_7 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(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);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 739, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_7) {
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7); __pyx_t_7 = NULL;
    }
    __Pyx_INCREF(__pyx_v_keyword);
    __Pyx_GIVEREF(__pyx_v_keyword);
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_8, __pyx_v_keyword);
    __Pyx_INCREF(__pyx_v_schema_ws);
    __Pyx_GIVEREF(__pyx_v_schema_ws);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_8, __pyx_v_schema_ws);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 739, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_9 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_9 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 739, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_9;
    goto __pyx_L0;
 740: 
+741:     return 0.0
  __pyx_r = 0.0;
  goto __pyx_L0;
 742: 
 743: