Generated by Cython 0.29.23

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

 001: # coding: utf-8
 002: # cython: language_level=3, linetrace=True
 003: 
 004: cimport openmp
 005: from cython.parallel import prange
 006: from libc.stdlib cimport malloc, free
 007: from libc.stdio cimport printf
 008: from libeasel.sq cimport ESL_SQ
 009: 
 010: IF HMMER_IMPL == "VMX":
 011:     from libhmmer.impl_vmx cimport p7_oprofile
 012: ELIF HMMER_IMPL == "SSE":
 013:     from libhmmer.impl_sse cimport p7_oprofile
 014: 
 015: from .easel cimport Alphabet, SequenceFile, DigitalSequence
 016: from .plan7 cimport Background, HMM, Pipeline, Profile, OptimizedProfile, TopHits
 017: 
+018: import queue
  __Pyx_TraceLine(18,0,__PYX_ERR(0, 18, __pyx_L1_error))
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_queue, 0, 0); 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_queue, __pyx_t_1) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+019: from .utils import peekable
  __Pyx_TraceLine(19,0,__PYX_ERR(0, 19, __pyx_L1_error))
  __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_peekable);
  __Pyx_GIVEREF(__pyx_n_s_peekable);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_peekable);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_utils, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __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_peekable); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_peekable, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 020: 
 021: 
 022: 
 023: cdef class _HMMSearch:
 024: 
+025:     def __init__(self, queries, sequences, cpus=0, callback=None, blocksize=100, **options):
/* Python wrapper */
static int __pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_queries = 0;
  PyObject *__pyx_v_sequences = 0;
  PyObject *__pyx_v_cpus = 0;
  PyObject *__pyx_v_callback = 0;
  PyObject *__pyx_v_blocksize = 0;
  PyObject *__pyx_v_options = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  __pyx_v_options = PyDict_New(); if (unlikely(!__pyx_v_options)) return -1;
  __Pyx_GOTREF(__pyx_v_options);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_queries,&__pyx_n_s_sequences,&__pyx_n_s_cpus,&__pyx_n_s_callback,&__pyx_n_s_blocksize,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[2] = ((PyObject *)__pyx_int_0);
    values[3] = ((PyObject *)Py_None);
    values[4] = ((PyObject *)__pyx_int_100);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_queries)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_sequences)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 5, 1); __PYX_ERR(0, 25, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_cpus);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_callback);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_blocksize);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_options, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 25, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_queries = values[0];
    __pyx_v_sequences = values[1];
    __pyx_v_cpus = values[2];
    __pyx_v_callback = values[3];
    __pyx_v_blocksize = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 25, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_options); __pyx_v_options = 0;
  __Pyx_AddTraceback("pyhmmer._hpc._HMMSearch.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch___init__(((struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *)__pyx_v_self), __pyx_v_queries, __pyx_v_sequences, __pyx_v_cpus, __pyx_v_callback, __pyx_v_blocksize, __pyx_v_options);

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

static int __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch___init__(struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *__pyx_v_self, PyObject *__pyx_v_queries, PyObject *__pyx_v_sequences, PyObject *__pyx_v_cpus, PyObject *__pyx_v_callback, PyObject *__pyx_v_blocksize, PyObject *__pyx_v_options) {
  struct __pyx_obj_7pyhmmer_5easel_DigitalSequence *__pyx_v_seq = 0;
  struct __pyx_obj_7pyhmmer_5plan7_Profile *__pyx_v_profile = 0;
  struct __pyx_obj_7pyhmmer_5plan7_OptimizedProfile *__pyx_v_oprofile = 0;
  struct __pyx_obj_7pyhmmer_5plan7_Pipeline *__pyx_v_pipeline = 0;
  PyObject *__pyx_v_i = NULL;
  int __pyx_r;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__", 0);
  __Pyx_TraceCall("__init__", __pyx_f[0], 25, 0, __PYX_ERR(0, 25, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_15);
  __Pyx_AddTraceback("pyhmmer._hpc._HMMSearch.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_seq);
  __Pyx_XDECREF((PyObject *)__pyx_v_profile);
  __Pyx_XDECREF((PyObject *)__pyx_v_oprofile);
  __Pyx_XDECREF((PyObject *)__pyx_v_pipeline);
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 026: 
 027:         cdef DigitalSequence  seq
 028:         cdef Profile          profile
 029:         cdef OptimizedProfile oprofile
 030:         cdef Pipeline         pipeline
 031: 
+032:         self.queries = peekable(queries)
  __Pyx_TraceLine(32,0,__PYX_ERR(0, 32, __pyx_L1_error))
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_peekable); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 32, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_v_queries) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_queries);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 32, __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->queries);
  __Pyx_DECREF(__pyx_v_self->queries);
  __pyx_v_self->queries = __pyx_t_1;
  __pyx_t_1 = 0;
+033:         self.sequences = list(sequences)
  __Pyx_TraceLine(33,0,__PYX_ERR(0, 33, __pyx_L1_error))
  __pyx_t_1 = PySequence_List(__pyx_v_sequences); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 33, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->sequences);
  __Pyx_DECREF(__pyx_v_self->sequences);
  __pyx_v_self->sequences = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+034:         self.alphabet = self.queries.peek().alphabet
  __Pyx_TraceLine(34,0,__PYX_ERR(0, 34, __pyx_L1_error))
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->queries, __pyx_n_s_peek); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_alphabet); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_7pyhmmer_5easel_Alphabet))))) __PYX_ERR(0, 34, __pyx_L1_error)
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->alphabet);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->alphabet));
  __pyx_v_self->alphabet = ((struct __pyx_obj_7pyhmmer_5easel_Alphabet *)__pyx_t_2);
  __pyx_t_2 = 0;
+035:         self.cpus = cpus if cpus > 0 else openmp.omp_get_max_threads()
  __Pyx_TraceLine(35,0,__PYX_ERR(0, 35, __pyx_L1_error))
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_cpus, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error)
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 35, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_5) {
    __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_cpus); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 35, __pyx_L1_error)
    __pyx_t_4 = __pyx_t_6;
  } else {
    __pyx_t_4 = omp_get_max_threads();
  }
  __pyx_v_self->cpus = __pyx_t_4;
+036:         self.callback = callback
  __Pyx_TraceLine(36,0,__PYX_ERR(0, 36, __pyx_L1_error))
  __Pyx_INCREF(__pyx_v_callback);
  __Pyx_GIVEREF(__pyx_v_callback);
  __Pyx_GOTREF(__pyx_v_self->callback);
  __Pyx_DECREF(__pyx_v_self->callback);
  __pyx_v_self->callback = __pyx_v_callback;
+037:         self.blocksize = blocksize
  __Pyx_TraceLine(37,0,__PYX_ERR(0, 37, __pyx_L1_error))
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_blocksize); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 37, __pyx_L1_error)
  __pyx_v_self->blocksize = __pyx_t_4;
 038: 
 039:         # create one pipeline for each CPU
+040:         self._pipelines = <P7_PIPELINE**> malloc(sizeof(P7_PIPELINE*) * self.cpus * self.blocksize)
  __Pyx_TraceLine(40,0,__PYX_ERR(0, 40, __pyx_L1_error))
  __pyx_v_self->_pipelines = ((P7_PIPELINE **)malloc((((sizeof(P7_PIPELINE *)) * __pyx_v_self->cpus) * __pyx_v_self->blocksize)));
+041:         self.pipelines = []
  __Pyx_TraceLine(41,0,__PYX_ERR(0, 41, __pyx_L1_error))
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 41, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->pipelines);
  __Pyx_DECREF(__pyx_v_self->pipelines);
  __pyx_v_self->pipelines = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+042:         for i in range(self.cpus * self.blocksize):
  __Pyx_TraceLine(42,0,__PYX_ERR(0, 42, __pyx_L1_error))
  __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->cpus * __pyx_v_self->blocksize)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 42, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __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_7 = 0;
    __pyx_t_8 = NULL;
  } else {
    __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 42, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 42, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_8)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 42, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 42, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_8(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 42, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_1);
    __pyx_t_1 = 0;
/* … */
    __Pyx_TraceLine(42,0,__PYX_ERR(0, 42, __pyx_L1_error))
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+043:             pipeline = Pipeline(alphabet=self.alphabet, **options)
    __Pyx_TraceLine(43,0,__PYX_ERR(0, 43, __pyx_L1_error))
    __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_alphabet, ((PyObject *)__pyx_v_self->alphabet)) < 0) __PYX_ERR(0, 43, __pyx_L1_error)
    __pyx_t_1 = __pyx_t_3;
    __pyx_t_3 = 0;
    if (__Pyx_MergeKeywords(__pyx_t_1, __pyx_v_options) < 0) __PYX_ERR(0, 43, __pyx_L1_error)
    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_Pipeline), __pyx_empty_tuple, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 43, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF_SET(__pyx_v_pipeline, ((struct __pyx_obj_7pyhmmer_5plan7_Pipeline *)__pyx_t_3));
    __pyx_t_3 = 0;
+044:             self.pipelines.append(pipeline)
    __Pyx_TraceLine(44,0,__PYX_ERR(0, 44, __pyx_L1_error))
    if (unlikely(__pyx_v_self->pipelines == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
      __PYX_ERR(0, 44, __pyx_L1_error)
    }
    __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_self->pipelines, ((PyObject *)__pyx_v_pipeline)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 44, __pyx_L1_error)
+045:             self._pipelines[i] = pipeline._pli
    __Pyx_TraceLine(45,0,__PYX_ERR(0, 45, __pyx_L1_error))
    __pyx_t_10 = __pyx_v_pipeline->_pli;
    __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L1_error)
    (__pyx_v_self->_pipelines[__pyx_t_11]) = __pyx_t_10;
 046: 
 047:         # store background model
+048:         self.background = Background(self.alphabet)
  __Pyx_TraceLine(48,0,__PYX_ERR(0, 48, __pyx_L1_error))
  __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_Background), ((PyObject *)__pyx_v_self->alphabet)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->background);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->background));
  __pyx_v_self->background = ((struct __pyx_obj_7pyhmmer_5plan7_Background *)__pyx_t_2);
  __pyx_t_2 = 0;
+049:         self._background = self.background._bg
  __Pyx_TraceLine(49,0,__PYX_ERR(0, 49, __pyx_L1_error))
  __pyx_t_12 = __pyx_v_self->background->_bg;
  __pyx_v_self->_background = __pyx_t_12;
 050: 
 051:         # store sequences
+052:         self._sequences = <ESL_SQ**> malloc(sizeof(ESL_SQ*) * (len(self.sequences) + 1))
  __Pyx_TraceLine(52,0,__PYX_ERR(0, 52, __pyx_L1_error))
  __pyx_t_2 = __pyx_v_self->sequences;
  __Pyx_INCREF(__pyx_t_2);
  if (unlikely(__pyx_t_2 == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 52, __pyx_L1_error)
  }
  __pyx_t_7 = PyList_GET_SIZE(__pyx_t_2); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 52, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_self->_sequences = ((ESL_SQ **)malloc(((sizeof(ESL_SQ *)) * (__pyx_t_7 + 1))));
+053:         for i, seq in enumerate(sequences):
  __Pyx_TraceLine(53,0,__PYX_ERR(0, 53, __pyx_L1_error))
  __Pyx_INCREF(__pyx_int_0);
  __pyx_t_2 = __pyx_int_0;
  if (likely(PyList_CheckExact(__pyx_v_sequences)) || PyTuple_CheckExact(__pyx_v_sequences)) {
    __pyx_t_3 = __pyx_v_sequences; __Pyx_INCREF(__pyx_t_3); __pyx_t_7 = 0;
    __pyx_t_8 = NULL;
  } else {
    __pyx_t_7 = -1; __pyx_t_3 = PyObject_GetIter(__pyx_v_sequences); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 53, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_8 = Py_TYPE(__pyx_t_3)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 53, __pyx_L1_error)
  }
  for (;;) {
    if (likely(!__pyx_t_8)) {
      if (likely(PyList_CheckExact(__pyx_t_3))) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 53, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_3)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_3, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 53, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_3, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_8(__pyx_t_3);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 53, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7pyhmmer_5easel_DigitalSequence))))) __PYX_ERR(0, 53, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_seq, ((struct __pyx_obj_7pyhmmer_5easel_DigitalSequence *)__pyx_t_1));
    __pyx_t_1 = 0;
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_2);
    __pyx_t_1 = __Pyx_PyInt_AddObjC(__pyx_t_2, __pyx_int_1, 1, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 53, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2);
    __pyx_t_2 = __pyx_t_1;
    __pyx_t_1 = 0;
/* … */
    __Pyx_TraceLine(53,0,__PYX_ERR(0, 53, __pyx_L1_error))
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+054:             self._sequences[i] = seq._sq
    __Pyx_TraceLine(54,0,__PYX_ERR(0, 54, __pyx_L1_error))
    __pyx_t_13 = __pyx_v_seq->__pyx_base._sq;
    __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 54, __pyx_L1_error)
    (__pyx_v_self->_sequences[__pyx_t_11]) = __pyx_t_13;
+055:         self._sequences[len(self.sequences)] = NULL
  __Pyx_TraceLine(55,0,__PYX_ERR(0, 55, __pyx_L1_error))
  __pyx_t_2 = __pyx_v_self->sequences;
  __Pyx_INCREF(__pyx_t_2);
  if (unlikely(__pyx_t_2 == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 55, __pyx_L1_error)
  }
  __pyx_t_7 = PyList_GET_SIZE(__pyx_t_2); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 55, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  (__pyx_v_self->_sequences[__pyx_t_7]) = NULL;
 056: 
 057:         # create buffers to store profiles
+058:         self._profiles = <P7_PROFILE**> malloc(sizeof(P7_PROFILE*) * self.cpus * self.blocksize)
  __Pyx_TraceLine(58,0,__PYX_ERR(0, 58, __pyx_L1_error))
  __pyx_v_self->_profiles = ((P7_PROFILE **)malloc((((sizeof(P7_PROFILE *)) * __pyx_v_self->cpus) * __pyx_v_self->blocksize)));
+059:         self.profiles = []
  __Pyx_TraceLine(59,0,__PYX_ERR(0, 59, __pyx_L1_error))
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 59, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->profiles);
  __Pyx_DECREF(__pyx_v_self->profiles);
  __pyx_v_self->profiles = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+060:         for i in range(self.cpus * self.blocksize):
  __Pyx_TraceLine(60,0,__PYX_ERR(0, 60, __pyx_L1_error))
  __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->cpus * __pyx_v_self->blocksize)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (likely(PyList_CheckExact(__pyx_t_3)) || PyTuple_CheckExact(__pyx_t_3)) {
    __pyx_t_2 = __pyx_t_3; __Pyx_INCREF(__pyx_t_2); __pyx_t_7 = 0;
    __pyx_t_8 = NULL;
  } else {
    __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 60, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 60, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  for (;;) {
    if (likely(!__pyx_t_8)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_3 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_3); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 60, __pyx_L1_error)
        #else
        __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        #endif
      } else {
        if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_3); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 60, __pyx_L1_error)
        #else
        __pyx_t_3 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 60, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_3);
        #endif
      }
    } else {
      __pyx_t_3 = __pyx_t_8(__pyx_t_2);
      if (unlikely(!__pyx_t_3)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 60, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_3);
    }
    __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_3);
    __pyx_t_3 = 0;
/* … */
    __Pyx_TraceLine(60,0,__PYX_ERR(0, 60, __pyx_L1_error))
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+061:             profile = Profile(200, self.alphabet)
    __Pyx_TraceLine(61,0,__PYX_ERR(0, 61, __pyx_L1_error))
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_int_200);
    __Pyx_GIVEREF(__pyx_int_200);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_int_200);
    __Pyx_INCREF(((PyObject *)__pyx_v_self->alphabet));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_self->alphabet));
    PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_self->alphabet));
    __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_Profile), __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF_SET(__pyx_v_profile, ((struct __pyx_obj_7pyhmmer_5plan7_Profile *)__pyx_t_1));
    __pyx_t_1 = 0;
+062:             self.profiles.append(profile)
    __Pyx_TraceLine(62,0,__PYX_ERR(0, 62, __pyx_L1_error))
    if (unlikely(__pyx_v_self->profiles == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
      __PYX_ERR(0, 62, __pyx_L1_error)
    }
    __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_self->profiles, ((PyObject *)__pyx_v_profile)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 62, __pyx_L1_error)
+063:             self._profiles[i] = profile._gm
    __Pyx_TraceLine(63,0,__PYX_ERR(0, 63, __pyx_L1_error))
    __pyx_t_14 = __pyx_v_profile->_gm;
    __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 63, __pyx_L1_error)
    (__pyx_v_self->_profiles[__pyx_t_11]) = __pyx_t_14;
 064: 
 065:         # create buffers to store optimized profiles
+066:         self._oprofiles = <P7_OPROFILE**> malloc(sizeof(P7_OPROFILE*) * self.cpus * self.blocksize)
  __Pyx_TraceLine(66,0,__PYX_ERR(0, 66, __pyx_L1_error))
  __pyx_v_self->_oprofiles = ((P7_OPROFILE **)malloc((((sizeof(P7_OPROFILE *)) * __pyx_v_self->cpus) * __pyx_v_self->blocksize)));
+067:         self.oprofiles = []
  __Pyx_TraceLine(67,0,__PYX_ERR(0, 67, __pyx_L1_error))
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 67, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->oprofiles);
  __Pyx_DECREF(__pyx_v_self->oprofiles);
  __pyx_v_self->oprofiles = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+068:         for i in range(self.cpus * self.blocksize):
  __Pyx_TraceLine(68,0,__PYX_ERR(0, 68, __pyx_L1_error))
  __pyx_t_2 = __Pyx_PyInt_From_int((__pyx_v_self->cpus * __pyx_v_self->blocksize)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_range, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __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_7 = 0;
    __pyx_t_8 = NULL;
  } else {
    __pyx_t_7 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 68, __pyx_L1_error)
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_8)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_7 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 68, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      } else {
        if (__pyx_t_7 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_7); __Pyx_INCREF(__pyx_t_1); __pyx_t_7++; if (unlikely(0 < 0)) __PYX_ERR(0, 68, __pyx_L1_error)
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_7); __pyx_t_7++; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_1);
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_8(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else __PYX_ERR(0, 68, __pyx_L1_error)
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_XDECREF_SET(__pyx_v_i, __pyx_t_1);
    __pyx_t_1 = 0;
/* … */
    __Pyx_TraceLine(68,0,__PYX_ERR(0, 68, __pyx_L1_error))
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+069:             oprofile = self.profiles[i].optimized()
    __Pyx_TraceLine(69,0,__PYX_ERR(0, 69, __pyx_L1_error))
    if (unlikely(__pyx_v_self->profiles == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 69, __pyx_L1_error)
    }
    __pyx_t_3 = __Pyx_PyObject_GetItem(__pyx_v_self->profiles, __pyx_v_i); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 69, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_optimized); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 69, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_15);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_15))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_15);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_15);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_15, function);
      }
    }
    __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_15, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_15);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0;
    if (!(likely(((__pyx_t_1) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_1, __pyx_ptype_7pyhmmer_5plan7_OptimizedProfile))))) __PYX_ERR(0, 69, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_oprofile, ((struct __pyx_obj_7pyhmmer_5plan7_OptimizedProfile *)__pyx_t_1));
    __pyx_t_1 = 0;
+070:             self.oprofiles.append(oprofile)
    __Pyx_TraceLine(70,0,__PYX_ERR(0, 70, __pyx_L1_error))
    if (unlikely(__pyx_v_self->oprofiles == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
      __PYX_ERR(0, 70, __pyx_L1_error)
    }
    __pyx_t_9 = __Pyx_PyList_Append(__pyx_v_self->oprofiles, ((PyObject *)__pyx_v_oprofile)); if (unlikely(__pyx_t_9 == ((int)-1))) __PYX_ERR(0, 70, __pyx_L1_error)
+071:             self._oprofiles[i] = oprofile._om
    __Pyx_TraceLine(71,0,__PYX_ERR(0, 71, __pyx_L1_error))
    __pyx_t_16 = __pyx_v_oprofile->_om;
    __pyx_t_11 = __Pyx_PyIndex_AsSsize_t(__pyx_v_i); if (unlikely((__pyx_t_11 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 71, __pyx_L1_error)
    (__pyx_v_self->_oprofiles[__pyx_t_11]) = __pyx_t_16;
 072: 
 073:         # create buffers to store results
+074:         self._results = <P7_TOPHITS**> malloc(sizeof(P7_TOPHITS*) * self.cpus * self.blocksize)
  __Pyx_TraceLine(74,0,__PYX_ERR(0, 74, __pyx_L1_error))
  __pyx_v_self->_results = ((P7_TOPHITS **)malloc((((sizeof(P7_TOPHITS *)) * __pyx_v_self->cpus) * __pyx_v_self->blocksize)));
+075:         self.results = []
  __Pyx_TraceLine(75,0,__PYX_ERR(0, 75, __pyx_L1_error))
  __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_self->results);
  __Pyx_DECREF(__pyx_v_self->results);
  __pyx_v_self->results = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
 076: 
+077:     def __dealloc__(self):
/* Python wrapper */
static void __pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
static void __pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_3__dealloc__(PyObject *__pyx_v_self) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
  __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_2__dealloc__(((struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *)__pyx_v_self));

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

static void __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_2__dealloc__(struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *__pyx_v_self) {
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__dealloc__", 0);
  __Pyx_TraceCall("__dealloc__", __pyx_f[0], 77, 0, __PYX_ERR(0, 77, __pyx_L1_error));
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("pyhmmer._hpc._HMMSearch.__dealloc__", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_TraceReturn(Py_None, 0);
  __Pyx_RefNannyFinishContext();
}
+078:         free(self._sequences)
  __Pyx_TraceLine(78,0,__PYX_ERR(0, 78, __pyx_L1_error))
  free(__pyx_v_self->_sequences);
+079:         free(self._results)
  __Pyx_TraceLine(79,0,__PYX_ERR(0, 79, __pyx_L1_error))
  free(__pyx_v_self->_results);
+080:         free(self._oprofiles)
  __Pyx_TraceLine(80,0,__PYX_ERR(0, 80, __pyx_L1_error))
  free(__pyx_v_self->_oprofiles);
+081:         free(self._profiles)
  __Pyx_TraceLine(81,0,__PYX_ERR(0, 81, __pyx_L1_error))
  free(__pyx_v_self->_profiles);
 082: 
+083:     def __iter__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_5__iter__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_5__iter__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__iter__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_4__iter__(((struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *)__pyx_v_self));

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

static PyObject *__pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_4__iter__(struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__iter__", 0);
  __Pyx_TraceCall("__iter__", __pyx_f[0], 83, 0, __PYX_ERR(0, 83, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("pyhmmer._hpc._HMMSearch.__iter__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+084:         return self
  __Pyx_TraceLine(84,0,__PYX_ERR(0, 84, __pyx_L1_error))
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;
 085: 
+086:     def __next__(self):
/* Python wrapper */
static PyObject *__pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_7__next__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_7pyhmmer_4_hpc_10_HMMSearch_7__next__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__next__ (wrapper)", 0);
  __pyx_r = __pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_6__next__(((struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *)__pyx_v_self));

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

static PyObject *__pyx_pf_7pyhmmer_4_hpc_10_HMMSearch_6__next__(struct __pyx_obj_7pyhmmer_4_hpc__HMMSearch *__pyx_v_self) {
  Py_ssize_t __pyx_v_i;
  struct __pyx_obj_7pyhmmer_5plan7_Profile *__pyx_v_profile = 0;
  struct __pyx_obj_7pyhmmer_5plan7_OptimizedProfile *__pyx_v_oprofile = 0;
  struct __pyx_obj_7pyhmmer_5plan7_TopHits *__pyx_v_top_hits = 0;
  int __pyx_v_cpus;
  int __pyx_v_blocksize;
  P7_OPROFILE **__pyx_v__oprofiles;
  P7_BG *__pyx_v__background;
  ESL_SQ **__pyx_v__sequences;
  P7_PIPELINE **__pyx_v__pipelines;
  P7_TOPHITS **__pyx_v__results;
  PyObject *__pyx_v_hmm = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_TraceDeclarations
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__next__", 0);
  __Pyx_TraceCall("__next__", __pyx_f[0], 86, 0, __PYX_ERR(0, 86, __pyx_L1_error));
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("pyhmmer._hpc._HMMSearch.__next__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_profile);
  __Pyx_XDECREF((PyObject *)__pyx_v_oprofile);
  __Pyx_XDECREF((PyObject *)__pyx_v_top_hits);
  __Pyx_XDECREF(__pyx_v_hmm);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_TraceReturn(__pyx_r, 0);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 087: 
 088:         cdef ssize_t          i
 089:         cdef ssize_t          j
 090:         # cdef HMM              hmm
 091:         cdef Profile          profile
 092:         cdef OptimizedProfile oprofile
 093:         cdef TopHits          top_hits
 094: 
 095:         # cdef list             hmms        = []
+096:         cdef int              cpus        = self.cpus
  __Pyx_TraceLine(96,0,__PYX_ERR(0, 96, __pyx_L1_error))
  __pyx_t_1 = __pyx_v_self->cpus;
  __pyx_v_cpus = __pyx_t_1;
+097:         cdef int              blocksize   = self.blocksize
  __Pyx_TraceLine(97,0,__PYX_ERR(0, 97, __pyx_L1_error))
  __pyx_t_1 = __pyx_v_self->blocksize;
  __pyx_v_blocksize = __pyx_t_1;
+098:         cdef P7_OPROFILE**    _oprofiles  = self._oprofiles
  __Pyx_TraceLine(98,0,__PYX_ERR(0, 98, __pyx_L1_error))
  __pyx_t_2 = __pyx_v_self->_oprofiles;
  __pyx_v__oprofiles = __pyx_t_2;
+099:         cdef P7_BG*           _background = self._background
  __Pyx_TraceLine(99,0,__PYX_ERR(0, 99, __pyx_L1_error))
  __pyx_t_3 = __pyx_v_self->_background;
  __pyx_v__background = __pyx_t_3;
+100:         cdef ESL_SQ**         _sequences  = self._sequences
  __Pyx_TraceLine(100,0,__PYX_ERR(0, 100, __pyx_L1_error))
  __pyx_t_4 = __pyx_v_self->_sequences;
  __pyx_v__sequences = __pyx_t_4;
+101:         cdef P7_PIPELINE**    _pipelines  = self._pipelines
  __Pyx_TraceLine(101,0,__PYX_ERR(0, 101, __pyx_L1_error))
  __pyx_t_5 = __pyx_v_self->_pipelines;
  __pyx_v__pipelines = __pyx_t_5;
+102:         cdef P7_TOPHITS**     _results    = self._results
  __Pyx_TraceLine(102,0,__PYX_ERR(0, 102, __pyx_L1_error))
  __pyx_t_6 = __pyx_v_self->_results;
  __pyx_v__results = __pyx_t_6;
 103: 
 104: 
+105:         if self.results:
  __Pyx_TraceLine(105,0,__PYX_ERR(0, 105, __pyx_L1_error))
  __pyx_t_7 = (__pyx_v_self->results != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->results) != 0);
  if (__pyx_t_7) {
/* … */
  }
+106:             return self.results.pop(0)
    __Pyx_TraceLine(106,0,__PYX_ERR(0, 106, __pyx_L1_error))
    __Pyx_XDECREF(__pyx_r);
    if (unlikely(__pyx_v_self->results == Py_None)) {
      PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "pop");
      __PYX_ERR(0, 106, __pyx_L1_error)
    }
    __pyx_t_8 = __Pyx_PyList_PopIndex(__pyx_v_self->results, __pyx_int_0, 0, 1, Py_ssize_t, PyInt_FromSsize_t); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 106, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_r = __pyx_t_8;
    __pyx_t_8 = 0;
    goto __pyx_L0;
 107: 
+108:         for i in range(cpus*blocksize):
  __Pyx_TraceLine(108,0,__PYX_ERR(0, 108, __pyx_L1_error))
  __pyx_t_1 = (__pyx_v_cpus * __pyx_v_blocksize);
  __pyx_t_9 = __pyx_t_1;
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;
+109:             hmm = next(self.queries, None)
    __Pyx_TraceLine(109,0,__PYX_ERR(0, 109, __pyx_L1_error))
    __pyx_t_8 = __pyx_v_self->queries;
    __Pyx_INCREF(__pyx_t_8);
    __pyx_t_11 = __Pyx_PyIter_Next2(__pyx_t_8, Py_None); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 109, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_XDECREF_SET(__pyx_v_hmm, __pyx_t_11);
    __pyx_t_11 = 0;
+110:             if hmm is not None:
    __Pyx_TraceLine(110,0,__PYX_ERR(0, 110, __pyx_L1_error))
    __pyx_t_7 = (__pyx_v_hmm != Py_None);
    __pyx_t_12 = (__pyx_t_7 != 0);
    if (__pyx_t_12) {
/* … */
      goto __pyx_L6;
    }
+111:                 if hmm.M > self._profiles[i].M:
      __Pyx_TraceLine(111,0,__PYX_ERR(0, 111, __pyx_L1_error))
      __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_hmm, __pyx_n_s_M); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 111, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_8 = __Pyx_PyInt_From_int((__pyx_v_self->_profiles[__pyx_v_i])->M); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 111, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_13 = PyObject_RichCompare(__pyx_t_11, __pyx_t_8, Py_GT); __Pyx_XGOTREF(__pyx_t_13); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 111, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_12 = __Pyx_PyObject_IsTrue(__pyx_t_13); if (unlikely(__pyx_t_12 < 0)) __PYX_ERR(0, 111, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      if (__pyx_t_12) {
/* … */
      }
+112:                     profile = Profile(hmm.M, self.alphabet)
        __Pyx_TraceLine(112,0,__PYX_ERR(0, 112, __pyx_L1_error))
        __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_hmm, __pyx_n_s_M); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 112, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 112, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_GIVEREF(__pyx_t_13);
        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_13);
        __Pyx_INCREF(((PyObject *)__pyx_v_self->alphabet));
        __Pyx_GIVEREF(((PyObject *)__pyx_v_self->alphabet));
        PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_v_self->alphabet));
        __pyx_t_13 = 0;
        __pyx_t_13 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_Profile), __pyx_t_8, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 112, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_XDECREF_SET(__pyx_v_profile, ((struct __pyx_obj_7pyhmmer_5plan7_Profile *)__pyx_t_13));
        __pyx_t_13 = 0;
+113:                     self.profiles[i] = profile
        __Pyx_TraceLine(113,0,__PYX_ERR(0, 113, __pyx_L1_error))
        if (unlikely(__pyx_v_self->profiles == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
          __PYX_ERR(0, 113, __pyx_L1_error)
        }
        if (unlikely(__Pyx_SetItemInt(__pyx_v_self->profiles, __pyx_v_i, ((PyObject *)__pyx_v_profile), Py_ssize_t, 1, PyInt_FromSsize_t, 1, 0, 0) < 0)) __PYX_ERR(0, 113, __pyx_L1_error)
+114:                     self._profiles[i] = profile._gm
        __Pyx_TraceLine(114,0,__PYX_ERR(0, 114, __pyx_L1_error))
        __pyx_t_14 = __pyx_v_profile->_gm;
        (__pyx_v_self->_profiles[__pyx_v_i]) = __pyx_t_14;
+115:                     oprofile = OptimizedProfile(hmm.M, self.alphabet)
        __Pyx_TraceLine(115,0,__PYX_ERR(0, 115, __pyx_L1_error))
        __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_hmm, __pyx_n_s_M); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 115, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 115, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_8);
        __Pyx_GIVEREF(__pyx_t_13);
        PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_13);
        __Pyx_INCREF(((PyObject *)__pyx_v_self->alphabet));
        __Pyx_GIVEREF(((PyObject *)__pyx_v_self->alphabet));
        PyTuple_SET_ITEM(__pyx_t_8, 1, ((PyObject *)__pyx_v_self->alphabet));
        __pyx_t_13 = 0;
        __pyx_t_13 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_OptimizedProfile), __pyx_t_8, NULL); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 115, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        __Pyx_XDECREF_SET(__pyx_v_oprofile, ((struct __pyx_obj_7pyhmmer_5plan7_OptimizedProfile *)__pyx_t_13));
        __pyx_t_13 = 0;
+116:                     self.oprofiles[i] = oprofile
        __Pyx_TraceLine(116,0,__PYX_ERR(0, 116, __pyx_L1_error))
        if (unlikely(__pyx_v_self->oprofiles == Py_None)) {
          PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
          __PYX_ERR(0, 116, __pyx_L1_error)
        }
        if (unlikely(__Pyx_SetItemInt(__pyx_v_self->oprofiles, __pyx_v_i, ((PyObject *)__pyx_v_oprofile), Py_ssize_t, 1, PyInt_FromSsize_t, 1, 0, 0) < 0)) __PYX_ERR(0, 116, __pyx_L1_error)
+117:                     self._oprofiles[i] = oprofile._om
        __Pyx_TraceLine(117,0,__PYX_ERR(0, 117, __pyx_L1_error))
        __pyx_t_15 = __pyx_v_oprofile->_om;
        (__pyx_v_self->_oprofiles[__pyx_v_i]) = __pyx_t_15;
 118: 
+119:                 profile = self.profiles[i]
      __Pyx_TraceLine(119,0,__PYX_ERR(0, 119, __pyx_L1_error))
      if (unlikely(__pyx_v_self->profiles == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 119, __pyx_L1_error)
      }
      if (!(likely(((PyList_GET_ITEM(__pyx_v_self->profiles, __pyx_v_i)) == Py_None) || likely(__Pyx_TypeTest(PyList_GET_ITEM(__pyx_v_self->profiles, __pyx_v_i), __pyx_ptype_7pyhmmer_5plan7_Profile))))) __PYX_ERR(0, 119, __pyx_L1_error)
      __pyx_t_13 = PyList_GET_ITEM(__pyx_v_self->profiles, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_13);
      __Pyx_XDECREF_SET(__pyx_v_profile, ((struct __pyx_obj_7pyhmmer_5plan7_Profile *)__pyx_t_13));
      __pyx_t_13 = 0;
+120:                 profile._configure(hmm, self.pipelines[i].background, len(self.sequences[0]))
      __Pyx_TraceLine(120,0,__PYX_ERR(0, 120, __pyx_L1_error))
      if (!(likely(((__pyx_v_hmm) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_hmm, __pyx_ptype_7pyhmmer_5plan7_HMM))))) __PYX_ERR(0, 120, __pyx_L1_error)
      if (unlikely(__pyx_v_self->pipelines == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 120, __pyx_L1_error)
      }
      __pyx_t_13 = __Pyx_PyObject_GetAttrStr(PyList_GET_ITEM(__pyx_v_self->pipelines, __pyx_v_i), __pyx_n_s_background); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 120, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      if (!(likely(((__pyx_t_13) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_13, __pyx_ptype_7pyhmmer_5plan7_Background))))) __PYX_ERR(0, 120, __pyx_L1_error)
      if (unlikely(__pyx_v_self->sequences == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 120, __pyx_L1_error)
      }
      __pyx_t_8 = PyList_GET_ITEM(__pyx_v_self->sequences, 0);
      __Pyx_INCREF(__pyx_t_8);
      __pyx_t_16 = PyObject_Length(__pyx_t_8); if (unlikely(__pyx_t_16 == ((Py_ssize_t)-1))) __PYX_ERR(0, 120, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_17 = ((struct __pyx_vtabstruct_7pyhmmer_5plan7_Profile *)__pyx_v_profile->__pyx_vtab)->_configure(__pyx_v_profile, ((struct __pyx_obj_7pyhmmer_5plan7_HMM *)__pyx_v_hmm), ((struct __pyx_obj_7pyhmmer_5plan7_Background *)__pyx_t_13), __pyx_t_16, NULL); if (unlikely(__pyx_t_17 == ((int)1))) __PYX_ERR(0, 120, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
+121:                 p7_oprofile.p7_oprofile_Convert(self._profiles[i], self._oprofiles[i])
      __Pyx_TraceLine(121,0,__PYX_ERR(0, 121, __pyx_L1_error))
      (void)(p7_oprofile_Convert((__pyx_v_self->_profiles[__pyx_v_i]), (__pyx_v_self->_oprofiles[__pyx_v_i])));
 122: 
+123:                 top_hits = TopHits()
      __Pyx_TraceLine(123,0,__PYX_ERR(0, 123, __pyx_L1_error))
      __pyx_t_13 = __Pyx_PyObject_CallNoArg(((PyObject *)__pyx_ptype_7pyhmmer_5plan7_TopHits)); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 123, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_XDECREF_SET(__pyx_v_top_hits, ((struct __pyx_obj_7pyhmmer_5plan7_TopHits *)__pyx_t_13));
      __pyx_t_13 = 0;
+124:                 self.results.append(top_hits)
      __Pyx_TraceLine(124,0,__PYX_ERR(0, 124, __pyx_L1_error))
      if (unlikely(__pyx_v_self->results == Py_None)) {
        PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
        __PYX_ERR(0, 124, __pyx_L1_error)
      }
      __pyx_t_18 = __Pyx_PyList_Append(__pyx_v_self->results, ((PyObject *)__pyx_v_top_hits)); if (unlikely(__pyx_t_18 == ((int)-1))) __PYX_ERR(0, 124, __pyx_L1_error)
+125:                 self._results[i] = top_hits._th
      __Pyx_TraceLine(125,0,__PYX_ERR(0, 125, __pyx_L1_error))
      __pyx_t_19 = __pyx_v_top_hits->_th;
      (__pyx_v_self->_results[__pyx_v_i]) = __pyx_t_19;
 126:                 # hmms.append(hmm)
 127:             else:
+128:                 self.profiles[i] = self.oprofiles[i] = None
    __Pyx_TraceLine(128,0,__PYX_ERR(0, 128, __pyx_L1_error))
    /*else*/ {
      if (unlikely(__pyx_v_self->profiles == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 128, __pyx_L1_error)
      }
      if (unlikely(__Pyx_SetItemInt(__pyx_v_self->profiles, __pyx_v_i, Py_None, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 0, 0) < 0)) __PYX_ERR(0, 128, __pyx_L1_error)
      if (unlikely(__pyx_v_self->oprofiles == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 128, __pyx_L1_error)
      }
      if (unlikely(__Pyx_SetItemInt(__pyx_v_self->oprofiles, __pyx_v_i, Py_None, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 0, 0) < 0)) __PYX_ERR(0, 128, __pyx_L1_error)
+129:                 self._profiles[i] = self._oprofiles[i]  = self._results[i] = NULL
      __Pyx_TraceLine(129,0,__PYX_ERR(0, 129, __pyx_L1_error))
      (__pyx_v_self->_profiles[__pyx_v_i]) = NULL;
      (__pyx_v_self->_oprofiles[__pyx_v_i]) = NULL;
      (__pyx_v_self->_results[__pyx_v_i]) = NULL;
    }
    __pyx_L6:;
  }
 130: 
+131:         if not self.results:
  __Pyx_TraceLine(131,0,__PYX_ERR(0, 131, __pyx_L1_error))
  __pyx_t_12 = (__pyx_v_self->results != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->results) != 0);
  __pyx_t_7 = ((!__pyx_t_12) != 0);
  if (unlikely(__pyx_t_7)) {
/* … */
  }
+132:             raise StopIteration
    __Pyx_TraceLine(132,0,__PYX_ERR(0, 132, __pyx_L1_error))
    __Pyx_Raise(__pyx_builtin_StopIteration, 0, 0, 0);
    __PYX_ERR(0, 132, __pyx_L1_error)
 133: 
+134:         for i in prange(cpus*blocksize, nogil=True, schedule="dynamic"):
  __Pyx_TraceLine(134,0,__PYX_ERR(0, 134, __pyx_L1_error))
  {
      #ifdef WITH_THREAD
      PyThreadState *_save;
      Py_UNBLOCK_THREADS
      __Pyx_FastGIL_Remember();
      #endif
      /*try:*/ {
        __pyx_t_1 = (__pyx_v_cpus * __pyx_v_blocksize);
        if ((1 == 0)) abort();
        {
            #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
                #undef likely
                #undef unlikely
                #define likely(x)   (x)
                #define unlikely(x) (x)
            #endif
            __pyx_t_20 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;
            if (__pyx_t_20 > 0)
            {
                #ifdef _OPENMP
                #pragma omp parallel
                #endif /* _OPENMP */
                {
                    #ifdef _OPENMP
                    #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(dynamic)
                    #endif /* _OPENMP */
                    for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_20; __pyx_t_10++){
                        {
                            __pyx_v_i = (Py_ssize_t)(0 + 1 * __pyx_t_10);
/* … */
      __Pyx_TraceLine(134,1,__PYX_ERR(0, 134, __pyx_L10_error))
      /*finally:*/ {
        /*normal exit:*/{
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L11;
        }
        __pyx_L10_error: {
          #ifdef WITH_THREAD
          __Pyx_FastGIL_Forget();
          Py_BLOCK_THREADS
          #endif
          goto __pyx_L1_error;
        }
        __pyx_L11:;
      }
  }
+135:             if _oprofiles[i] != NULL:
                            __Pyx_TraceLine(135,1,__PYX_ERR(0, 135, __pyx_L14_error))
                            __pyx_t_7 = (((__pyx_v__oprofiles[__pyx_v_i]) != NULL) != 0);
                            if (__pyx_t_7) {
/* … */
                            }
                            goto __pyx_L18;
                            __pyx_L14_error:;
                            {
                                #ifdef WITH_THREAD
                                PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                                #endif
                                #ifdef _OPENMP
                                #pragma omp flush(__pyx_parallel_exc_type)
                                #endif /* _OPENMP */
                                if (!__pyx_parallel_exc_type) {
                                  __Pyx_ErrFetchWithState(&__pyx_parallel_exc_type, &__pyx_parallel_exc_value, &__pyx_parallel_exc_tb);
                                  __pyx_parallel_filename = __pyx_filename; __pyx_parallel_lineno = __pyx_lineno; __pyx_parallel_clineno = __pyx_clineno;
                                  __Pyx_GOTREF(__pyx_parallel_exc_type);
                                }
                                #ifdef WITH_THREAD
                                __Pyx_PyGILState_Release(__pyx_gilstate_save);
                                #endif
                            }
                            __pyx_parallel_why = 4;
                            goto __pyx_L17;
                            __pyx_L17:;
                            #ifdef _OPENMP
                            #pragma omp critical(__pyx_parallel_lastprivates0)
                            #endif /* _OPENMP */
                            {
                                __pyx_parallel_temp0 = __pyx_v_i;
                            }
                            __pyx_L18:;
                            #ifdef _OPENMP
                            #pragma omp flush(__pyx_parallel_why)
                            #endif /* _OPENMP */
                        }
                    }
                    #ifdef _OPENMP
                    Py_END_ALLOW_THREADS
                    #else
{
#ifdef WITH_THREAD
                    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                    #endif
                    #endif /* _OPENMP */
                    /* Clean up any temporaries */
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                    #ifndef _OPENMP
}
#endif /* _OPENMP */
                }
            }
            if (__pyx_parallel_exc_type) {
              /* This may have been overridden by a continue, break or return in another thread. Prefer the error. */
              __pyx_parallel_why = 4;
            }
            if (__pyx_parallel_why) {
              __pyx_v_i = __pyx_parallel_temp0;
              switch (__pyx_parallel_why) {
                    case 4:
                {
                    #ifdef WITH_THREAD
                    PyGILState_STATE __pyx_gilstate_save = __Pyx_PyGILState_Ensure();
                    #endif
                    __Pyx_GIVEREF(__pyx_parallel_exc_type);
                    __Pyx_ErrRestoreWithState(__pyx_parallel_exc_type, __pyx_parallel_exc_value, __pyx_parallel_exc_tb);
                    __pyx_filename = __pyx_parallel_filename; __pyx_lineno = __pyx_parallel_lineno; __pyx_clineno = __pyx_parallel_clineno;
                    #ifdef WITH_THREAD
                    __Pyx_PyGILState_Release(__pyx_gilstate_save);
                    #endif
                }
                goto __pyx_L10_error;
              }
            }
        }
        #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))
            #undef likely
            #undef unlikely
            #define likely(x)   __builtin_expect(!!(x), 1)
            #define unlikely(x) __builtin_expect(!!(x), 0)
        #endif
      }
+136:                 Pipeline._search_loop(
                              __Pyx_TraceLine(136,1,__PYX_ERR(0, 136, __pyx_L14_error))
                              __pyx_t_9 = __pyx_vtabptr_7pyhmmer_5plan7_Pipeline->_search_loop((__pyx_v__pipelines[__pyx_v_i]), (__pyx_v__oprofiles[__pyx_v_i]), __pyx_v__background, __pyx_v__sequences, (__pyx_v__results[__pyx_v_i])); if (unlikely(__pyx_t_9 == ((int)1))) __PYX_ERR(0, 136, __pyx_L14_error)
 137:                     _pipelines[i],
 138:                     _oprofiles[i],
 139:                     _background,
 140:                     _sequences,
 141:                     _results[i],
 142:                 )
 143: 
+144:         for i in range(cpus * blocksize):
  __Pyx_TraceLine(144,0,__PYX_ERR(0, 144, __pyx_L1_error))
  __pyx_t_1 = (__pyx_v_cpus * __pyx_v_blocksize);
  __pyx_t_9 = __pyx_t_1;
  for (__pyx_t_20 = 0; __pyx_t_20 < __pyx_t_9; __pyx_t_20+=1) {
    __pyx_v_i = __pyx_t_20;
 145:             # sort and threshold results
+146:             if _oprofiles[i] != NULL:
    __Pyx_TraceLine(146,0,__PYX_ERR(0, 146, __pyx_L1_error))
    __pyx_t_7 = (((__pyx_v__oprofiles[__pyx_v_i]) != NULL) != 0);
    if (__pyx_t_7) {
/* … */
    }
+147:                 top_hits = self.results[i]
      __Pyx_TraceLine(147,0,__PYX_ERR(0, 147, __pyx_L1_error))
      if (unlikely(__pyx_v_self->results == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 147, __pyx_L1_error)
      }
      if (!(likely(((PyList_GET_ITEM(__pyx_v_self->results, __pyx_v_i)) == Py_None) || likely(__Pyx_TypeTest(PyList_GET_ITEM(__pyx_v_self->results, __pyx_v_i), __pyx_ptype_7pyhmmer_5plan7_TopHits))))) __PYX_ERR(0, 147, __pyx_L1_error)
      __pyx_t_13 = PyList_GET_ITEM(__pyx_v_self->results, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_13);
      __Pyx_XDECREF_SET(__pyx_v_top_hits, ((struct __pyx_obj_7pyhmmer_5plan7_TopHits *)__pyx_t_13));
      __pyx_t_13 = 0;
+148:                 top_hits._sort_by_key()
      __Pyx_TraceLine(148,0,__PYX_ERR(0, 148, __pyx_L1_error))
      __pyx_t_17 = ((struct __pyx_vtabstruct_7pyhmmer_5plan7_TopHits *)__pyx_v_top_hits->__pyx_vtab)->_sort_by_key(__pyx_v_top_hits); if (unlikely(__pyx_t_17 == ((int)1))) __PYX_ERR(0, 148, __pyx_L1_error)
+149:                 top_hits._threshold(self.pipelines[i])
      __Pyx_TraceLine(149,0,__PYX_ERR(0, 149, __pyx_L1_error))
      if (unlikely(__pyx_v_self->pipelines == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 149, __pyx_L1_error)
      }
      if (!(likely(((PyList_GET_ITEM(__pyx_v_self->pipelines, __pyx_v_i)) == Py_None) || likely(__Pyx_TypeTest(PyList_GET_ITEM(__pyx_v_self->pipelines, __pyx_v_i), __pyx_ptype_7pyhmmer_5plan7_Pipeline))))) __PYX_ERR(0, 149, __pyx_L1_error)
      __pyx_t_13 = PyList_GET_ITEM(__pyx_v_self->pipelines, __pyx_v_i);
      __Pyx_INCREF(__pyx_t_13);
      __pyx_t_17 = ((struct __pyx_vtabstruct_7pyhmmer_5plan7_TopHits *)__pyx_v_top_hits->__pyx_vtab)->_threshold(__pyx_v_top_hits, ((struct __pyx_obj_7pyhmmer_5plan7_Pipeline *)__pyx_t_13)); if (unlikely(__pyx_t_17 == ((int)1))) __PYX_ERR(0, 149, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
 150:             # reset pipelines for next run
+151:             self.pipelines[i].clear()
    __Pyx_TraceLine(151,0,__PYX_ERR(0, 151, __pyx_L1_error))
    if (unlikely(__pyx_v_self->pipelines == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 151, __pyx_L1_error)
    }
    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(PyList_GET_ITEM(__pyx_v_self->pipelines, __pyx_v_i), __pyx_n_s_clear); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 151, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_11 = NULL;
    if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) {
      __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_8);
      if (likely(__pyx_t_11)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
        __Pyx_INCREF(__pyx_t_11);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_8, function);
      }
    }
    __pyx_t_13 = (__pyx_t_11) ? __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_11) : __Pyx_PyObject_CallNoArg(__pyx_t_8);
    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
    if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 151, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  }
 152: 
+153:         return self.results.pop(0)
  __Pyx_TraceLine(153,0,__PYX_ERR(0, 153, __pyx_L1_error))
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(__pyx_v_self->results == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "pop");
    __PYX_ERR(0, 153, __pyx_L1_error)
  }
  __pyx_t_13 = __Pyx_PyList_PopIndex(__pyx_v_self->results, __pyx_int_0, 0, 1, Py_ssize_t, PyInt_FromSsize_t); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_r = __pyx_t_13;
  __pyx_t_13 = 0;
  goto __pyx_L0;