Generated by Cython 3.1.2

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

+001: '''
  __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 002:     This file is part of Prolothar-Process-Discovery (More Info: https://github.com/shs-it/prolothar-process-discovery).
 003: 
 004:     Prolothar-Process-Discovery is free software: you can redistribute it and/or modify
 005:     it under the terms of the GNU General Public License as published by
 006:     the Free Software Foundation, either version 3 of the License, or
 007:     (at your option) any later version.
 008: 
 009:     Prolothar-Process-Discovery is distributed in the hope that it will be useful,
 010:     but WITHOUT ANY WARRANTY; without even the implied warranty of
 011:     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 012:     GNU General Public License for more details.
 013: 
 014:     You should have received a copy of the GNU General Public License
 015:     along with Prolothar-Process-Discovery. If not, see <https://www.gnu.org/licenses/>.
 016: '''
 017: 
+018: from typing import List, Set
  __pyx_t_2 = __Pyx_PyList_Pack(2, __pyx_mstate_global->__pyx_n_u_List, __pyx_mstate_global->__pyx_n_u_Set); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_typing, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_List); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_List, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_mstate_global->__pyx_n_u_Set); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_Set, __pyx_t_2) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 019: 
 020: from prolothar_process_discovery.discovery.proseqo.pattern_dfg cimport PatternDfg
+021: from prolothar_common.models.eventlog import EventLog
  __pyx_t_3 = __Pyx_PyList_Pack(1, __pyx_mstate_global->__pyx_n_u_EventLog); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_Import(__pyx_mstate_global->__pyx_n_u_prolothar_common_models_eventlog, __pyx_t_3, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_ImportFrom(__pyx_t_2, __pyx_mstate_global->__pyx_n_u_EventLog); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_EventLog, __pyx_t_3) < 0) __PYX_ERR(0, 21, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 022: from prolothar_common.models.dfg.node cimport Node
 023: 
+024: cpdef Cover compute_cover(
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover(PyObject *__pyx_v_trace_list, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *__pyx_v_pattern_dfg, CYTHON_UNUSED int __pyx_skip_dispatch, struct __pyx_opt_args_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover *__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_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.compute_cover", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover, "computes a Cover for a PatternDfg on a given list of Traces. This\n    method is a convenience method that uses an instance of\n    GreedyCoverComputer");
static PyMethodDef __pyx_mdef_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover = {"compute_cover", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover};
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover(PyObject *__pyx_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_trace_list = 0;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *__pyx_v_pattern_dfg = 0;
  int __pyx_v_store_patterns_in_pattern_stream;
  PyObject *__pyx_v_activity_set = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("compute_cover (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_trace_list,&__pyx_mstate_global->__pyx_n_u_pattern_dfg,&__pyx_mstate_global->__pyx_n_u_store_patterns_in_pattern_stream,&__pyx_mstate_global->__pyx_n_u_activity_set,0};
  PyObject* values[4] = {0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 24, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "compute_cover", 0) < 0) __PYX_ERR(0, 24, __pyx_L3_error)
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_trace_list, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *__pyx_v_pattern_dfg, int __pyx_v_store_patterns_in_pattern_stream, PyObject *__pyx_v_activity_set) {
  PyObject *__pyx_r = NULL;
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2.__pyx_n = 2;
  __pyx_t_2.store_patterns_in_pattern_stream = __pyx_v_store_patterns_in_pattern_stream;
  __pyx_t_2.activity_set = __pyx_v_activity_set;
  __pyx_t_1 = ((PyObject *)__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover(__pyx_v_trace_list, __pyx_v_pattern_dfg, 1, &__pyx_t_2)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __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("prolothar_process_discovery.discovery.proseqo.greedy_cover.compute_cover", __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_New(&__pyx_mdef_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_1compute_cover, 0, __pyx_mstate_global->__pyx_n_u_compute_cover, NULL, __pyx_mstate_global->__pyx_n_u_prolothar_process_discovery_disc, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[0])); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_mstate_global->__pyx_tuple[1]);
  if (PyDict_SetItem(__pyx_mstate_global->__pyx_d, __pyx_mstate_global->__pyx_n_u_compute_cover, __pyx_t_2) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_mstate_global->__pyx_tuple[1] = PyTuple_Pack(2, Py_False, Py_None); if (unlikely(!__pyx_mstate_global->__pyx_tuple[1])) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_mstate_global->__pyx_tuple[1]);
  __Pyx_GIVEREF(__pyx_mstate_global->__pyx_tuple[1]);
 025:     list trace_list, PatternDfg pattern_dfg,
+026:     bint store_patterns_in_pattern_stream=False,
  int __pyx_v_store_patterns_in_pattern_stream = ((int)0);
/* … */
      __pyx_v_store_patterns_in_pattern_stream = ((int)0);
    }
    __pyx_v_activity_set = ((PyObject*)values[3]);
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("compute_cover", 0, 2, 4, __pyx_nargs); __PYX_ERR(0, 24, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.compute_cover", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trace_list), (&PyList_Type), 1, "trace_list", 1))) __PYX_ERR(0, 25, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pattern_dfg), __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg, 1, "pattern_dfg", 0))) __PYX_ERR(0, 25, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_activity_set), (&PySet_Type), 1, "activity_set", 1))) __PYX_ERR(0, 27, __pyx_L1_error)
  __pyx_r = __pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_compute_cover(__pyx_self, __pyx_v_trace_list, __pyx_v_pattern_dfg, __pyx_v_store_patterns_in_pattern_stream, __pyx_v_activity_set);
+027:     set activity_set=None):
  PyObject *__pyx_v_activity_set = ((PyObject*)Py_None);
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_r = NULL;
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_store_patterns_in_pattern_stream = __pyx_optional_args->store_patterns_in_pattern_stream;
      if (__pyx_optional_args->__pyx_n > 1) {
        __pyx_v_activity_set = __pyx_optional_args->activity_set;
      }
    }
  }
/* … */
      if (!values[3]) values[3] = __Pyx_NewRef(((PyObject*)Py_None));
      for (Py_ssize_t i = __pyx_nargs; i < 2; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("compute_cover", 0, 2, 4, i); __PYX_ERR(0, 24, __pyx_L3_error) }
      }
    } else {
      switch (__pyx_nargs) {
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 24, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 24, __pyx_L3_error)
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 24, __pyx_L3_error)
        break;
        default: goto __pyx_L5_argtuple_error;
      }
      if (!values[3]) values[3] = __Pyx_NewRef(((PyObject*)Py_None));
    }
    __pyx_v_trace_list = ((PyObject*)values[0]);
    __pyx_v_pattern_dfg = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *)values[1]);
    if (values[2]) {
      __pyx_v_store_patterns_in_pattern_stream = __Pyx_PyObject_IsTrue(values[2]); if (unlikely((__pyx_v_store_patterns_in_pattern_stream == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 26, __pyx_L3_error)
    } else {
 028:     """computes a Cover for a PatternDfg on a given list of Traces. This
 029:     method is a convenience method that uses an instance of
 030:     GreedyCoverComputer"""
+031:     return GreedyCoverComputer(pattern_dfg).compute(
  __Pyx_XDECREF((PyObject *)__pyx_r);
  __pyx_t_2 = NULL;
  __Pyx_INCREF((PyObject *)__pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer);
  __pyx_t_3 = ((PyObject *)__pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer); 
  __pyx_t_4 = 1;
  {
    PyObject *__pyx_callargs[2] = {__pyx_t_2, ((PyObject *)__pyx_v_pattern_dfg)};
    __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+__pyx_t_4, (2-__pyx_t_4) | (__pyx_t_4*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 31, __pyx_L1_error)
    __Pyx_GOTREF((PyObject *)__pyx_t_1);
  }
/* … */
  __pyx_t_5.__pyx_n = 2;
  __pyx_t_5.store_patterns_in_pattern_stream = __pyx_v_store_patterns_in_pattern_stream;
  __pyx_t_5.activity_set = __pyx_v_activity_set;
  __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_t_1)->__pyx_vtab)->compute(((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_t_1), __pyx_v_trace_list, 0, &__pyx_t_5)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF((PyObject *)__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_t_3);
  __pyx_t_3 = 0;
  goto __pyx_L0;
 032:             trace_list,
 033:             store_patterns_in_pattern_stream=store_patterns_in_pattern_stream,
 034:             activity_set=activity_set)
 035: 
+036: cdef class GreedyCoverComputer:
struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer {
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *(*compute)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_compute *__pyx_optional_args);
  PyObject *(*_extend_cover_for_trace)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *);
  PyObject *(*_get_shortest_path)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *);
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *(*_handle_pattern_change_in_cover)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *, PyObject *, PyObject *);
  PyObject *(*_skip_intermediate_patterns)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, PyObject *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *, PyObject *);
  PyObject *(*_GreedyCoverComputer__add_log_move)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *, PyObject *, PyObject *, int);
  PyObject *(*_GreedyCoverComputer__create_cached_patterns_for_activities)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *);
  PyObject *(*_GreedyCoverComputer__get_next_matching_patterns)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *);
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *(*_GreedyCoverComputer__cover_event_using_pattern)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *, PyObject *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *);
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *(*_handle_continue_pattern_in_cover)(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *, PyObject *, PyObject *);
};
static struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_vtabptr_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer;
 037:     """computes a Cover for a PatternDfg on a given list of Traces"""
+038:     def __init__(self, pattern_dfg: PatternDfg):
/* Python wrapper */
static int __pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *__pyx_v_pattern_dfg = 0;
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return -1;
  #endif
  __pyx_kwvalues = __Pyx_KwValues_VARARGS(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pattern_dfg,0};
  PyObject* values[1] = {0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_VARARGS(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 38, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  1:
        values[0] = __Pyx_ArgRef_VARARGS(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 38, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "__init__", 0) < 0) __PYX_ERR(0, 38, __pyx_L3_error)
      for (Py_ssize_t i = __pyx_nargs; i < 1; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, i); __PYX_ERR(0, 38, __pyx_L3_error) }
      }
    } else if (unlikely(__pyx_nargs != 1)) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = __Pyx_ArgRef_VARARGS(__pyx_args, 0);
      if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 38, __pyx_L3_error)
    }
    __pyx_v_pattern_dfg = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *)values[0]);
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, __pyx_nargs); __PYX_ERR(0, 38, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_pattern_dfg), __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg, 0, "pattern_dfg", 0))) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_r = __pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer___init__(((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self), __pyx_v_pattern_dfg);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = -1;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer___init__(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *__pyx_v_pattern_dfg) {
  struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *__pyx_v_node = 0;
  int __pyx_r;
/* … */
  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_node);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+039:         self.pattern_dfg = pattern_dfg
  __Pyx_INCREF((PyObject *)__pyx_v_pattern_dfg);
  __Pyx_GIVEREF((PyObject *)__pyx_v_pattern_dfg);
  __Pyx_GOTREF((PyObject *)__pyx_v_self->pattern_dfg);
  __Pyx_DECREF((PyObject *)__pyx_v_self->pattern_dfg);
  __pyx_v_self->pattern_dfg = __pyx_v_pattern_dfg;
+040:         self.cached_shortest_paths = {}
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->cached_shortest_paths);
  __Pyx_DECREF(__pyx_v_self->cached_shortest_paths);
  __pyx_v_self->cached_shortest_paths = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+041:         self.cached_reachable_activities = {}
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->cached_reachable_activities);
  __Pyx_DECREF(__pyx_v_self->cached_reachable_activities);
  __pyx_v_self->cached_reachable_activities = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+042:         self.cached_patterns_for_activity = \
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->cached_patterns_for_activity);
  __Pyx_DECREF(__pyx_v_self->cached_patterns_for_activity);
  __pyx_v_self->cached_patterns_for_activity = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
+043:             self.__create_cached_patterns_for_activities()
  __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__create_cached_patterns_for_activities(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 43, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
+044:         self.__activities_in_pattern_dfg = set()
  __pyx_t_1 = PySet_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 44, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_GreedyCoverComputer__activities_in_pattern_dfg);
  __Pyx_DECREF(__pyx_v_self->_GreedyCoverComputer__activities_in_pattern_dfg);
  __pyx_v_self->_GreedyCoverComputer__activities_in_pattern_dfg = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 045:         cdef Node node
+046:         for node in pattern_dfg.nodes.values():
  __pyx_t_2 = 0;
  if (unlikely(__pyx_v_pattern_dfg->__pyx_base.nodes == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values");
    __PYX_ERR(0, 46, __pyx_L1_error)
  }
  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_pattern_dfg->__pyx_base.nodes, 1, __pyx_mstate_global->__pyx_n_u_values, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_5;
  __pyx_t_5 = 0;
  while (1) {
    __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, NULL, &__pyx_t_5, NULL, __pyx_t_4);
    if (unlikely(__pyx_t_6 == 0)) break;
    if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_mstate_global->__pyx_ptype_16prolothar_common_6models_3dfg_4node_Node))))) __PYX_ERR(0, 46, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_node, ((struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *)__pyx_t_5));
    __pyx_t_5 = 0;
+047:             self.__activities_in_pattern_dfg.update(
    __pyx_t_7 = __pyx_v_self->_GreedyCoverComputer__activities_in_pattern_dfg;
    __Pyx_INCREF(__pyx_t_7);
+048:                     (<Pattern>node.pattern).get_activity_set())
    __pyx_t_8 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_node->pattern)->__pyx_vtab)->get_activity_set(((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_node->pattern), 0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 48, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_9 = 0;
    {
      PyObject *__pyx_callargs[2] = {__pyx_t_7, __pyx_t_8};
      __pyx_t_5 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_update, __pyx_callargs+__pyx_t_9, (2-__pyx_t_9) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 47, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 049: 
+050:     cdef dict __create_cached_patterns_for_activities(self):
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__GreedyCoverComputer__create_cached_patterns_for_activities(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self) {
  PyObject *__pyx_v_cached_patterns_for_activity = 0;
  struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *__pyx_v_node = 0;
  PyObject *__pyx_v_activity = NULL;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_XDECREF(__pyx_t_17);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__create_cached_patterns_for_activities", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_cached_patterns_for_activity);
  __Pyx_XDECREF((PyObject *)__pyx_v_node);
  __Pyx_XDECREF(__pyx_v_activity);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 051:         """returns a dictionary that stores for each activity in which
 052:         patterns (activity names of the these patterns) this activity occurs.
 053: 
 054:         returns Dict[str, List[str]]
 055:         """
+056:         cdef dict cached_patterns_for_activity = {}
  __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 56, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_cached_patterns_for_activity = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
 057:         cdef Node node
+058:         for node in self.pattern_dfg.nodes.values():
  __pyx_t_2 = 0;
  if (unlikely(__pyx_v_self->pattern_dfg->__pyx_base.nodes == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "values");
    __PYX_ERR(0, 58, __pyx_L1_error)
  }
  __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_self->pattern_dfg->__pyx_base.nodes, 1, __pyx_mstate_global->__pyx_n_u_values, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_1);
  __pyx_t_1 = __pyx_t_5;
  __pyx_t_5 = 0;
  while (1) {
    __pyx_t_6 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, NULL, &__pyx_t_5, NULL, __pyx_t_4);
    if (unlikely(__pyx_t_6 == 0)) break;
    if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 58, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    if (!(likely(((__pyx_t_5) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_5, __pyx_mstate_global->__pyx_ptype_16prolothar_common_6models_3dfg_4node_Node))))) __PYX_ERR(0, 58, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_node, ((struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *)__pyx_t_5));
    __pyx_t_5 = 0;
+059:             for activity in (<Pattern>node.pattern).get_activity_set():
    __pyx_t_7 = 0;
    __pyx_t_9 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_node->pattern)->__pyx_vtab)->get_activity_set(((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_node->pattern), 0); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 59, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_10 = __Pyx_set_iterator(__pyx_t_9, 1, (&__pyx_t_8), (&__pyx_t_6)); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 59, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_XDECREF(__pyx_t_5);
    __pyx_t_5 = __pyx_t_10;
    __pyx_t_10 = 0;
    while (1) {
      __pyx_t_11 = __Pyx_set_iter_next(__pyx_t_5, __pyx_t_8, &__pyx_t_7, &__pyx_t_10, __pyx_t_6);
      if (unlikely(__pyx_t_11 == 0)) break;
      if (unlikely(__pyx_t_11 == -1)) __PYX_ERR(0, 59, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_XDECREF_SET(__pyx_v_activity, __pyx_t_10);
      __pyx_t_10 = 0;
+060:                 try:
      {
        /*try:*/ {
/* … */
        }
        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
        __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0;
        goto __pyx_L14_try_end;
        __pyx_L7_error:;
        __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
        __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
/* … */
        __pyx_L9_except_error:;
        __Pyx_XGIVEREF(__pyx_t_12);
        __Pyx_XGIVEREF(__pyx_t_13);
        __Pyx_XGIVEREF(__pyx_t_14);
        __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
        goto __pyx_L1_error;
        __pyx_L8_exception_handled:;
        __Pyx_XGIVEREF(__pyx_t_12);
        __Pyx_XGIVEREF(__pyx_t_13);
        __Pyx_XGIVEREF(__pyx_t_14);
        __Pyx_ExceptionReset(__pyx_t_12, __pyx_t_13, __pyx_t_14);
        __pyx_L14_try_end:;
      }
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+061:                     (<list>cached_patterns_for_activity[activity]).append(node.pattern)
          __pyx_t_10 = __Pyx_PyDict_GetItem(__pyx_v_cached_patterns_for_activity, __pyx_v_activity); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 61, __pyx_L7_error)
          __Pyx_GOTREF(__pyx_t_10);
          if (unlikely(__pyx_t_10 == Py_None)) {
            PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append");
            __PYX_ERR(0, 61, __pyx_L7_error)
          }
          __pyx_t_9 = __pyx_v_node->pattern;
          __Pyx_INCREF(__pyx_t_9);
          __pyx_t_15 = __Pyx_PyList_Append(((PyObject*)__pyx_t_10), __pyx_t_9); if (unlikely(__pyx_t_15 == ((int)-1))) __PYX_ERR(0, 61, __pyx_L7_error)
          __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
+062:                 except KeyError:
        __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
        if (__pyx_t_11) {
          __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__create_cached_patterns_for_activities", __pyx_clineno, __pyx_lineno, __pyx_filename);
          if (__Pyx_GetException(&__pyx_t_9, &__pyx_t_10, &__pyx_t_16) < 0) __PYX_ERR(0, 62, __pyx_L9_except_error)
          __Pyx_XGOTREF(__pyx_t_9);
          __Pyx_XGOTREF(__pyx_t_10);
          __Pyx_XGOTREF(__pyx_t_16);
+063:                     cached_patterns_for_activity[activity] = [node.pattern]
          __pyx_t_17 = PyList_New(1); if (unlikely(!__pyx_t_17)) __PYX_ERR(0, 63, __pyx_L9_except_error)
          __Pyx_GOTREF(__pyx_t_17);
          __Pyx_INCREF(__pyx_v_node->pattern);
          __Pyx_GIVEREF(__pyx_v_node->pattern);
          if (__Pyx_PyList_SET_ITEM(__pyx_t_17, 0, __pyx_v_node->pattern) != (0)) __PYX_ERR(0, 63, __pyx_L9_except_error);
          if (unlikely((PyDict_SetItem(__pyx_v_cached_patterns_for_activity, __pyx_v_activity, __pyx_t_17) < 0))) __PYX_ERR(0, 63, __pyx_L9_except_error)
          __Pyx_DECREF(__pyx_t_17); __pyx_t_17 = 0;
          __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
          __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
          __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
          goto __pyx_L8_exception_handled;
        }
        goto __pyx_L9_except_error;
+064:         return cached_patterns_for_activity
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_cached_patterns_for_activity);
  __pyx_r = __pyx_v_cached_patterns_for_activity;
  goto __pyx_L0;
 065: 
+066:     cpdef Cover compute(self, list trace_list,
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
static struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_compute(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, PyObject *__pyx_v_trace_list, int __pyx_skip_dispatch, struct __pyx_opt_args_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_compute *__pyx_optional_args) {
/* … */
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (
  #if !CYTHON_USE_TYPE_SLOTS
  unlikely(Py_TYPE(((PyObject *)__pyx_v_self)) != __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer &&
  __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), Py_TPFLAGS_HAVE_GC))
  #else
  unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0 || __Pyx_PyType_HasFeature(Py_TYPE(((PyObject *)__pyx_v_self)), (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)))
  #endif
  ) {
    #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
    static PY_UINT64_T __pyx_tp_dict_version = __PYX_DICT_VERSION_INIT, __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
    if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) {
      PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
      #endif
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_mstate_global->__pyx_n_u_compute); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      if (!__Pyx_IsSameCFunction(__pyx_t_1, (void(*)(void)) __pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute)) {
        __Pyx_XDECREF((PyObject *)__pyx_r);
        __pyx_t_3 = NULL;
        __Pyx_INCREF(__pyx_t_1);
        __pyx_t_4 = __pyx_t_1; 
        __pyx_t_5 = __Pyx_PyBool_FromLong(__pyx_v_store_patterns_in_pattern_stream); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 66, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_6 = 1;
        #if CYTHON_UNPACK_METHODS
        if (unlikely(PyMethod_Check(__pyx_t_4))) {
          __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
          assert(__pyx_t_3);
          PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
          __Pyx_INCREF(__pyx_t_3);
          __Pyx_INCREF(__pyx__function);
          __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
          __pyx_t_6 = 0;
        }
        #endif
        {
          PyObject *__pyx_callargs[5] = {__pyx_t_3, __pyx_v_trace_list, __pyx_t_5, __pyx_v_activity_set, ((PyObject *)__pyx_v_cover)};
          __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+__pyx_t_6, (5-__pyx_t_6) | (__pyx_t_6*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
          __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
          __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
          __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
          if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error)
          __Pyx_GOTREF(__pyx_t_2);
        }
        if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover))))) __PYX_ERR(0, 66, __pyx_L1_error)
        __pyx_r = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_t_2);
        __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        goto __pyx_L0;
      }
      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
      __pyx_tp_dict_version = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self));
      __pyx_obj_dict_version = __Pyx_get_object_dict_version(((PyObject *)__pyx_v_self));
      if (unlikely(__pyx_typedict_guard != __pyx_tp_dict_version)) {
        __pyx_tp_dict_version = __pyx_obj_dict_version = __PYX_DICT_VERSION_INIT;
      }
      #endif
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      #if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_PYTYPE_LOOKUP && CYTHON_USE_TYPE_SLOTS
    }
    #endif
  }
/* … */
  /* 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("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer.compute", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_event_log);
  __Pyx_XDECREF((PyObject *)__pyx_v_trace);
  __Pyx_XDECREF(__pyx_v_activity_set);
  __Pyx_XDECREF((PyObject *)__pyx_v_cover);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
); /*proto*/
PyDoc_STRVAR(__pyx_doc_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_2compute, "computes a Cover for a PatternDfg on a given list of Traces");
static PyMethodDef __pyx_mdef_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute = {"compute", (PyCFunction)(void(*)(void))(__Pyx_PyCFunction_FastCallWithKeywords)__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute, __Pyx_METH_FASTCALL|METH_KEYWORDS, __pyx_doc_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_2compute};
static PyObject *__pyx_pw_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute(PyObject *__pyx_v_self, 
#if CYTHON_METH_FASTCALL
PyObject *const *__pyx_args, Py_ssize_t __pyx_nargs, PyObject *__pyx_kwds
#else
PyObject *__pyx_args, PyObject *__pyx_kwds
#endif
) {
  PyObject *__pyx_v_trace_list = 0;
  int __pyx_v_store_patterns_in_pattern_stream;
  PyObject *__pyx_v_activity_set = 0;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover = 0;
  #if !CYTHON_METH_FASTCALL
  CYTHON_UNUSED Py_ssize_t __pyx_nargs;
  #endif
  CYTHON_UNUSED PyObject *const *__pyx_kwvalues;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("compute (wrapper)", 0);
  #if !CYTHON_METH_FASTCALL
  #if CYTHON_ASSUME_SAFE_SIZE
  __pyx_nargs = PyTuple_GET_SIZE(__pyx_args);
  #else
  __pyx_nargs = PyTuple_Size(__pyx_args); if (unlikely(__pyx_nargs < 0)) return NULL;
  #endif
  #endif
  __pyx_kwvalues = __Pyx_KwValues_FASTCALL(__pyx_args, __pyx_nargs);
  {
    PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_trace_list,&__pyx_mstate_global->__pyx_n_u_store_patterns_in_pattern_stream,&__pyx_mstate_global->__pyx_n_u_activity_set,&__pyx_mstate_global->__pyx_n_u_cover,0};
  PyObject* values[4] = {0,0,0,0};
    const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
    if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 66, __pyx_L3_error)
    if (__pyx_kwds_len > 0) {
      switch (__pyx_nargs) {
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      const Py_ssize_t kwd_pos_args = __pyx_nargs;
      if (__Pyx_ParseKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values, kwd_pos_args, __pyx_kwds_len, "compute", 0) < 0) __PYX_ERR(0, 66, __pyx_L3_error)
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  goto __pyx_L7_cleaned_up;
  __pyx_L0:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __pyx_L7_cleaned_up:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_2compute(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, PyObject *__pyx_v_trace_list, int __pyx_v_store_patterns_in_pattern_stream, PyObject *__pyx_v_activity_set, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover) {
  PyObject *__pyx_r = NULL;
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2.__pyx_n = 3;
  __pyx_t_2.store_patterns_in_pattern_stream = __pyx_v_store_patterns_in_pattern_stream;
  __pyx_t_2.activity_set = __pyx_v_activity_set;
  __pyx_t_2.cover = __pyx_v_cover;
  __pyx_t_1 = ((PyObject *)__pyx_vtabptr_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer->compute(__pyx_v_self, __pyx_v_trace_list, 1, &__pyx_t_2)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __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("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer.compute", __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_New(&__pyx_mdef_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_3compute, __Pyx_CYFUNCTION_CCLASS, __pyx_mstate_global->__pyx_n_u_GreedyCoverComputer_compute, NULL, __pyx_mstate_global->__pyx_n_u_prolothar_process_discovery_disc, __pyx_mstate_global->__pyx_d, ((PyObject *)__pyx_mstate_global->__pyx_codeobj_tab[1])); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_2, __pyx_mstate_global->__pyx_tuple[2]);
  if (__Pyx_SetItemOnTypeDict(__pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer, __pyx_mstate_global->__pyx_n_u_compute, __pyx_t_2) < 0) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+067:                 bint store_patterns_in_pattern_stream = False,
  int __pyx_v_store_patterns_in_pattern_stream = ((int)0);
/* … */
      __pyx_v_store_patterns_in_pattern_stream = ((int)0);
    }
    __pyx_v_activity_set = ((PyObject*)values[2]);
    __pyx_v_cover = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)values[3]);
  }
  goto __pyx_L6_skip;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("compute", 0, 1, 4, __pyx_nargs); __PYX_ERR(0, 66, __pyx_L3_error)
  __pyx_L6_skip:;
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L3_error:;
  for (Py_ssize_t __pyx_temp=0; __pyx_temp < (Py_ssize_t)(sizeof(values)/sizeof(values[0])); ++__pyx_temp) {
    Py_XDECREF(values[__pyx_temp]);
  }
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer.compute", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_trace_list), (&PyList_Type), 1, "trace_list", 1))) __PYX_ERR(0, 66, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_activity_set), (&PySet_Type), 1, "activity_set", 1))) __PYX_ERR(0, 68, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_cover), __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover, 1, "cover", 0))) __PYX_ERR(0, 69, __pyx_L1_error)
  __pyx_r = __pyx_pf_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer_2compute(((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self), __pyx_v_trace_list, __pyx_v_store_patterns_in_pattern_stream, __pyx_v_activity_set, __pyx_v_cover);
+068:                 set activity_set = None,
  PyObject *__pyx_v_activity_set = ((PyObject*)Py_None);
/* … */
      if (!values[2]) values[2] = __Pyx_NewRef(((PyObject*)Py_None));
/* … */
      if (!values[2]) values[2] = __Pyx_NewRef(((PyObject*)Py_None));
+069:                 Cover cover = None):
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)Py_None);
  PyObject *__pyx_v_event_log = NULL;
  struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *__pyx_v_trace = 0;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_r = NULL;
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_store_patterns_in_pattern_stream = __pyx_optional_args->store_patterns_in_pattern_stream;
      if (__pyx_optional_args->__pyx_n > 1) {
        __pyx_v_activity_set = __pyx_optional_args->activity_set;
        if (__pyx_optional_args->__pyx_n > 2) {
          __pyx_v_cover = __pyx_optional_args->cover;
        }
      }
    }
  }
  __Pyx_INCREF(__pyx_v_activity_set);
  __Pyx_INCREF((PyObject *)__pyx_v_cover);
/* … */
      if (!values[3]) values[3] = __Pyx_NewRef((PyObject *)((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)Py_None));
      for (Py_ssize_t i = __pyx_nargs; i < 1; i++) {
        if (unlikely(!values[i])) { __Pyx_RaiseArgtupleInvalid("compute", 0, 1, 4, i); __PYX_ERR(0, 66, __pyx_L3_error) }
      }
    } else {
      switch (__pyx_nargs) {
        case  4:
        values[3] = __Pyx_ArgRef_FASTCALL(__pyx_args, 3);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[3])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  3:
        values[2] = __Pyx_ArgRef_FASTCALL(__pyx_args, 2);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[2])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  2:
        values[1] = __Pyx_ArgRef_FASTCALL(__pyx_args, 1);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[1])) __PYX_ERR(0, 66, __pyx_L3_error)
        CYTHON_FALLTHROUGH;
        case  1:
        values[0] = __Pyx_ArgRef_FASTCALL(__pyx_args, 0);
        if (!CYTHON_ASSUME_SAFE_MACROS && unlikely(!values[0])) __PYX_ERR(0, 66, __pyx_L3_error)
        break;
        default: goto __pyx_L5_argtuple_error;
      }
/* … */
      if (!values[3]) values[3] = __Pyx_NewRef((PyObject *)((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)Py_None));
    }
    __pyx_v_trace_list = ((PyObject*)values[0]);
    if (values[1]) {
      __pyx_v_store_patterns_in_pattern_stream = __Pyx_PyObject_IsTrue(values[1]); if (unlikely((__pyx_v_store_patterns_in_pattern_stream == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 67, __pyx_L3_error)
    } else {
 070:         """computes a Cover for a PatternDfg on a given list of Traces"""
 071: 
+072:         if activity_set is None:
  __pyx_t_7 = (__pyx_v_activity_set == ((PyObject*)Py_None));
  if (__pyx_t_7) {
/* … */
  }
+073:             event_log = EventLog()
    __pyx_t_2 = NULL;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_mstate_global->__pyx_n_u_EventLog); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_6 = 1;
    #if CYTHON_UNPACK_METHODS
    if (unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
      assert(__pyx_t_2);
      PyObject* __pyx__function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(__pyx__function);
      __Pyx_DECREF_SET(__pyx_t_4, __pyx__function);
      __pyx_t_6 = 0;
    }
    #endif
    {
      PyObject *__pyx_callargs[2] = {__pyx_t_2, NULL};
      __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_4, __pyx_callargs+__pyx_t_6, (1-__pyx_t_6) | (__pyx_t_6*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 73, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    __pyx_v_event_log = __pyx_t_1;
    __pyx_t_1 = 0;
+074:             event_log.traces = trace_list
    if (__Pyx_PyObject_SetAttrStr(__pyx_v_event_log, __pyx_mstate_global->__pyx_n_u_traces, __pyx_v_trace_list) < 0) __PYX_ERR(0, 74, __pyx_L1_error)
+075:             activity_set = event_log.compute_activity_set()
    __pyx_t_4 = __pyx_v_event_log;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_6 = 0;
    {
      PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL};
      __pyx_t_1 = __Pyx_PyObject_FastCallMethod(__pyx_mstate_global->__pyx_n_u_compute_activity_set, __pyx_callargs+__pyx_t_6, (1-__pyx_t_6) | (1*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 75, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    }
    if (!(likely(PySet_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None) || __Pyx_RaiseUnexpectedTypeError("set", __pyx_t_1))) __PYX_ERR(0, 75, __pyx_L1_error)
    __Pyx_DECREF_SET(__pyx_v_activity_set, ((PyObject*)__pyx_t_1));
    __pyx_t_1 = 0;
 076: 
+077:         if cover is None:
  __pyx_t_7 = (((PyObject *)__pyx_v_cover) == Py_None);
  if (__pyx_t_7) {
/* … */
  }
+078:             cover = Cover(
    __pyx_t_4 = NULL;
    __Pyx_INCREF((PyObject *)__pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover);
    __pyx_t_2 = ((PyObject *)__pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover); 
 079:                 self.pattern_dfg, activity_set,
+080:                 store_patterns_in_pattern_stream=store_patterns_in_pattern_stream)
    __pyx_t_5 = __Pyx_PyBool_FromLong(__pyx_v_store_patterns_in_pattern_stream); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 80, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = 1;
    {
      PyObject *__pyx_callargs[3 + ((CYTHON_VECTORCALL) ? 1 : 0)] = {__pyx_t_4, ((PyObject *)__pyx_v_self->pattern_dfg), __pyx_v_activity_set};
      __pyx_t_3 = __Pyx_MakeVectorcallBuilderKwds(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 78, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      if (__Pyx_VectorcallBuilder_AddArg(__pyx_mstate_global->__pyx_n_u_store_patterns_in_pattern_stream, __pyx_t_5, __pyx_t_3, __pyx_callargs+3, 0) < 0) __PYX_ERR(0, 78, __pyx_L1_error)
      __pyx_t_1 = __Pyx_Object_Vectorcall_CallFromBuilder(__pyx_t_2, __pyx_callargs+__pyx_t_6, (3-__pyx_t_6) | (__pyx_t_6*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET), __pyx_t_3);
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error)
      __Pyx_GOTREF((PyObject *)__pyx_t_1);
    }
    __Pyx_DECREF_SET(__pyx_v_cover, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_t_1));
    __pyx_t_1 = 0;
 081: 
 082:         cdef Trace trace
+083:         for trace in trace_list:
  if (unlikely(__pyx_v_trace_list == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 83, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_v_trace_list; __Pyx_INCREF(__pyx_t_1);
  __pyx_t_8 = 0;
  for (;;) {
    {
      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
      #if !CYTHON_ASSUME_SAFE_SIZE
      if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 83, __pyx_L1_error)
      #endif
      if (__pyx_t_8 >= __pyx_temp) break;
    }
    __pyx_t_2 = __Pyx_PyList_GetItemRef(__pyx_t_1, __pyx_t_8);
    ++__pyx_t_8;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 83, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_mstate_global->__pyx_ptype_16prolothar_common_6models_8eventlog_5trace_Trace))))) __PYX_ERR(0, 83, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_trace, ((struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *)__pyx_t_2));
    __pyx_t_2 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+084:             if cover.can_cover_trace_with_cache(trace):
    __pyx_t_7 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->can_cover_trace_with_cache(__pyx_v_cover, __pyx_v_trace, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 84, __pyx_L1_error)
    if (__pyx_t_7) {
/* … */
      goto __pyx_L7;
    }
+085:                 cover.use_cache_to_cover_trace(trace)
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->use_cache_to_cover_trace(__pyx_v_cover, __pyx_v_trace, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 85, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 086:             else:
+087:                 self._extend_cover_for_trace(cover, trace)
    /*else*/ {
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_extend_cover_for_trace(__pyx_v_self, __pyx_v_cover, __pyx_v_trace); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 87, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    }
    __pyx_L7:;
 088: 
+089:         return cover
  __Pyx_XDECREF((PyObject *)__pyx_r);
  __Pyx_INCREF((PyObject *)__pyx_v_cover);
  __pyx_r = __pyx_v_cover;
  goto __pyx_L0;
 090: 
+091:     cdef _extend_cover_for_trace(self, Cover cover, Trace trace):
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__extend_cover_for_trace(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *__pyx_v_trace) {
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_current_covering_pattern = 0;
  PyObject *__pyx_v_last_covered_activity = 0;
  struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *__pyx_v_event = 0;
  PyObject *__pyx_v_next_matching_patterns = 0;
  PyObject *__pyx_r = NULL;
/* … */
  /* 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_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._extend_cover_for_trace", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_current_covering_pattern);
  __Pyx_XDECREF(__pyx_v_last_covered_activity);
  __Pyx_XDECREF((PyObject *)__pyx_v_event);
  __Pyx_XDECREF(__pyx_v_next_matching_patterns);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+092:         cover.start_trace_covering(trace)
  __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->start_trace_covering(__pyx_v_cover, __pyx_v_trace, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 92, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+093:         cdef CoveringPattern current_covering_pattern = None
  __Pyx_INCREF(Py_None);
  __pyx_v_current_covering_pattern = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)Py_None);
+094:         cdef str last_covered_activity = None
  __Pyx_INCREF(Py_None);
  __pyx_v_last_covered_activity = ((PyObject*)Py_None);
 095:         cdef Event event
 096:         cdef list next_matching_patterns
+097:         for event in trace.events:
  if (unlikely(__pyx_v_trace->events == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 97, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_v_trace->events; __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = 0;
  for (;;) {
    {
      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
      #if !CYTHON_ASSUME_SAFE_SIZE
      if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 97, __pyx_L1_error)
      #endif
      if (__pyx_t_2 >= __pyx_temp) break;
    }
    __pyx_t_3 = __Pyx_PyList_GetItemRef(__pyx_t_1, __pyx_t_2);
    ++__pyx_t_2;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_mstate_global->__pyx_ptype_16prolothar_common_6models_8eventlog_5event_Event))))) __PYX_ERR(0, 97, __pyx_L1_error)
    __Pyx_XDECREF_SET(__pyx_v_event, ((struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *)__pyx_t_3));
    __pyx_t_3 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+098:             next_matching_patterns = self.__get_next_matching_patterns(event)
    __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__get_next_matching_patterns(__pyx_v_self, __pyx_v_event); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_XDECREF_SET(__pyx_v_next_matching_patterns, ((PyObject*)__pyx_t_3));
    __pyx_t_3 = 0;
 099:             #if there is no pattern containing the activity, we have a log move
+100:             if not next_matching_patterns:
    __pyx_t_4 = (__pyx_v_next_matching_patterns != Py_None)&&(__Pyx_PyList_GET_SIZE(__pyx_v_next_matching_patterns) != 0);
    if (unlikely(((!CYTHON_ASSUME_SAFE_MACROS) && __pyx_t_4 < 0))) __PYX_ERR(0, 100, __pyx_L1_error)
    __pyx_t_5 = (!__pyx_t_4);
    if (__pyx_t_5) {
/* … */
      goto __pyx_L5;
    }
+101:                 self.__add_log_move(
      __pyx_t_6 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__add_log_move(__pyx_v_self, __pyx_v_cover, __pyx_v_current_covering_pattern, __pyx_v_last_covered_activity, ((PyObject*)__pyx_t_3), 0); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 101, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
 102:                         cover, current_covering_pattern,
 103:                         last_covered_activity,
+104:                         <str>event.activity_name,
      __pyx_t_3 = __pyx_v_event->activity_name;
      __Pyx_INCREF(__pyx_t_3);
 105:                         False)
 106:             #currently, we expect that only one high-level pattern contains the activity
+107:             elif len(next_matching_patterns) > 1:
    if (unlikely(__pyx_v_next_matching_patterns == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      __PYX_ERR(0, 107, __pyx_L1_error)
    }
    __pyx_t_7 = __Pyx_PyList_GET_SIZE(__pyx_v_next_matching_patterns); if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 107, __pyx_L1_error)
    __pyx_t_5 = (__pyx_t_7 > 1);
    if (unlikely(__pyx_t_5)) {
/* … */
    }
+108:                 raise NotImplementedError(
      __pyx_t_3 = NULL;
      __Pyx_INCREF(__pyx_builtin_NotImplementedError);
      __pyx_t_8 = __pyx_builtin_NotImplementedError; 
+109:                         'more than one matching pattern for "%s"' % event.activity_name)
      __pyx_t_9 = PyUnicode_Format(__pyx_mstate_global->__pyx_kp_u_more_than_one_matching_pattern_f, __pyx_v_event->activity_name); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 109, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __pyx_t_10 = 1;
      {
        PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_t_9};
        __pyx_t_6 = __Pyx_PyObject_FastCall(__pyx_t_8, __pyx_callargs+__pyx_t_10, (2-__pyx_t_10) | (__pyx_t_10*__Pyx_PY_VECTORCALL_ARGUMENTS_OFFSET));
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 108, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
      }
      __Pyx_Raise(__pyx_t_6, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __PYX_ERR(0, 108, __pyx_L1_error)
 110:             #standard case: there is exactly one pattern containing the activity
 111:             else:
+112:                 current_covering_pattern = self.__cover_event_using_pattern(
    /*else*/ {
/* … */
      __pyx_t_8 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__cover_event_using_pattern(__pyx_v_self, __pyx_v_current_covering_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_6), __pyx_v_last_covered_activity, __pyx_v_event, __pyx_v_cover, __pyx_v_trace)); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 112, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF_SET(__pyx_v_current_covering_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_8));
      __pyx_t_8 = 0;
    }
    __pyx_L5:;
+113:                         current_covering_pattern, next_matching_patterns[0],
      if (unlikely(__pyx_v_next_matching_patterns == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 113, __pyx_L1_error)
      }
      __pyx_t_6 = __Pyx_GetItemInt_List(__pyx_v_next_matching_patterns, 0, long, 1, __Pyx_PyLong_From_long, 1, 0, 1, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 113, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (!(likely(((__pyx_t_6) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_6, __pyx_mstate_global->__pyx_ptype_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern))))) __PYX_ERR(0, 113, __pyx_L1_error)
 114:                         last_covered_activity, event, cover, trace)
+115:             last_covered_activity = <str>event.activity_name
    __pyx_t_8 = __pyx_v_event->activity_name;
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_DECREF_SET(__pyx_v_last_covered_activity, ((PyObject*)__pyx_t_8));
    __pyx_t_8 = 0;
+116:         cover.end_trace_covering(trace)
  __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->end_trace_covering(__pyx_v_cover, __pyx_v_trace, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 116, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 117: 
+118:     cdef list __get_next_matching_patterns(self, Event event):
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__GreedyCoverComputer__get_next_matching_patterns(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *__pyx_v_event) {
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__get_next_matching_patterns", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
+119:         try:
  {
    /*try:*/ {
/* … */
    }
    __pyx_L3_error:;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
    __pyx_L5_except_error:;
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L7_try_return:;
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
    __pyx_L6_except_return:;
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
  }
+120:             return <list>(self.cached_patterns_for_activity[event.activity_name])
      __Pyx_XDECREF(__pyx_r);
      if (unlikely(__pyx_v_self->cached_patterns_for_activity == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 120, __pyx_L3_error)
      }
      __pyx_t_4 = __Pyx_PyDict_GetItem(__pyx_v_self->cached_patterns_for_activity, __pyx_v_event->activity_name); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 120, __pyx_L3_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_INCREF(((PyObject*)__pyx_t_4));
      __pyx_r = ((PyObject*)__pyx_t_4);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L7_try_return;
+121:         except KeyError:
    __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError);
    if (__pyx_t_5) {
      __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__get_next_matching_patterns", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 121, __pyx_L5_except_error)
      __Pyx_XGOTREF(__pyx_t_4);
      __Pyx_XGOTREF(__pyx_t_6);
      __Pyx_XGOTREF(__pyx_t_7);
 122:             #Pattern DFG does not contain activity
+123:             return []
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_8 = PyList_New(0); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 123, __pyx_L5_except_error)
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_r = ((PyObject*)__pyx_t_8);
      __pyx_t_8 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
 124: 
+125:     cdef CoveringPattern __cover_event_using_pattern(
static struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__GreedyCoverComputer__cover_event_using_pattern(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_current_covering_pattern, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *__pyx_v_pattern, PyObject *__pyx_v_last_covered_activity, struct __pyx_obj_16prolothar_common_6models_8eventlog_5event_Event *__pyx_v_event, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *__pyx_v_trace) {
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_r = NULL;
  __Pyx_INCREF((PyObject *)__pyx_v_current_covering_pattern);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__cover_event_using_pattern", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_current_covering_pattern);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 126:             self, CoveringPattern current_covering_pattern,
 127:             Pattern pattern,
 128:             str last_covered_activity,
 129:             Event event,
 130:             Cover cover,
 131:             Trace trace):
 132:         #case 1: we are still in the same pattern and continue our cover with
 133:         #this pattern
+134:         if (current_covering_pattern is not None and
  __pyx_t_2 = (((PyObject *)__pyx_v_current_covering_pattern) != Py_None);
  if (__pyx_t_2) {
  } else {
    __pyx_t_1 = __pyx_t_2;
    goto __pyx_L4_bool_binop_done;
  }
/* … */
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+135:             pattern == current_covering_pattern.pattern):
  __pyx_t_3 = PyObject_RichCompare(((PyObject *)__pyx_v_pattern), ((PyObject *)__pyx_v_current_covering_pattern->pattern), Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely((__pyx_t_2 < 0))) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_1 = __pyx_t_2;
  __pyx_L4_bool_binop_done:;
+136:             current_covering_pattern = self._handle_continue_pattern_in_cover(
    __pyx_t_4 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_handle_continue_pattern_in_cover(__pyx_v_self, __pyx_v_current_covering_pattern, __pyx_v_cover, __pyx_v_trace, __pyx_v_last_covered_activity, ((PyObject*)__pyx_t_3))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 136, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF_SET(__pyx_v_current_covering_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_4));
    __pyx_t_4 = 0;
 137:                     current_covering_pattern, cover, trace,
 138:                     last_covered_activity,
+139:                    <str>event.activity_name)
    __pyx_t_3 = __pyx_v_event->activity_name;
    __Pyx_INCREF(__pyx_t_3);
 140:         #case 2: we have a pattern change
 141:         else:
+142:             current_covering_pattern = self._handle_pattern_change_in_cover(
  /*else*/ {
/* … */
    __pyx_t_3 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_handle_pattern_change_in_cover(__pyx_v_self, __pyx_v_current_covering_pattern, __pyx_v_cover, __pyx_v_trace, __pyx_v_pattern, __pyx_v_last_covered_activity, ((PyObject*)__pyx_t_4))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF_SET(__pyx_v_current_covering_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_3));
    __pyx_t_3 = 0;
  }
  __pyx_L3:;
 143:                     current_covering_pattern, cover, trace,
 144:                     pattern, last_covered_activity,
+145:                     <str>event.activity_name)
    __pyx_t_4 = __pyx_v_event->activity_name;
    __Pyx_INCREF(__pyx_t_4);
 146: 
+147:         return current_covering_pattern
  __Pyx_XDECREF((PyObject *)__pyx_r);
  __Pyx_INCREF((PyObject *)__pyx_v_current_covering_pattern);
  __pyx_r = __pyx_v_current_covering_pattern;
  goto __pyx_L0;
 148: 
+149:     cdef CoveringPattern _handle_continue_pattern_in_cover(
static struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__handle_continue_pattern_in_cover(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_current_covering_pattern, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *__pyx_v_trace, PyObject *__pyx_v_last_covered_activity, PyObject *__pyx_v_next_activity_to_cover) {
  PyObject *__pyx_v_following_activities = NULL;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_r = NULL;
  __Pyx_INCREF((PyObject *)__pyx_v_current_covering_pattern);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._handle_continue_pattern_in_cover", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_following_activities);
  __Pyx_XDECREF((PyObject *)__pyx_v_current_covering_pattern);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 150:             self, CoveringPattern current_covering_pattern, Cover cover,
 151:             Trace trace, str last_covered_activity,
 152:             str next_activity_to_cover):
 153:         #if we are already at the end of the current pattern, we have to repeat it.
 154:         #however, we are only allowed to do this iff there is a self-loop
+155:         if current_covering_pattern.completed_covering:
  if (__pyx_v_current_covering_pattern->completed_covering) {
/* … */
    goto __pyx_L3;
  }
+156:             following_activities = cover.get_following_activities(
    __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->get_following_activities(__pyx_v_cover, ((PyObject*)__pyx_t_1), 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 156, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_following_activities = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
+157:                     current_covering_pattern.pattern.get_activity_name())
    __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_current_covering_pattern->pattern->__pyx_vtab)->get_activity_name(__pyx_v_current_covering_pattern->pattern, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 157, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
+158:             current_covering_pattern = current_covering_pattern.pattern.for_covering(
    __pyx_t_1 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_current_covering_pattern->pattern->__pyx_vtab)->for_covering(__pyx_v_current_covering_pattern->pattern, ((PyObject *)__pyx_v_trace), ((PyObject*)__pyx_t_2), 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 158, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_current_covering_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_1));
    __pyx_t_1 = 0;
 159:                 trace,
+160:                 current_covering_pattern.last_covered_activity_before_this_pattern)
    __pyx_t_2 = __pyx_v_current_covering_pattern->last_covered_activity_before_this_pattern;
    __Pyx_INCREF(__pyx_t_2);
+161:             if (current_covering_pattern.pattern.get_activity_name() in
    __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_current_covering_pattern->pattern->__pyx_vtab)->get_activity_name(__pyx_v_current_covering_pattern->pattern, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
/* … */
    if (__pyx_t_3) {
/* … */
      goto __pyx_L4;
    }
+162:                 following_activities):
    __pyx_t_3 = (__Pyx_PySequence_ContainsTF(__pyx_t_1, __pyx_v_following_activities, Py_EQ)); if (unlikely((__pyx_t_3 < 0))) __PYX_ERR(0, 161, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+163:                 cover.pattern_stream.add(current_covering_pattern.pattern,
      __pyx_t_1 = ((PyObject *)__pyx_v_current_covering_pattern->pattern);
      __Pyx_INCREF(__pyx_t_1);
/* … */
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_13cover_streams_14pattern_stream_PatternStream *)__pyx_v_cover->pattern_stream->__pyx_vtab)->add(__pyx_v_cover->pattern_stream, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_1), __pyx_v_following_activities, 0, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 163, __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;
 164:                                          following_activities)
+165:                 current_covering_pattern.process_covering_step(
      __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_current_covering_pattern->__pyx_vtab)->process_covering_step(__pyx_v_current_covering_pattern, __pyx_v_cover, ((PyObject*)__pyx_t_2), __pyx_v_next_activity_to_cover, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 165, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 166:                     cover,
+167:                     current_covering_pattern.last_covered_activity_before_this_pattern,
      __pyx_t_2 = __pyx_v_current_covering_pattern->last_covered_activity_before_this_pattern;
      __Pyx_INCREF(__pyx_t_2);
 168:                     next_activity_to_cover)
 169:             else:
+170:                 self.__add_log_move(cover, current_covering_pattern,
    /*else*/ {
/* … */
      __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__add_log_move(__pyx_v_self, __pyx_v_cover, __pyx_v_current_covering_pattern, __pyx_v_last_covered_activity, __pyx_v_next_activity_to_cover, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 170, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    }
    __pyx_L4:;
 171:                                     last_covered_activity,
 172:                                     next_activity_to_cover,
 173:                                     True)
 174:         else:
+175:             current_covering_pattern.process_covering_step(
  /*else*/ {
/* … */
    __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_current_covering_pattern->__pyx_vtab)->process_covering_step(__pyx_v_current_covering_pattern, __pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_next_activity_to_cover, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 175, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __pyx_L3:;
 176:                     cover, last_covered_activity, next_activity_to_cover)
+177:         return current_covering_pattern
  __Pyx_XDECREF((PyObject *)__pyx_r);
  __Pyx_INCREF((PyObject *)__pyx_v_current_covering_pattern);
  __pyx_r = __pyx_v_current_covering_pattern;
  goto __pyx_L0;
 178: 
+179:     cdef CoveringPattern _handle_pattern_change_in_cover(
static struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__handle_pattern_change_in_cover(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_current_covering_pattern, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, struct __pyx_obj_16prolothar_common_6models_8eventlog_5trace_Trace *__pyx_v_trace, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *__pyx_v_next_matching_pattern, PyObject *__pyx_v_last_covered_activity, PyObject *__pyx_v_next_activity_to_cover) {
  PyObject *__pyx_v_shortest_path = NULL;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_next_current_covering_pattern = NULL;
  struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._handle_pattern_change_in_cover", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_shortest_path);
  __Pyx_XDECREF((PyObject *)__pyx_v_next_current_covering_pattern);
  __Pyx_XGIVEREF((PyObject *)__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 180:             self, CoveringPattern current_covering_pattern, Cover cover,
 181:             Trace trace, Pattern next_matching_pattern,
 182:             str last_covered_activity,
 183:             str next_activity_to_cover):
 184:         """
 185:             1. first we have to finish covering with current pattern by using skip events
 186:             2. if we have intermediate patterns between the two patterns in the
 187:                pattern dfg, then we have to skip them (model moves)
 188:             3. then we can start to use the next pattern
 189:             Exception: there is no path between the two patterns => log move
 190:         """
+191:         if current_covering_pattern is not None:
  __pyx_t_1 = (((PyObject *)__pyx_v_current_covering_pattern) != Py_None);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+192:             shortest_path = self._get_shortest_path(
    __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_get_shortest_path(__pyx_v_self, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_2), __pyx_v_next_matching_pattern); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 192, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_shortest_path = ((PyObject*)__pyx_t_3);
    __pyx_t_3 = 0;
+193:                     current_covering_pattern.pattern,
    __pyx_t_2 = ((PyObject *)__pyx_v_current_covering_pattern->pattern);
    __Pyx_INCREF(__pyx_t_2);
 194:                     next_matching_pattern)
+195:             if shortest_path:
    __pyx_t_1 = (__pyx_v_shortest_path != Py_None)&&(__Pyx_PyList_GET_SIZE(__pyx_v_shortest_path) != 0);
    if (unlikely(((!CYTHON_ASSUME_SAFE_MACROS) && __pyx_t_1 < 0))) __PYX_ERR(0, 195, __pyx_L1_error)
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+196:                 current_covering_pattern.skip_to_end(
      ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_current_covering_pattern->__pyx_vtab)->skip_to_end(__pyx_v_current_covering_pattern, __pyx_v_cover, __pyx_v_trace, __pyx_v_last_covered_activity, 0); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 196, __pyx_L1_error)
 197:                     cover, trace, last_covered_activity)
 198: 
+199:                 self._skip_intermediate_patterns(
      __pyx_t_4 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_skip_intermediate_patterns(__pyx_v_self, __pyx_v_cover, __pyx_v_last_covered_activity, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_3), ((PyObject*)__pyx_t_2)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 199, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 200:                     cover,
 201:                     last_covered_activity,
+202:                     current_covering_pattern.pattern,
      __pyx_t_3 = ((PyObject *)__pyx_v_current_covering_pattern->pattern);
      __Pyx_INCREF(__pyx_t_3);
+203:                     shortest_path[1:-1]
      if (unlikely(__pyx_v_shortest_path == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 203, __pyx_L1_error)
      }
      __pyx_t_2 = __Pyx_PyList_GetSlice(__pyx_v_shortest_path, 1, -1L); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 203, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
 204:                 )
+205:                 next_current_covering_pattern = next_matching_pattern.for_covering(
      __pyx_t_4 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_next_matching_pattern->__pyx_vtab)->for_covering(__pyx_v_next_matching_pattern, ((PyObject *)__pyx_v_trace), __pyx_v_last_covered_activity, 0)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 205, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_v_next_current_covering_pattern = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_4);
      __pyx_t_4 = 0;
 206:                         trace, last_covered_activity)
+207:                 cover.pattern_stream.add(
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_13cover_streams_14pattern_stream_PatternStream *)__pyx_v_cover->pattern_stream->__pyx_vtab)->add(__pyx_v_cover->pattern_stream, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_4), ((PyObject*)__pyx_t_3), 0, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 207, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+208:                         next_current_covering_pattern.pattern,
      __pyx_t_4 = ((PyObject *)__pyx_v_next_current_covering_pattern->pattern);
      __Pyx_INCREF(__pyx_t_4);
+209:                         cover.get_following_activities(<str>shortest_path[-2]))
      if (unlikely(__pyx_v_shortest_path == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 209, __pyx_L1_error)
      }
      __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_shortest_path, -2L, long, 1, __Pyx_PyLong_From_long, 1, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 209, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->get_following_activities(__pyx_v_cover, ((PyObject*)__pyx_t_2), 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 209, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+210:                 next_current_covering_pattern.process_covering_step(
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_next_current_covering_pattern->__pyx_vtab)->process_covering_step(__pyx_v_next_current_covering_pattern, __pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_next_activity_to_cover, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 210, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 211:                         cover, last_covered_activity, next_activity_to_cover)
 212:             else:
+213:                 self.__add_log_move(cover, current_covering_pattern,
    /*else*/ {
/* … */
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *)__pyx_v_self->__pyx_vtab)->_GreedyCoverComputer__add_log_move(__pyx_v_self, __pyx_v_cover, __pyx_v_current_covering_pattern, __pyx_v_last_covered_activity, __pyx_v_next_activity_to_cover, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 213, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 214:                                     last_covered_activity, next_activity_to_cover,
 215:                                     False)
+216:                 return current_covering_pattern
      __Pyx_XDECREF((PyObject *)__pyx_r);
      __Pyx_INCREF((PyObject *)__pyx_v_current_covering_pattern);
      __pyx_r = __pyx_v_current_covering_pattern;
      goto __pyx_L0;
    }
    __pyx_L4:;
 217:         else:
 218:             #we are at the start of the trace
+219:             next_current_covering_pattern = next_matching_pattern.for_covering(
  /*else*/ {
/* … */
    __pyx_t_2 = ((PyObject *)((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_next_matching_pattern->__pyx_vtab)->for_covering(__pyx_v_next_matching_pattern, ((PyObject *)__pyx_v_trace), ((PyObject*)Py_None), 0)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 219, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_next_current_covering_pattern = ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_t_2);
    __pyx_t_2 = 0;
 220:                     trace, None)
+221:             next_current_covering_pattern.process_covering_step(
    __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_next_current_covering_pattern->__pyx_vtab)->process_covering_step(__pyx_v_next_current_covering_pattern, __pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_next_activity_to_cover, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 221, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 222:                     cover, last_covered_activity, next_activity_to_cover)
+223:             cover.pattern_stream.add(
    __pyx_t_4 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_13cover_streams_14pattern_stream_PatternStream *)__pyx_v_cover->pattern_stream->__pyx_vtab)->add(__pyx_v_cover->pattern_stream, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_2), ((PyObject*)__pyx_t_3), 0, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __pyx_L3:;
+224:                     next_current_covering_pattern.pattern,
    __pyx_t_2 = ((PyObject *)__pyx_v_next_current_covering_pattern->pattern);
    __Pyx_INCREF(__pyx_t_2);
+225:                     cover.get_all_pattern_names())
    __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->get_all_pattern_names(__pyx_v_cover, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
+226:         return next_current_covering_pattern
  __Pyx_XDECREF((PyObject *)__pyx_r);
  __Pyx_INCREF((PyObject *)__pyx_v_next_current_covering_pattern);
  __pyx_r = __pyx_v_next_current_covering_pattern;
  goto __pyx_L0;
 227: 
+228:     cdef _skip_intermediate_patterns(
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__skip_intermediate_patterns(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, PyObject *__pyx_v_last_covered_activity, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *__pyx_v_preceding_pattern, PyObject *__pyx_v_intermediate_patterns) {
  PyObject *__pyx_v_intermediate_pattern_activity = NULL;
  PyObject *__pyx_v_intermediate_node = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_INCREF((PyObject *)__pyx_v_preceding_pattern);
/* … */
  /* 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_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._skip_intermediate_patterns", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_intermediate_pattern_activity);
  __Pyx_XDECREF(__pyx_v_intermediate_node);
  __Pyx_XDECREF((PyObject *)__pyx_v_preceding_pattern);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 229:             self, Cover cover, str last_covered_activity,
 230:             Pattern preceding_pattern, list intermediate_patterns):
+231:         for intermediate_pattern_activity in intermediate_patterns:
  if (unlikely(__pyx_v_intermediate_patterns == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 231, __pyx_L1_error)
  }
  __pyx_t_1 = __pyx_v_intermediate_patterns; __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = 0;
  for (;;) {
    {
      Py_ssize_t __pyx_temp = __Pyx_PyList_GET_SIZE(__pyx_t_1);
      #if !CYTHON_ASSUME_SAFE_SIZE
      if (unlikely((__pyx_temp < 0))) __PYX_ERR(0, 231, __pyx_L1_error)
      #endif
      if (__pyx_t_2 >= __pyx_temp) break;
    }
    __pyx_t_3 = __Pyx_PyList_GetItemRef(__pyx_t_1, __pyx_t_2);
    ++__pyx_t_2;
    if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 231, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_XDECREF_SET(__pyx_v_intermediate_pattern_activity, __pyx_t_3);
    __pyx_t_3 = 0;
/* … */
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+232:             intermediate_node = self.pattern_dfg.nodes[intermediate_pattern_activity]
    if (unlikely(__pyx_v_self->pattern_dfg->__pyx_base.nodes == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 232, __pyx_L1_error)
    }
    __pyx_t_3 = __Pyx_PyDict_GetItem(__pyx_v_self->pattern_dfg->__pyx_base.nodes, __pyx_v_intermediate_pattern_activity); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 232, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_XDECREF_SET(__pyx_v_intermediate_node, __pyx_t_3);
    __pyx_t_3 = 0;
+233:             cover.add_skipped_pattern(
    __pyx_t_4 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->add_skipped_pattern(__pyx_v_cover, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_3), __pyx_v_preceding_pattern, __pyx_v_last_covered_activity, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 233, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+234:                 <Pattern>((<Node>intermediate_node).pattern),
    __pyx_t_3 = ((struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *)__pyx_v_intermediate_node)->pattern;
    __Pyx_INCREF(__pyx_t_3);
 235:                 preceding_pattern,
 236:                 last_covered_activity
 237:             )
+238:             preceding_pattern = <Pattern>((<Node>intermediate_node).pattern)
    __pyx_t_4 = ((struct __pyx_obj_16prolothar_common_6models_3dfg_4node_Node *)__pyx_v_intermediate_node)->pattern;
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_DECREF_SET(__pyx_v_preceding_pattern, ((struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_t_4));
    __pyx_t_4 = 0;
 239: 
+240:     cdef list _get_shortest_path(self, Pattern start_pattern, Pattern end_pattern):
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__get_shortest_path(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *__pyx_v_start_pattern, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *__pyx_v_end_pattern) {
  PyObject *__pyx_v_shortest_path_cache_key = NULL;
  PyObject *__pyx_v_shortest_path = 0;
  PyObject *__pyx_r = NULL;
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._get_shortest_path", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_shortest_path_cache_key);
  __Pyx_XDECREF(__pyx_v_shortest_path);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 241:         shortest_path_cache_key = (
+242:             start_pattern.get_activity_name(),
  __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_start_pattern->__pyx_vtab)->get_activity_name(__pyx_v_start_pattern, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 242, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
/* … */
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1) != (0)) __PYX_ERR(0, 242, __pyx_L1_error);
  __Pyx_GIVEREF(__pyx_t_2);
  if (__Pyx_PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2) != (0)) __PYX_ERR(0, 242, __pyx_L1_error);
  __pyx_t_1 = 0;
  __pyx_t_2 = 0;
  __pyx_v_shortest_path_cache_key = ((PyObject*)__pyx_t_3);
  __pyx_t_3 = 0;
+243:             end_pattern.get_activity_name()
  __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_end_pattern->__pyx_vtab)->get_activity_name(__pyx_v_end_pattern, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
 244:         )
+245:         cdef list shortest_path = <list>(self.cached_shortest_paths.get(shortest_path_cache_key, None))
  if (unlikely(__pyx_v_self->cached_shortest_paths == Py_None)) {
    PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "get");
    __PYX_ERR(0, 245, __pyx_L1_error)
  }
  __pyx_t_3 = __Pyx_PyDict_GetItemDefault(__pyx_v_self->cached_shortest_paths, __pyx_v_shortest_path_cache_key, Py_None); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __pyx_t_3;
  __Pyx_INCREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_shortest_path = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;
+246:         if shortest_path is None:
  __pyx_t_4 = (__pyx_v_shortest_path == ((PyObject*)Py_None));
  if (__pyx_t_4) {
/* … */
  }
+247:             shortest_path = self.pattern_dfg.compute_shortest_path(
    __pyx_t_1 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *)__pyx_v_self->pattern_dfg->__pyx_base.__pyx_vtab)->__pyx_base.compute_shortest_path(((struct __pyx_obj_16prolothar_common_6models_22directly_follows_graph_DirectlyFollowsGraph *)__pyx_v_self->pattern_dfg), ((PyObject*)__pyx_t_2), ((PyObject*)__pyx_t_3), 0, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 247, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF_SET(__pyx_v_shortest_path, ((PyObject*)__pyx_t_1));
    __pyx_t_1 = 0;
+248:                 start_pattern.get_activity_name(), end_pattern.get_activity_name()
    __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_start_pattern->__pyx_vtab)->get_activity_name(__pyx_v_start_pattern, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 248, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_end_pattern->__pyx_vtab)->get_activity_name(__pyx_v_end_pattern, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 248, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
 249:             )
+250:             self.cached_shortest_paths[shortest_path_cache_key] = shortest_path
    if (unlikely(__pyx_v_self->cached_shortest_paths == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      __PYX_ERR(0, 250, __pyx_L1_error)
    }
    if (unlikely((PyDict_SetItem(__pyx_v_self->cached_shortest_paths, __pyx_v_shortest_path_cache_key, __pyx_v_shortest_path) < 0))) __PYX_ERR(0, 250, __pyx_L1_error)
+251:         return shortest_path
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_shortest_path);
  __pyx_r = __pyx_v_shortest_path;
  goto __pyx_L0;
 252: 
+253:     cdef __add_log_move(self, Cover cover, CoveringPattern current_covering_pattern,
static PyObject *__pyx_f_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_19GreedyCoverComputer__GreedyCoverComputer__add_log_move(struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_12greedy_cover_GreedyCoverComputer *__pyx_v_self, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *__pyx_v_cover, struct __pyx_obj_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *__pyx_v_current_covering_pattern, PyObject *__pyx_v_last_covered_activity, PyObject *__pyx_v_activity, int __pyx_v_caused_by_non_existing_loop) {
  PyObject *__pyx_r = NULL;
/* … */
  /* 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_AddTraceback("prolothar_process_discovery.discovery.proseqo.greedy_cover.GreedyCoverComputer._GreedyCoverComputer__add_log_move", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 254:                        str last_covered_activity, str activity,
 255:                        bint caused_by_non_existing_loop):
+256:         if current_covering_pattern is not None:
  __pyx_t_1 = (((PyObject *)__pyx_v_current_covering_pattern) != Py_None);
  if (__pyx_t_1) {
/* … */
    goto __pyx_L3;
  }
+257:             if current_covering_pattern.completed_covering:
    if (__pyx_v_current_covering_pattern->completed_covering) {
/* … */
      goto __pyx_L4;
    }
+258:                 cover.add_log_move(
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->add_log_move(__pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_activity, ((PyObject*)__pyx_t_3), 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 258, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 259:                     last_covered_activity, activity,
+260:                     self.pattern_dfg.get_coverable_activities(
      __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_11pattern_dfg_PatternDfg *)__pyx_v_self->pattern_dfg->__pyx_base.__pyx_vtab)->get_coverable_activities(__pyx_v_self->pattern_dfg, ((PyObject*)__pyx_t_2), 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 260, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+261:                         current_covering_pattern.pattern.get_activity_name())
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_7pattern_7pattern_Pattern *)__pyx_v_current_covering_pattern->pattern->__pyx_vtab)->get_activity_name(__pyx_v_current_covering_pattern->pattern, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 261, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
 262:                 )
+263:             elif not caused_by_non_existing_loop:
    __pyx_t_1 = (!__pyx_v_caused_by_non_existing_loop);
    if (__pyx_t_1) {
/* … */
      goto __pyx_L4;
    }
+264:                 cover.add_log_move(
      __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->add_log_move(__pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_activity, ((PyObject*)__pyx_t_2), 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 264, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 265:                     last_covered_activity, activity,
+266:                     current_covering_pattern.get_next_coverable_activities()
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_16covering_pattern_16covering_pattern_CoveringPattern *)__pyx_v_current_covering_pattern->__pyx_vtab)->get_next_coverable_activities(__pyx_v_current_covering_pattern, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 266, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
 267:                 )
 268:             else:
+269:                 cover.add_log_move(last_covered_activity, activity, set())
    /*else*/ {
      __pyx_t_3 = PySet_New(0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 269, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_2 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->add_log_move(__pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_activity, ((PyObject*)__pyx_t_3), 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 269, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    }
    __pyx_L4:;
 270:         else:
+271:             cover.add_log_move(last_covered_activity, activity, self.__activities_in_pattern_dfg)
  /*else*/ {
    __pyx_t_2 = __pyx_v_self->_GreedyCoverComputer__activities_in_pattern_dfg;
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_3 = ((struct __pyx_vtabstruct_27prolothar_process_discovery_9discovery_7proseqo_5cover_Cover *)__pyx_v_cover->__pyx_vtab)->add_log_move(__pyx_v_cover, __pyx_v_last_covered_activity, __pyx_v_activity, ((PyObject*)__pyx_t_2), 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 271, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  }
  __pyx_L3:;