Generated by Cython 0.29.34

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

+001: # cython: language_level=3, boundscheck=True, wraparound=False
  __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_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+002: import numpy as np
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+003: import psutil      # For Memory Profiling
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_psutil, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_psutil, __pyx_t_1) < 0) __PYX_ERR(0, 3, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+004: import os
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_os, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 005: cimport cython
 006: 
 007: #from scipy.special import logsumexp
 008: from libc.math cimport exp, log   # For doing Exponentials and Logs
 009: 
+010: DTYPE = np.float64 # The float data type
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_DTYPE, __pyx_t_2) < 0) __PYX_ERR(0, 10, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
 011: 
 012: 
+013: cdef inline double logsumexp(double[:] vec):
static CYTHON_INLINE double __pyx_f_6ancIBD_5cfunc_logsumexp(__Pyx_memviewslice __pyx_v_vec) {
  Py_ssize_t __pyx_v_i;
  double __pyx_v_result;
  double __pyx_v_largest;
  double __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("logsumexp", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("ancIBD.cfunc.logsumexp", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 014:   """Do the Log of the Sum of Exponentials."""
 015:   cdef Py_ssize_t i  # The iterator Variable
+016:   cdef double result = 0.0
  __pyx_v_result = 0.0;
+017:   cdef double largest = vec[0]
  __pyx_t_1 = 0;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_2);
    __PYX_ERR(0, 17, __pyx_L1_error)
  }
  __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
 018: 
+019:   for i in range(1, vec.shape[0]):   # Find Maximum in vec
  __pyx_t_3 = (__pyx_v_vec.shape[0]);
  __pyx_t_4 = __pyx_t_3;
  for (__pyx_t_5 = 1; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_i = __pyx_t_5;
+020:       if (vec[i] > largest):
    __pyx_t_1 = __pyx_v_i;
    __pyx_t_2 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_2 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
    if (unlikely(__pyx_t_2 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_2);
      __PYX_ERR(0, 20, __pyx_L1_error)
    }
    __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) > __pyx_v_largest) != 0);
    if (__pyx_t_6) {
/* … */
    }
  }
+021:           largest = vec[i]
      __pyx_t_1 = __pyx_v_i;
      __pyx_t_2 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_2 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
      if (unlikely(__pyx_t_2 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_2);
        __PYX_ERR(0, 21, __pyx_L1_error)
      }
      __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
+022:   for i in range(vec.shape[0]):
  __pyx_t_3 = (__pyx_v_vec.shape[0]);
  __pyx_t_4 = __pyx_t_3;
  for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_i = __pyx_t_5;
+023:       result += exp(vec[i] - largest)
    __pyx_t_1 = __pyx_v_i;
    __pyx_t_2 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_2 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
    if (unlikely(__pyx_t_2 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_2);
      __PYX_ERR(0, 23, __pyx_L1_error)
    }
    __pyx_v_result = (__pyx_v_result + exp(((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) - __pyx_v_largest)));
  }
+024:   return largest + log(result)
  __pyx_r = (__pyx_v_largest + log(__pyx_v_result));
  goto __pyx_L0;
 025: 
+026: cdef inline long argmax(double[:] vec):
static CYTHON_INLINE long __pyx_f_6ancIBD_5cfunc_argmax(__Pyx_memviewslice __pyx_v_vec) {
  int __pyx_v_m;
  double __pyx_v_v;
  Py_ssize_t __pyx_v_k;
  long __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("argmax", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("ancIBD.cfunc.argmax", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 027:   """Return Max and ArgMax"""
 028:   cdef Py_ssize_t i  # The iterator Variable.
+029:   cdef int m = 0     # Position of the Maximum.
  __pyx_v_m = 0;
+030:   cdef double v = vec[0]
  __pyx_t_1 = 0;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_2);
    __PYX_ERR(0, 30, __pyx_L1_error)
  }
  __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
 031: 
+032:   for k in range(1, vec.shape[0]):   # Find Maximum
  __pyx_t_3 = (__pyx_v_vec.shape[0]);
  __pyx_t_4 = __pyx_t_3;
  for (__pyx_t_5 = 1; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) {
    __pyx_v_k = __pyx_t_5;
+033:     if (vec[k] > v):
    __pyx_t_1 = __pyx_v_k;
    __pyx_t_2 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_2 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
    if (unlikely(__pyx_t_2 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_2);
      __PYX_ERR(0, 33, __pyx_L1_error)
    }
    __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) > __pyx_v_v) != 0);
    if (__pyx_t_6) {
/* … */
    }
  }
+034:       m, v = k, vec[k]
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_1 = __pyx_v_k;
      __pyx_t_2 = -1;
      if (__pyx_t_1 < 0) {
        __pyx_t_2 = 0;
      } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
      if (unlikely(__pyx_t_2 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_2);
        __PYX_ERR(0, 34, __pyx_L1_error)
      }
      __pyx_t_8 = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
      __pyx_v_m = __pyx_t_7;
      __pyx_v_v = __pyx_t_8;
+035:   return m  # Return Argmax
  __pyx_r = __pyx_v_m;
  goto __pyx_L0;
 036: 
+037: cdef inline double sum_array(double[:] vec, int n):
static CYTHON_INLINE double __pyx_f_6ancIBD_5cfunc_sum_array(__Pyx_memviewslice __pyx_v_vec, int __pyx_v_n) {
  double __pyx_v_s;
  long __pyx_v_i;
  double __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("sum_array", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("ancIBD.cfunc.sum_array", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
 038:     """Sum over array.
 039:     vec: Array to sum
 040:     n: Number of elements"""
+041:     cdef double s = vec[0]
  __pyx_t_1 = 0;
  __pyx_t_2 = -1;
  if (__pyx_t_1 < 0) {
    __pyx_t_2 = 0;
  } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0;
  if (unlikely(__pyx_t_2 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_2);
    __PYX_ERR(0, 41, __pyx_L1_error)
  }
  __pyx_v_s = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
+042:     for i in range(1,n):
  __pyx_t_2 = __pyx_v_n;
  __pyx_t_3 = __pyx_t_2;
  for (__pyx_t_4 = 1; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) {
    __pyx_v_i = __pyx_t_4;
+043:         s = s + vec[i]
    __pyx_t_1 = __pyx_v_i;
    __pyx_t_5 = -1;
    if (__pyx_t_1 < 0) {
      __pyx_t_5 = 0;
    } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_5 = 0;
    if (unlikely(__pyx_t_5 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_5);
      __PYX_ERR(0, 43, __pyx_L1_error)
    }
    __pyx_v_s = (__pyx_v_s + (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))));
  }
+044:     return s
  __pyx_r = __pyx_v_s;
  goto __pyx_L0;
 045: 
+046: def print_memory_usage():
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_1print_memory_usage(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_print_memory_usage[] = "Print the current Memory Usage in mB";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_1print_memory_usage = {"print_memory_usage", (PyCFunction)__pyx_pw_6ancIBD_5cfunc_1print_memory_usage, METH_NOARGS, __pyx_doc_6ancIBD_5cfunc_print_memory_usage};
static PyObject *__pyx_pw_6ancIBD_5cfunc_1print_memory_usage(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("print_memory_usage (wrapper)", 0);
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_print_memory_usage(__pyx_self);

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

static PyObject *__pyx_pf_6ancIBD_5cfunc_print_memory_usage(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_v_process = NULL;
  PyObject *__pyx_v_mb_usage = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("print_memory_usage", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("ancIBD.cfunc.print_memory_usage", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_process);
  __Pyx_XDECREF(__pyx_v_mb_usage);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__29 = PyTuple_Pack(2, __pyx_n_s_process, __pyx_n_s_mb_usage); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_1print_memory_usage, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_print_memory_usage, __pyx_t_2) < 0) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_print_memory_usage, 46, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 46, __pyx_L1_error)
 047:     """Print the current Memory Usage in mB"""
+048:     process = psutil.Process(os.getpid())
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_psutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Process); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_getpid); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_5, function);
    }
  }
  __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_5, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_process = __pyx_t_1;
  __pyx_t_1 = 0;
+049:     mb_usage = process.memory_info().rss / 1e6
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_process, __pyx_n_s_memory_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_rss); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyFloat_TrueDivideObjC(__pyx_t_3, __pyx_float_1e6, 1e6, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_mb_usage = __pyx_t_1;
  __pyx_t_1 = 0;
+050:     print(f"Memory Usage: {mb_usage} mB")
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_6 = 0;
  __pyx_t_7 = 127;
  __Pyx_INCREF(__pyx_kp_u_Memory_Usage);
  __pyx_t_6 += 14;
  __Pyx_GIVEREF(__pyx_kp_u_Memory_Usage);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_Memory_Usage);
  __pyx_t_3 = __Pyx_PyObject_FormatSimple(__pyx_v_mb_usage, __pyx_empty_unicode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_3) > __pyx_t_7) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_3) : __pyx_t_7;
  __pyx_t_6 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
  __pyx_t_3 = 0;
  __Pyx_INCREF(__pyx_kp_u_mB);
  __pyx_t_6 += 3;
  __Pyx_GIVEREF(__pyx_kp_u_mB);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_mB);
  __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_1, 3, __pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 051: 
 052: 
+053: def fwd_bkwd(double[:, :] e_mat, double[:, :] t_mat,
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_2fwd_bkwd[] = "Takes emission and transition probabilities, and calculates posteriors.\n    Input: kxl matrices of emission, transition\n    and initialized fwd and bwd probabilities. Given in normal space\n    full: Boolean whether to return everything.\n    output: Whether to print output useful for monitoring";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_3fwd_bkwd = {"fwd_bkwd", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_2fwd_bkwd};
static PyObject *__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_full = 0;
  PyObject *__pyx_v_output = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_fwd,&__pyx_n_s_bwd,&__pyx_n_s_t,&__pyx_n_s_full,&__pyx_n_s_output,0};
    PyObject* values[7] = {0,0,0,0,0,0,0};
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6ancIBD_5cfunc_2fwd_bkwd(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, __Pyx_memviewslice __pyx_v_fwd, __Pyx_memviewslice __pyx_v_bwd, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t, PyObject *__pyx_v_full, PyObject *__pyx_v_output) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_j;
  Py_ssize_t __pyx_v_k;
  PyObject *__pyx_v_post = NULL;
  PyObject *__pyx_v_trans_ll = NULL;
  __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_tot_ll;
  PyObject *__pyx_v_fwd1 = NULL;
  PyObject *__pyx_v_bwd1 = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1);
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_post);
  __Pyx_XDECREF(__pyx_v_trans_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1);
  __Pyx_XDECREF(__pyx_v_fwd1);
  __Pyx_XDECREF(__pyx_v_bwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__31 = PyTuple_Pack(20, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_fwd, __pyx_n_s_bwd, __pyx_n_s_t, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_post, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_t_mat0, __pyx_n_s_e_mat0, __pyx_n_s_tot_ll, __pyx_n_s_fwd1, __pyx_n_s_bwd1); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_3fwd_bkwd, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd, __pyx_t_2) < 0) __PYX_ERR(0, 53, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(7, 0, 20, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 53, __pyx_L1_error)
 054:              double[:, :] fwd, double[:, :] bwd, double[:,:,:] t,
+055:              full=False, output=True):
    values[5] = ((PyObject *)Py_False);
    values[6] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 1); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fwd)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 2); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_bwd)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 3); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 4); __PYX_ERR(0, 53, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  5:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full);
          if (value) { values[5] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  6:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output);
          if (value) { values[6] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd") < 0)) __PYX_ERR(0, 53, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6);
        CYTHON_FALLTHROUGH;
        case  6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5);
        CYTHON_FALLTHROUGH;
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 53, __pyx_L3_error)
    __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 53, __pyx_L3_error)
    __pyx_v_fwd = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_fwd.memview)) __PYX_ERR(0, 54, __pyx_L3_error)
    __pyx_v_bwd = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_bwd.memview)) __PYX_ERR(0, 54, __pyx_L3_error)
    __pyx_v_t = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t.memview)) __PYX_ERR(0, 54, __pyx_L3_error)
    __pyx_v_full = values[5];
    __pyx_v_output = values[6];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 53, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_2fwd_bkwd(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_fwd, __pyx_v_bwd, __pyx_v_t, __pyx_v_full, __pyx_v_output);
 056:     """Takes emission and transition probabilities, and calculates posteriors.
 057:     Input: kxl matrices of emission, transition
 058:     and initialized fwd and bwd probabilities. Given in normal space
 059:     full: Boolean whether to return everything.
 060:     output: Whether to print output useful for monitoring"""
+061:     cdef int n_states = e_mat.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+062:     cdef int n_loci = e_mat.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
 063:     cdef Py_ssize_t i, j, k # The Array Indices
 064: 
 065:     # Initialize Posterior and Transition Probabilities
+066:     post = np.empty([n_states, n_loci], dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 66, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_post = __pyx_t_1;
  __pyx_t_1 = 0;
 067: 
+068:     trans_ll = np.empty(n_states, dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __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_1); __pyx_t_1 = 0;
  __pyx_v_trans_ll = __pyx_t_2;
  __pyx_t_2 = 0;
+069:     cdef double[:] trans_ll_view = trans_ll
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 69, __pyx_L1_error)
  __pyx_v_trans_ll_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 070: 
 071:     ### Transform to Log space
+072:     cdef double[:, :] t_mat0 = np.log(np.eye(n_states) + t_mat[:,:])  # Do log of (relevant) transition Matrix
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_eye); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_7 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) {
    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
    if (likely(__pyx_t_7)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_7);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_6, function);
    }
  }
  __pyx_t_1 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_7, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_4 = PyNumber_Add(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_6, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_t_mat0 = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
+073:     cdef double[:, :] e_mat0 = np.log(e_mat)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 73, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_e_mat0 = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
 074: 
 075: 
+076:     for i in range(1, n_loci):  # Do the forward recursion
  __pyx_t_9 = __pyx_v_n_loci;
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_i = __pyx_t_11;
+077:         for j in range(n_states):
    __pyx_t_12 = __pyx_v_n_states;
    __pyx_t_13 = __pyx_t_12;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) {
      __pyx_v_j = __pyx_t_14;
+078:           for k in range(n_states):
      __pyx_t_15 = __pyx_v_n_states;
      __pyx_t_16 = __pyx_t_15;
      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) {
        __pyx_v_k = __pyx_t_17;
+079:             trans_ll_view[k] = fwd[k, i - 1] + t_mat0[k, j]
        __pyx_t_18 = __pyx_v_k;
        __pyx_t_19 = (__pyx_v_i - 1);
        __pyx_t_20 = -1;
        if (__pyx_t_18 < 0) {
          __pyx_t_20 = 0;
        } else if (unlikely(__pyx_t_18 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
        if (__pyx_t_19 < 0) {
          __pyx_t_20 = 1;
        } else if (unlikely(__pyx_t_19 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
        if (unlikely(__pyx_t_20 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_20);
          __PYX_ERR(0, 79, __pyx_L1_error)
        }
        __pyx_t_21 = __pyx_v_k;
        __pyx_t_22 = __pyx_v_j;
        __pyx_t_20 = -1;
        if (__pyx_t_21 < 0) {
          __pyx_t_20 = 0;
        } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[0])) __pyx_t_20 = 0;
        if (__pyx_t_22 < 0) {
          __pyx_t_20 = 1;
        } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[1])) __pyx_t_20 = 1;
        if (unlikely(__pyx_t_20 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_20);
          __PYX_ERR(0, 79, __pyx_L1_error)
        }
        __pyx_t_23 = __pyx_v_k;
        __pyx_t_20 = -1;
        if (__pyx_t_23 < 0) {
          __pyx_t_20 = 0;
        } else if (unlikely(__pyx_t_23 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0;
        if (unlikely(__pyx_t_20 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_20);
          __PYX_ERR(0, 79, __pyx_L1_error)
        }
        *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_23 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_18 * __pyx_v_fwd.strides[0]) ) + __pyx_t_19 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_21 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_22 * __pyx_v_t_mat0.strides[1]) ))));
      }
 080: 
+081:           fwd[j, i] = e_mat0[j, i] + logsumexp(trans_ll_view)
      __pyx_t_22 = __pyx_v_j;
      __pyx_t_21 = __pyx_v_i;
      __pyx_t_15 = -1;
      if (__pyx_t_22 < 0) {
        __pyx_t_15 = 0;
      } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat0.shape[0])) __pyx_t_15 = 0;
      if (__pyx_t_21 < 0) {
        __pyx_t_15 = 1;
      } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat0.shape[1])) __pyx_t_15 = 1;
      if (unlikely(__pyx_t_15 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_15);
        __PYX_ERR(0, 81, __pyx_L1_error)
      }
      __pyx_t_19 = __pyx_v_j;
      __pyx_t_18 = __pyx_v_i;
      __pyx_t_15 = -1;
      if (__pyx_t_19 < 0) {
        __pyx_t_15 = 0;
      } else if (unlikely(__pyx_t_19 >= __pyx_v_fwd.shape[0])) __pyx_t_15 = 0;
      if (__pyx_t_18 < 0) {
        __pyx_t_15 = 1;
      } else if (unlikely(__pyx_t_18 >= __pyx_v_fwd.shape[1])) __pyx_t_15 = 1;
      if (unlikely(__pyx_t_15 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_15);
        __PYX_ERR(0, 81, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_19 * __pyx_v_fwd.strides[0]) ) + __pyx_t_18 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_22 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view));
    }
  }
 082: 
+083:     for i in range(n_loci-1, 0, -1):  # Do the backward recursion
  for (__pyx_t_11 = (__pyx_v_n_loci - 1); __pyx_t_11 > 0; __pyx_t_11-=1) {
    __pyx_v_i = __pyx_t_11;
+084:       for j in range(n_states):
    __pyx_t_9 = __pyx_v_n_states;
    __pyx_t_10 = __pyx_t_9;
    for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_10; __pyx_t_14+=1) {
      __pyx_v_j = __pyx_t_14;
+085:         for k in range(n_states):
      __pyx_t_12 = __pyx_v_n_states;
      __pyx_t_13 = __pyx_t_12;
      for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_13; __pyx_t_17+=1) {
        __pyx_v_k = __pyx_t_17;
+086:           trans_ll_view[k] = t_mat0[j, k] + e_mat0[k, i] + bwd[k, i]
        __pyx_t_21 = __pyx_v_j;
        __pyx_t_22 = __pyx_v_k;
        __pyx_t_15 = -1;
        if (__pyx_t_21 < 0) {
          __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_22 < 0) {
          __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_15);
          __PYX_ERR(0, 86, __pyx_L1_error)
        }
        __pyx_t_18 = __pyx_v_k;
        __pyx_t_19 = __pyx_v_i;
        __pyx_t_15 = -1;
        if (__pyx_t_18 < 0) {
          __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_18 >= __pyx_v_e_mat0.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_19 < 0) {
          __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_19 >= __pyx_v_e_mat0.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_15);
          __PYX_ERR(0, 86, __pyx_L1_error)
        }
        __pyx_t_23 = __pyx_v_k;
        __pyx_t_24 = __pyx_v_i;
        __pyx_t_15 = -1;
        if (__pyx_t_23 < 0) {
          __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_23 >= __pyx_v_bwd.shape[0])) __pyx_t_15 = 0;
        if (__pyx_t_24 < 0) {
          __pyx_t_15 = 1;
        } else if (unlikely(__pyx_t_24 >= __pyx_v_bwd.shape[1])) __pyx_t_15 = 1;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_15);
          __PYX_ERR(0, 86, __pyx_L1_error)
        }
        __pyx_t_25 = __pyx_v_k;
        __pyx_t_15 = -1;
        if (__pyx_t_25 < 0) {
          __pyx_t_15 = 0;
        } else if (unlikely(__pyx_t_25 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_15 = 0;
        if (unlikely(__pyx_t_15 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_15);
          __PYX_ERR(0, 86, __pyx_L1_error)
        }
        *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_25 * __pyx_v_trans_ll_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_21 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_22 * __pyx_v_t_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_18 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_19 * __pyx_v_e_mat0.strides[1]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_23 * __pyx_v_bwd.strides[0]) ) + __pyx_t_24 * __pyx_v_bwd.strides[1]) ))));
      }
+087:         bwd[j, i - 1] = logsumexp(trans_ll_view)
      __pyx_t_24 = __pyx_v_j;
      __pyx_t_23 = (__pyx_v_i - 1);
      __pyx_t_12 = -1;
      if (__pyx_t_24 < 0) {
        __pyx_t_12 = 0;
      } else if (unlikely(__pyx_t_24 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0;
      if (__pyx_t_23 < 0) {
        __pyx_t_12 = 1;
      } else if (unlikely(__pyx_t_23 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1;
      if (unlikely(__pyx_t_12 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_12);
        __PYX_ERR(0, 87, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_24 * __pyx_v_bwd.strides[0]) ) + __pyx_t_23 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
    }
  }
 088: 
 089:     # Get total log likelihood
+090:     for k in range(n_states):  # Simply sum the two 1D arrays
  __pyx_t_9 = __pyx_v_n_states;
  __pyx_t_10 = __pyx_t_9;
  for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) {
    __pyx_v_k = __pyx_t_11;
+091:       trans_ll_view[k] = fwd[k, n_loci-1] + bwd[k, n_loci-1]
    __pyx_t_23 = __pyx_v_k;
    __pyx_t_24 = (__pyx_v_n_loci - 1);
    __pyx_t_12 = -1;
    if (__pyx_t_23 < 0) {
      __pyx_t_12 = 0;
    } else if (unlikely(__pyx_t_23 >= __pyx_v_fwd.shape[0])) __pyx_t_12 = 0;
    if (__pyx_t_24 < 0) {
      __pyx_t_12 = 1;
    } else if (unlikely(__pyx_t_24 >= __pyx_v_fwd.shape[1])) __pyx_t_12 = 1;
    if (unlikely(__pyx_t_12 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_12);
      __PYX_ERR(0, 91, __pyx_L1_error)
    }
    __pyx_t_19 = __pyx_v_k;
    __pyx_t_18 = (__pyx_v_n_loci - 1);
    __pyx_t_12 = -1;
    if (__pyx_t_19 < 0) {
      __pyx_t_12 = 0;
    } else if (unlikely(__pyx_t_19 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0;
    if (__pyx_t_18 < 0) {
      __pyx_t_12 = 1;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1;
    if (unlikely(__pyx_t_12 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_12);
      __PYX_ERR(0, 91, __pyx_L1_error)
    }
    __pyx_t_22 = __pyx_v_k;
    __pyx_t_12 = -1;
    if (__pyx_t_22 < 0) {
      __pyx_t_12 = 0;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_12 = 0;
    if (unlikely(__pyx_t_12 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_12);
      __PYX_ERR(0, 91, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_22 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_23 * __pyx_v_fwd.strides[0]) ) + __pyx_t_24 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_19 * __pyx_v_bwd.strides[0]) ) + __pyx_t_18 * __pyx_v_bwd.strides[1]) ))));
  }
+092:     tot_ll = logsumexp(trans_ll_view)
  __pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
+093:     if output:
  __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 93, __pyx_L1_error)
  if (__pyx_t_26) {
/* … */
  }
+094:         print(f"Total Log likelihood: {tot_ll: .3f}")
    __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 94, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 94, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
 095: 
 096:     # Combine the forward and backward calculations
+097:     fwd1 = np.asarray(fwd)  # Transform
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_fwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_6, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_fwd1 = __pyx_t_4;
  __pyx_t_4 = 0;
+098:     bwd1 = np.asarray(bwd)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_bwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_6 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_bwd1 = __pyx_t_4;
  __pyx_t_4 = 0;
+099:     post = fwd1 + bwd1 - tot_ll
  __pyx_t_4 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 99, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 99, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_3);
  __pyx_t_3 = 0;
+100:     post = np.exp(post) ## Transform from log to normal space
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 100, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_exp); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 100, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_post);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 100, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_3);
  __pyx_t_3 = 0;
 101: 
+102:     if full==False:
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 102, __pyx_L1_error)
  __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 102, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_26) {
/* … */
  }
+103:       return post
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_post);
    __pyx_r = __pyx_v_post;
    goto __pyx_L0;
 104: 
+105:     elif full==True:   # Return everything
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error)
  __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 105, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_26) {
/* … */
  }
+106:       return post, fwd1, bwd1, tot_ll
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 106, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_v_post);
    __Pyx_GIVEREF(__pyx_v_post);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_post);
    __Pyx_INCREF(__pyx_v_fwd1);
    __Pyx_GIVEREF(__pyx_v_fwd1);
    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_fwd1);
    __Pyx_INCREF(__pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_v_bwd1);
    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
 107: 
 108: 
+109: def fwd_bkwd_fast(double[:, :] e_mat, double[:, :, :] t_mat, double in_val = 1e-4,
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_4fwd_bkwd_fast[] = "Takes emission and transition probabilities, and calculates posteriors.\n    Uses speed-up specific for Genotype data (pooling same transition rates)\n    Input:\n    e_mat: Emission probabilities [k x l] (normal space)\n    t_mat: Transition Matrix: [l x 3 x 3]  (normal space)\n    in_val: Intitial probability of single symmetric state (normal space)\n    full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n    output: Whether to print output useful for monitoring\n    Otherwise only posterior mat [kxl] of post is returned\n    ";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_5fwd_bkwd_fast = {"fwd_bkwd_fast", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_4fwd_bkwd_fast};
static PyObject *__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_in_val;
  PyObject *__pyx_v_full = 0;
  PyObject *__pyx_v_output = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_fast (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0};
    PyObject* values[5] = {0,0,0,0,0};
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6ancIBD_5cfunc_4fwd_bkwd_fast(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_j;
  Py_ssize_t __pyx_v_k;
  double __pyx_v_stay;
  PyObject *__pyx_v_post = NULL;
  PyObject *__pyx_v_trans_ll = NULL;
  __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_trans_ll1 = NULL;
  __Pyx_memviewslice __pyx_v_trans_ll_view1 = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_three_v = NULL;
  __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_two_v = NULL;
  __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_fwd0 = NULL;
  __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_bwd0 = NULL;
  __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_f_l;
  double __pyx_v_tot_ll;
  PyObject *__pyx_v_fwd1 = NULL;
  PyObject *__pyx_v_bwd1 = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_fast", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_post);
  __Pyx_XDECREF(__pyx_v_trans_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1);
  __Pyx_XDECREF(__pyx_v_trans_ll1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view1, 1);
  __Pyx_XDECREF(__pyx_v_three_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1);
  __Pyx_XDECREF(__pyx_v_two_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1);
  __Pyx_XDECREF(__pyx_v_fwd0);
  __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1);
  __Pyx_XDECREF(__pyx_v_bwd0);
  __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1);
  __Pyx_XDECREF(__pyx_v_fwd1);
  __Pyx_XDECREF(__pyx_v_bwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__33 = PyTuple_Pack(30, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_post, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_trans_ll1, __pyx_n_s_trans_ll_view1, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_t0, __pyx_n_s_e_mat0, __pyx_n_s_fwd0, __pyx_n_s_fwd, __pyx_n_s_bwd0, __pyx_n_s_bwd, __pyx_n_s_f_l, __pyx_n_s_tot_ll, __pyx_n_s_fwd1, __pyx_n_s_bwd1); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 109, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_5fwd_bkwd_fast, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_fast, __pyx_t_2) < 0) __PYX_ERR(0, 109, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(5, 0, 30, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_fast, 109, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 109, __pyx_L1_error)
+110:                   full=False, output=True):
    values[3] = ((PyObject *)Py_False);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 2, 5, 1); __PYX_ERR(0, 109, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_fast") < 0)) __PYX_ERR(0, 109, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 109, __pyx_L3_error)
    __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 109, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L3_error)
    } else {
      __pyx_v_in_val = ((double)1e-4);
    }
    __pyx_v_full = values[3];
    __pyx_v_output = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 109, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_4fwd_bkwd_fast(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
 111:     """Takes emission and transition probabilities, and calculates posteriors.
 112:     Uses speed-up specific for Genotype data (pooling same transition rates)
 113:     Input:
 114:     e_mat: Emission probabilities [k x l] (normal space)
 115:     t_mat: Transition Matrix: [l x 3 x 3]  (normal space)
 116:     in_val: Intitial probability of single symmetric state (normal space)
 117:     full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
 118:     output: Whether to print output useful for monitoring
 119:     Otherwise only posterior mat [kxl] of post is returned
 120:     """
+121:     cdef int n_states = e_mat.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+122:     cdef int n_loci = e_mat.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
 123:     cdef Py_ssize_t i, j, k    # The Array Indices
 124:     cdef double stay           # The Probablility of Staying
 125: 
 126:     # Initialize Posterior and Transition Probabilities
+127:     post = np.empty([n_states, n_loci], dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 127, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_post = __pyx_t_1;
  __pyx_t_1 = 0;
 128: 
+129:     trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __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_1); __pyx_t_1 = 0;
  __pyx_v_trans_ll = __pyx_t_2;
  __pyx_t_2 = 0;
+130:     cdef double[:] trans_ll_view = trans_ll
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 130, __pyx_L1_error)
  __pyx_v_trans_ll_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 131: 
+132:     trans_ll1 = np.empty(n_states, dtype=DTYPE) # Array for calculations
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 132, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_trans_ll1 = __pyx_t_4;
  __pyx_t_4 = 0;
+133:     cdef double[:] trans_ll_view1 = trans_ll1
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 133, __pyx_L1_error)
  __pyx_v_trans_ll_view1 = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 134: 
+135:     three_v = np.empty(3, dtype=DTYPE)     # Array of size three
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_three_v = __pyx_t_3;
  __pyx_t_3 = 0;
/* … */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_int_3); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 135, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
+136:     cdef double[:] three_v_view = three_v
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 136, __pyx_L1_error)
  __pyx_v_three_v_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 137: 
+138:     two_v = np.empty(2, dtype=DTYPE)       # Array of size two
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__2, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __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_v_two_v = __pyx_t_2;
  __pyx_t_2 = 0;
/* … */
  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_2); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 138, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);
+139:     cdef double[:] two_v_view = two_v
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 139, __pyx_L1_error)
  __pyx_v_two_v_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 140: 
 141:     # Do transform to Log Space:
+142:     cdef double[:,:,:] t0 = np.log(t_mat)         # Do log of recombination Map
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 142, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 142, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 142, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_t0 = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+143:     cdef double[:, :] e_mat0 = np.log(e_mat)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_e_mat0 = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 144: 
 145:     ### Initialize FWD BWD matrices
+146:     fwd0 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4);
  __pyx_t_2 = 0;
  __pyx_t_4 = 0;
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 146, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_fwd0 = __pyx_t_2;
  __pyx_t_2 = 0;
+147:     fwd0[:, 0] = np.log(in_val)  # Initial Probabilities
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_slice__3 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__3)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_slice__3);
  __Pyx_GIVEREF(__pyx_slice__3);
  if (unlikely(PyObject_SetItem(__pyx_v_fwd0, __pyx_tuple__4, __pyx_t_2) < 0)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_tuple__4 = PyTuple_Pack(2, __pyx_slice__3, __pyx_int_0); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__4);
  __Pyx_GIVEREF(__pyx_tuple__4);
+148:     fwd0[0, 0] = np.log(1 - (n_states - 1) * in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(PyObject_SetItem(__pyx_v_fwd0, __pyx_tuple__5, __pyx_t_2) < 0)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_tuple__5 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_0); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 148, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);
+149:     cdef double[:,:] fwd = fwd0
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 149, __pyx_L1_error)
  __pyx_v_fwd = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 150: 
+151:     bwd0 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
  __pyx_t_2 = 0;
  __pyx_t_4 = 0;
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 151, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_bwd0 = __pyx_t_2;
  __pyx_t_2 = 0;
+152:     bwd0[:, -1] = np.log(in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(PyObject_SetItem(__pyx_v_bwd0, __pyx_tuple__6, __pyx_t_2) < 0)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_tuple__6 = PyTuple_Pack(2, __pyx_slice__3, __pyx_int_neg_1); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 152, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__6);
  __Pyx_GIVEREF(__pyx_tuple__6);
+153:     bwd0[0, -1] = np.log(1 - (n_states - 1) * in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(PyObject_SetItem(__pyx_v_bwd0, __pyx_tuple__7, __pyx_t_2) < 0)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
/* … */
  __pyx_tuple__7 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_neg_1); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
+154:     cdef double[:,:] bwd = bwd0
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 154, __pyx_L1_error)
  __pyx_v_bwd = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 155: 
 156:     #############################
 157:     ### Do the Forward Algorithm
+158:     for i in range(1, n_loci):  # Run forward recursion
  __pyx_t_8 = __pyx_v_n_loci;
  __pyx_t_9 = __pyx_t_8;
  for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;
+159:         stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])  # Do the log of the Stay term
    __pyx_t_11 = __pyx_v_i;
    __pyx_t_12 = 1;
    __pyx_t_13 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 159, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_17 = 2;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 159, __pyx_L1_error)
    }
    __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_11 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) )))));
 160: 
+161:         for k in range(1, n_states): # Calculate logsum of ROH states:
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_14;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_k = __pyx_t_19;
+162:             trans_ll_view[k-1] = fwd[k, i - 1]
      __pyx_t_17 = __pyx_v_k;
      __pyx_t_16 = (__pyx_v_i - 1);
      __pyx_t_20 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 162, __pyx_L1_error)
      }
      __pyx_t_15 = (__pyx_v_k - 1);
      __pyx_t_20 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 162, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_15 * __pyx_v_trans_ll_view.strides[0]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) )));
    }
+163:         f_l = logsumexp(trans_ll_view) # Logsum of ROH States
    __pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
 164: 
 165:         # Do the 0 State:
+166:         two_v_view[0] = fwd[0, i - 1] + t0[i, 0, 0]   # Staying in 0 State
    __pyx_t_16 = 0;
    __pyx_t_17 = (__pyx_v_i - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 166, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_13 = 0;
    __pyx_t_12 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 166, __pyx_L1_error)
    }
    __pyx_t_11 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 166, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_11 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) ))));
+167:         two_v_view[1] = f_l + t0[i, 1, 0]             # Going into 0 State
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_13 = 1;
    __pyx_t_15 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 167, __pyx_L1_error)
    }
    __pyx_t_17 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 167, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_12 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+168:         fwd[0, i] = e_mat0[0, i] + logsumexp(two_v_view)
    __pyx_t_15 = 0;
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 168, __pyx_L1_error)
    }
    __pyx_t_12 = 0;
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 168, __pyx_L1_error)
    }
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_15 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view));
 169: 
 170:         ### Do the other states
 171:         # Preprocessing:
+172:         three_v_view[0] = fwd[0, i - 1] + t0[i, 0, 1]   # Coming from 0 State
    __pyx_t_13 = 0;
    __pyx_t_15 = (__pyx_v_i - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 172, __pyx_L1_error)
    }
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_12 = 0;
    __pyx_t_16 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 172, __pyx_L1_error)
    }
    __pyx_t_11 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 172, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_11 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_17 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
+173:         three_v_view[1] = f_l + t0[i, 1, 2]             # Coming from other ROH State
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_12 = 1;
    __pyx_t_17 = 2;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 173, __pyx_L1_error)
    }
    __pyx_t_15 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 173, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_15 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
 174: 
+175:         for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_14;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+176:           three_v_view[2] = fwd[j, i-1] +  stay
      __pyx_t_17 = __pyx_v_j;
      __pyx_t_12 = (__pyx_v_i - 1);
      __pyx_t_20 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_12 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 176, __pyx_L1_error)
      }
      __pyx_t_16 = 2;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_three_v_view.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 176, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_16 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ) + __pyx_t_12 * __pyx_v_fwd.strides[1]) ))) + __pyx_v_stay);
+177:           fwd[j, i] = e_mat0[j, i] + logsumexp(three_v_view)
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_17 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_12 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat0.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_17 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 177, __pyx_L1_error)
      }
      __pyx_t_16 = __pyx_v_j;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 177, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_12 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view));
    }
  }
 178: 
 179:     #############################
 180:     ### Do the Backward Algorithm
+181:     for i in range(n_loci-1, 0, -1):  # Run backward recursion
  for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) {
    __pyx_v_i = __pyx_t_10;
+182:       stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_12 = 1;
    __pyx_t_15 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t_mat.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 182, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_13 = 1;
    __pyx_t_11 = 2;
    __pyx_t_8 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t_mat.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 182, __pyx_L1_error)
    }
    __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_17 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_15 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_16 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_11 * __pyx_v_t_mat.strides[2]) )))));
 183: 
+184:       for k in range(1, n_states): # Calculate logsum of ROH states:
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) {
      __pyx_v_k = __pyx_t_19;
+185:           trans_ll_view[k-1] = bwd[k, i] + e_mat0[k, i]
      __pyx_t_11 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_13 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 185, __pyx_L1_error)
      }
      __pyx_t_16 = __pyx_v_k;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 185, __pyx_L1_error)
      }
      __pyx_t_12 = (__pyx_v_k - 1);
      __pyx_t_14 = -1;
      if (__pyx_t_12 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 185, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_12 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_11 * __pyx_v_bwd.strides[0]) ) + __pyx_t_13 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) ))));
    }
+186:       f_l = logsumexp(trans_ll_view) # Logsum of ROH States
    __pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
 187: 
 188:       # Do the 0 State:
+189:       two_v_view[0] = bwd[0, i] + t0[i, 0, 0] + e_mat0[0, i]   # Staying in 0 State
    __pyx_t_15 = 0;
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 189, __pyx_L1_error)
    }
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_11 = 0;
    __pyx_t_12 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 189, __pyx_L1_error)
    }
    __pyx_t_17 = 0;
    __pyx_t_21 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_21 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat0.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 189, __pyx_L1_error)
    }
    __pyx_t_22 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_22 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_two_v_view.shape[0])) __pyx_t_8 = 0;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 189, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_22 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_16 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_11 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_e_mat0.strides[1]) ))));
+190:       two_v_view[1] = f_l + t0[i, 0, 1]                         # Going into 0 State
    __pyx_t_21 = __pyx_v_i;
    __pyx_t_17 = 0;
    __pyx_t_12 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_21 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 190, __pyx_L1_error)
    }
    __pyx_t_11 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_two_v_view.shape[0])) __pyx_t_8 = 0;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 190, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_11 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_21 * __pyx_v_t0.strides[0]) ) + __pyx_t_17 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) ))));
+191:       bwd[0, i - 1] = logsumexp(two_v_view)
    __pyx_t_12 = 0;
    __pyx_t_17 = (__pyx_v_i - 1);
    __pyx_t_8 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 191, __pyx_L1_error)
    }
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_12 * __pyx_v_bwd.strides[0]) ) + __pyx_t_17 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view);
 192: 
 193:       ### Do the other states
 194:       # Preprocessing:
+195:       three_v_view[0] = e_mat0[0, i] + bwd[0, i] + t0[i, 1, 0]
    __pyx_t_17 = 0;
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat0.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 195, __pyx_L1_error)
    }
    __pyx_t_21 = 0;
    __pyx_t_11 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_21 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 195, __pyx_L1_error)
    }
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_15 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 195, __pyx_L1_error)
    }
    __pyx_t_22 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_22 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_three_v_view.shape[0])) __pyx_t_8 = 0;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 195, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_22 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_12 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_21 * __pyx_v_bwd.strides[0]) ) + __pyx_t_11 * __pyx_v_bwd.strides[1]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+196:       three_v_view[1] = f_l + t0[i, 1, 2]    # Coming from other ROH State
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_13 = 2;
    __pyx_t_8 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_13 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 196, __pyx_L1_error)
    }
    __pyx_t_11 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_three_v_view.shape[0])) __pyx_t_8 = 0;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 196, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_11 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_13 * __pyx_v_t0.strides[2]) ))));
 197: 
+198:       for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+199:         three_v_view[2] = e_mat0[j, i] + bwd[j, i] +  stay
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_16 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_16 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 199, __pyx_L1_error)
      }
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_11 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 199, __pyx_L1_error)
      }
      __pyx_t_21 = 2;
      __pyx_t_14 = -1;
      if (__pyx_t_21 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_21 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 199, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_21 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_13 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_11 * __pyx_v_bwd.strides[1]) )))) + __pyx_v_stay);
+200:         bwd[j, i - 1] = logsumexp(three_v_view)  # Fill in the backward Probability
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i - 1);
      __pyx_t_14 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 200, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_11 * __pyx_v_bwd.strides[0]) ) + __pyx_t_15 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view);
    }
  }
 201: 
 202:     # Get total log likelihood
+203:     for k in range(n_states):  # Simply sum the two 1D arrays
  __pyx_t_8 = __pyx_v_n_states;
  __pyx_t_9 = __pyx_t_8;
  for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_k = __pyx_t_10;
+204:       trans_ll_view1[k] = fwd[k, n_loci - 1] + bwd[k, n_loci - 1]
    __pyx_t_15 = __pyx_v_k;
    __pyx_t_11 = (__pyx_v_n_loci - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_11 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 204, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_k;
    __pyx_t_13 = (__pyx_v_n_loci - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 204, __pyx_L1_error)
    }
    __pyx_t_21 = __pyx_v_k;
    __pyx_t_14 = -1;
    if (__pyx_t_21 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_trans_ll_view1.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 204, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_21 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ) + __pyx_t_11 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_16 * __pyx_v_bwd.strides[0]) ) + __pyx_t_13 * __pyx_v_bwd.strides[1]) ))));
  }
+205:     tot_ll = logsumexp(trans_ll_view1)
  __pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
 206: 
 207:     # Combine the forward and backward calculations
+208:     fwd1 = np.asarray(fwd, dtype=DTYPE)  ## Transform
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_fwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_fwd1 = __pyx_t_1;
  __pyx_t_1 = 0;
+209:     bwd1 = np.asarray(bwd, dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_bwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 209, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_1); 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;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_bwd1 = __pyx_t_3;
  __pyx_t_3 = 0;
+210:     post = fwd1 + bwd1 - float(tot_ll) ## Posterior in log space
  __pyx_t_3 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_4);
  __pyx_t_4 = 0;
+211:     post = np.exp(post)        ## To have posterior in normal space
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_exp); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_4 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_post);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_4);
  __pyx_t_4 = 0;
+212:     if output:
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 212, __pyx_L1_error)
  if (__pyx_t_23) {
/* … */
  }
+213:         print("Memory Usage Full:")
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 213, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
/* … */
  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Memory_Usage_Full); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 213, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__8);
  __Pyx_GIVEREF(__pyx_tuple__8);
+214:         print_memory_usage()   ## For MEMORY_BENCH
    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 214, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    __pyx_t_4 = (__pyx_t_1) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallNoArg(__pyx_t_3);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 214, __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;
+215:         print(f"Total Log likelihood: {tot_ll: .3f}")
    __pyx_t_4 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyObject_Format(__pyx_t_4, __pyx_kp_u_3f); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
 216: 
+217:     if full==False:
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 217, __pyx_L1_error)
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 217, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_23) {
/* … */
  }
+218:       return post
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_post);
    __pyx_r = __pyx_v_post;
    goto __pyx_L0;
 219: 
+220:     elif full==True:   # Return everything
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 220, __pyx_L1_error)
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 220, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_23) {
/* … */
  }
+221:       return post, fwd1, bwd1, tot_ll
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 221, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 221, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_v_post);
    __Pyx_GIVEREF(__pyx_v_post);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_post);
    __Pyx_INCREF(__pyx_v_fwd1);
    __Pyx_GIVEREF(__pyx_v_fwd1);
    PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_fwd1);
    __Pyx_INCREF(__pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_v_bwd1);
    PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_t_3);
    PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3);
    __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
 222: 
 223: 
+224: def fwd_bkwd_lowmem(double[:, :] e_mat, double[:, :, :] t_mat, double in_val = 1e-4,
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_6fwd_bkwd_lowmem[] = "Takes emission and transition probabilities, and calculates posteriors.\n    Uses speed-up specific for Genotype data (pooling same transition rates)\n    Low-Mem: Do no save the full FWD BWD and Posterior. Use temporary\n    Arrays for saving. Only return 0-posterior. useful for large symmetric state arrays.\n    Input:\n    e_mat0: Emission probabilities [k x l] (normal space)\n    t_mat: Transition Matrix: [l x 3 x 3]  (normal space)\n    in_val: Intitial probability of single symmetric state (normal space)\n    full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n    Otherwise only posterior mat [kxl] of post is returned";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_7fwd_bkwd_lowmem = {"fwd_bkwd_lowmem", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_6fwd_bkwd_lowmem};
static PyObject *__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_in_val;
  PyObject *__pyx_v_full = 0;
  PyObject *__pyx_v_output = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_lowmem (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0};
    PyObject* values[5] = {0,0,0,0,0};
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6ancIBD_5cfunc_6fwd_bkwd_lowmem(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_j;
  Py_ssize_t __pyx_v_k;
  double __pyx_v_stay;
  double __pyx_v_tot_ll;
  PyObject *__pyx_v_post = NULL;
  __Pyx_memviewslice __pyx_v_post_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_trans_ll = NULL;
  __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_trans_ll1 = NULL;
  __Pyx_memviewslice __pyx_v_trans_ll_view1 = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_three_v = NULL;
  __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_two_v = NULL;
  __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_fwd0 = NULL;
  __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_bwd0 = NULL;
  __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_tmp0 = NULL;
  __Pyx_memviewslice __pyx_v_tmp = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_f_l;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_lowmem", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1);
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_lowmem", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_post);
  __PYX_XDEC_MEMVIEW(&__pyx_v_post_view, 1);
  __Pyx_XDECREF(__pyx_v_trans_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1);
  __Pyx_XDECREF(__pyx_v_trans_ll1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view1, 1);
  __Pyx_XDECREF(__pyx_v_three_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1);
  __Pyx_XDECREF(__pyx_v_two_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1);
  __Pyx_XDECREF(__pyx_v_fwd0);
  __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1);
  __Pyx_XDECREF(__pyx_v_bwd0);
  __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1);
  __Pyx_XDECREF(__pyx_v_tmp0);
  __PYX_XDEC_MEMVIEW(&__pyx_v_tmp, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__35 = PyTuple_Pack(31, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_tot_ll, __pyx_n_s_post, __pyx_n_s_post_view, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_trans_ll1, __pyx_n_s_trans_ll_view1, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_t0, __pyx_n_s_e_mat0, __pyx_n_s_fwd0, __pyx_n_s_fwd, __pyx_n_s_bwd0, __pyx_n_s_bwd, __pyx_n_s_tmp0, __pyx_n_s_tmp, __pyx_n_s_f_l); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 224, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_7fwd_bkwd_lowmem, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 224, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_lowmem, __pyx_t_2) < 0) __PYX_ERR(0, 224, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(5, 0, 31, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_lowmem, 224, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 224, __pyx_L1_error)
+225:                     full=False, output=True):
    values[3] = ((PyObject *)Py_False);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 2, 5, 1); __PYX_ERR(0, 224, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_lowmem") < 0)) __PYX_ERR(0, 224, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 224, __pyx_L3_error)
    __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 224, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L3_error)
    } else {
      __pyx_v_in_val = ((double)1e-4);
    }
    __pyx_v_full = values[3];
    __pyx_v_output = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 224, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_lowmem", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_6fwd_bkwd_lowmem(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
 226:     """Takes emission and transition probabilities, and calculates posteriors.
 227:     Uses speed-up specific for Genotype data (pooling same transition rates)
 228:     Low-Mem: Do no save the full FWD BWD and Posterior. Use temporary
 229:     Arrays for saving. Only return 0-posterior. useful for large symmetric state arrays.
 230:     Input:
 231:     e_mat0: Emission probabilities [k x l] (normal space)
 232:     t_mat: Transition Matrix: [l x 3 x 3]  (normal space)
 233:     in_val: Intitial probability of single symmetric state (normal space)
 234:     full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
 235:     Otherwise only posterior mat [kxl] of post is returned"""
+236:     cdef int n_states = e_mat.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+237:     cdef int n_loci = e_mat.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
 238:     cdef Py_ssize_t i, j, k    # The Array Indices
 239:     cdef double stay           # The Probablility of Staying
 240:     cdef double tot_ll  # The total Likelihood (need for Posterior)
 241: 
 242:     # Initialize Posterior and Transition Probabilities
+243:     post = np.empty(n_loci, dtype=DTYPE) # Array of 0 State Posterior
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 243, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 243, __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_1); __pyx_t_1 = 0;
  __pyx_v_post = __pyx_t_4;
  __pyx_t_4 = 0;
+244:     cdef double[:] post_view = post
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_post, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 244, __pyx_L1_error)
  __pyx_v_post_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 245: 
+246:     trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 246, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_trans_ll = __pyx_t_2;
  __pyx_t_2 = 0;
+247:     cdef double[:] trans_ll_view = trans_ll
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 247, __pyx_L1_error)
  __pyx_v_trans_ll_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 248: 
+249:     trans_ll1 = np.empty(n_states, dtype=DTYPE) # Array for calculations
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __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;
  __pyx_v_trans_ll1 = __pyx_t_1;
  __pyx_t_1 = 0;
+250:     cdef double[:] trans_ll_view1 = trans_ll1
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 250, __pyx_L1_error)
  __pyx_v_trans_ll_view1 = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 251: 
+252:     three_v = np.empty(3, dtype=DTYPE)     # Array of size three
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_three_v = __pyx_t_3;
  __pyx_t_3 = 0;
+253:     cdef double[:] three_v_view = three_v
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 253, __pyx_L1_error)
  __pyx_v_three_v_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 254: 
+255:     two_v = np.empty(2, dtype=DTYPE)       # Array of size two
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__2, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_two_v = __pyx_t_2;
  __pyx_t_2 = 0;
+256:     cdef double[:] two_v_view = two_v
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 256, __pyx_L1_error)
  __pyx_v_two_v_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 257: 
 258:     # Do transform to Log Space:
+259:     cdef double[:,:,:] t0 = np.log(t_mat)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 259, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 259, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 259, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 259, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 259, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_t0 = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+260:     cdef double[:, :] e_mat0 = np.log(e_mat)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_e_mat0 = __pyx_t_7;
  __pyx_t_7.memview = NULL;
  __pyx_t_7.data = NULL;
 261: 
 262:     ### Initialize FWD BWD Arrays
+263:     fwd0 = np.zeros(n_states, dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 263, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_fwd0 = __pyx_t_4;
  __pyx_t_4 = 0;
+264:     fwd0[:] = np.log(in_val)  # Initial Probabilities
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_4 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__Pyx_PyObject_SetSlice(__pyx_v_fwd0, __pyx_t_4, 0, 0, NULL, NULL, &__pyx_slice__3, 0, 0, 0) < 0) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+265:     fwd0[0] = np.log(1 - (n_states - 1) * in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  __pyx_t_4 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(__Pyx_SetItemInt(__pyx_v_fwd0, 0, __pyx_t_4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+266:     cdef double[:] fwd = fwd0
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_fwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 266, __pyx_L1_error)
  __pyx_v_fwd = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 267: 
+268:     bwd0 = np.zeros(n_states, dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 268, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bwd0 = __pyx_t_3;
  __pyx_t_3 = 0;
+269:     bwd0[:] = np.log(in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 269, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 269, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 269, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 269, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__Pyx_PyObject_SetSlice(__pyx_v_bwd0, __pyx_t_3, 0, 0, NULL, NULL, &__pyx_slice__3, 0, 0, 0) < 0) __PYX_ERR(0, 269, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+270:     bwd0[0] = np.log(1 - (n_states - 1) * in_val)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (unlikely(__Pyx_SetItemInt(__pyx_v_bwd0, 0, __pyx_t_3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+271:     cdef double[:] bwd = bwd0
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_bwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 271, __pyx_L1_error)
  __pyx_v_bwd = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 272: 
+273:     tmp0 = np.zeros(n_states, dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_tmp0 = __pyx_t_2;
  __pyx_t_2 = 0;
+274:     cdef double[:] tmp = tmp0
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_tmp0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 274, __pyx_L1_error)
  __pyx_v_tmp = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 275: 
 276:     #############################
 277:     ### Do the Forward Algorithm
 278: 
+279:     post_view[0] = fwd[0] # Add to first locus 0 Posterior
  __pyx_t_8 = 0;
  __pyx_t_9 = -1;
  if (__pyx_t_8 < 0) {
    __pyx_t_9 = 0;
  } else if (unlikely(__pyx_t_8 >= __pyx_v_fwd.shape[0])) __pyx_t_9 = 0;
  if (unlikely(__pyx_t_9 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_9);
    __PYX_ERR(0, 279, __pyx_L1_error)
  }
  __pyx_t_10 = 0;
  __pyx_t_9 = -1;
  if (__pyx_t_10 < 0) {
    __pyx_t_9 = 0;
  } else if (unlikely(__pyx_t_10 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0;
  if (unlikely(__pyx_t_9 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_9);
    __PYX_ERR(0, 279, __pyx_L1_error)
  }
  *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_10 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_8 * __pyx_v_fwd.strides[0]) )));
+280:     for i in range(1, n_loci):  # Run forward recursion
  __pyx_t_9 = __pyx_v_n_loci;
  __pyx_t_11 = __pyx_t_9;
  for (__pyx_t_12 = 1; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
    __pyx_v_i = __pyx_t_12;
+281:         stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])  # Do the log of the Stay term
    __pyx_t_8 = __pyx_v_i;
    __pyx_t_10 = 1;
    __pyx_t_13 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_10 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 281, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_17 = 2;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 281, __pyx_L1_error)
    }
    __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_8 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_10 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) )))));
 282: 
+283:         for k in range(1, n_states): # Calculate logsum of ROH states:
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_14;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_k = __pyx_t_19;
+284:             trans_ll_view[k-1] = fwd[k]
      __pyx_t_17 = __pyx_v_k;
      __pyx_t_20 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 284, __pyx_L1_error)
      }
      __pyx_t_16 = (__pyx_v_k - 1);
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 284, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_16 * __pyx_v_trans_ll_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) )));
    }
+285:         f_l = logsumexp(trans_ll_view) # Logsum of ROH States
    __pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
 286: 
 287:         # Do the 0 State:
+288:         two_v_view[0] = fwd[0] + t0[i, 0, 0]   # Staying in 0 State
    __pyx_t_17 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 288, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_15 = 0;
    __pyx_t_13 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 288, __pyx_L1_error)
    }
    __pyx_t_10 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_10 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 288, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_10 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_15 * __pyx_v_t0.strides[1]) ) + __pyx_t_13 * __pyx_v_t0.strides[2]) ))));
+289:         two_v_view[1] = f_l + t0[i, 1, 0]             # Going into 0 State
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_15 = 1;
    __pyx_t_16 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 289, __pyx_L1_error)
    }
    __pyx_t_17 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 289, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_15 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
+290:         tmp[0] = e_mat0[0, i] + logsumexp(two_v_view)
    __pyx_t_16 = 0;
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 290, __pyx_L1_error)
    }
    __pyx_t_13 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 290, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_13 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view));
 291: 
 292:         ### Do the other states
 293:         # Preprocessing:
+294:         three_v_view[0] = fwd[0] + t0[i, 0, 1]   # Coming from 0 State
    __pyx_t_15 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 294, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_13 = 0;
    __pyx_t_17 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 294, __pyx_L1_error)
    }
    __pyx_t_10 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_10 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 294, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_10 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
+295:         three_v_view[1] = f_l + t0[i, 1, 2]             # Coming from other ROH State
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_13 = 1;
    __pyx_t_16 = 2;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 295, __pyx_L1_error)
    }
    __pyx_t_15 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 295, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_15 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_17 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
 296: 
+297:         for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_14;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+298:           three_v_view[2] = fwd[j] +  stay
      __pyx_t_16 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 298, __pyx_L1_error)
      }
      __pyx_t_13 = 2;
      __pyx_t_20 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 298, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ))) + __pyx_v_stay);
+299:           tmp[j] = e_mat0[j, i] + logsumexp(three_v_view)
      __pyx_t_16 = __pyx_v_j;
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_13 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 299, __pyx_L1_error)
      }
      __pyx_t_17 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_tmp.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 299, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_17 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view));
    }
 300: 
 301:         ### Make tmp new fwd vec:
+302:         for j in range(0, n_states):
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_14;
    for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+303:           fwd[j] = tmp[j]
      __pyx_t_13 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_tmp.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 303, __pyx_L1_error)
      }
      __pyx_t_16 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 303, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_13 * __pyx_v_tmp.strides[0]) )));
    }
+304:         post_view[i] = fwd[0]  # Add to 0-State Posterior
    __pyx_t_13 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 304, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_post_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 304, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_16 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) )));
  }
 305: 
 306:     ### Get total log likelihood
+307:     for k in range(n_states):  # Simply sum the two 1D arrays
  __pyx_t_9 = __pyx_v_n_states;
  __pyx_t_11 = __pyx_t_9;
  for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
    __pyx_v_k = __pyx_t_12;
+308:       trans_ll_view1[k] = fwd[k] + bwd[k]
    __pyx_t_13 = __pyx_v_k;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 308, __pyx_L1_error)
    }
    __pyx_t_16 = __pyx_v_k;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 308, __pyx_L1_error)
    }
    __pyx_t_17 = __pyx_v_k;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_trans_ll_view1.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 308, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_17 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_16 * __pyx_v_bwd.strides[0]) ))));
  }
+309:     tot_ll = logsumexp(trans_ll_view1)
  __pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
 310: 
 311:     #############################
 312:     ### Do the Backward Algorithm
 313:     ## last0-State Posterior
+314:     post_view[n_loci-1] = post_view[n_loci-1] + bwd[0] - tot_ll
  __pyx_t_16 = (__pyx_v_n_loci - 1);
  __pyx_t_9 = -1;
  if (__pyx_t_16 < 0) {
    __pyx_t_9 = 0;
  } else if (unlikely(__pyx_t_16 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0;
  if (unlikely(__pyx_t_9 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_9);
    __PYX_ERR(0, 314, __pyx_L1_error)
  }
  __pyx_t_13 = 0;
  __pyx_t_9 = -1;
  if (__pyx_t_13 < 0) {
    __pyx_t_9 = 0;
  } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0;
  if (unlikely(__pyx_t_9 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_9);
    __PYX_ERR(0, 314, __pyx_L1_error)
  }
  __pyx_t_17 = (__pyx_v_n_loci - 1);
  __pyx_t_9 = -1;
  if (__pyx_t_17 < 0) {
    __pyx_t_9 = 0;
  } else if (unlikely(__pyx_t_17 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0;
  if (unlikely(__pyx_t_9 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_9);
    __PYX_ERR(0, 314, __pyx_L1_error)
  }
  *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_17 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_16 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_13 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll);
 315: 
+316:     for i in range(n_loci-1, 0, -1):  # Run backward recursion
  for (__pyx_t_12 = (__pyx_v_n_loci - 1); __pyx_t_12 > 0; __pyx_t_12-=1) {
    __pyx_v_i = __pyx_t_12;
+317:       stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_17 = 1;
    __pyx_t_9 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 317, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_10 = 1;
    __pyx_t_8 = 2;
    __pyx_t_9 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_10 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_t_mat.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_t_mat.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 317, __pyx_L1_error)
    }
    __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_13 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_10 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_8 * __pyx_v_t_mat.strides[2]) )))));
 318: 
+319:       for k in range(1, n_states): # Calculate logsum of ROH states:
    __pyx_t_9 = __pyx_v_n_states;
    __pyx_t_11 = __pyx_t_9;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) {
      __pyx_v_k = __pyx_t_19;
+320:           trans_ll_view[k-1] = bwd[k] + e_mat0[k, i]
      __pyx_t_8 = __pyx_v_k;
      __pyx_t_14 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 320, __pyx_L1_error)
      }
      __pyx_t_10 = __pyx_v_k;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_10 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_10 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 320, __pyx_L1_error)
      }
      __pyx_t_17 = (__pyx_v_k - 1);
      __pyx_t_14 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 320, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_17 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_8 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_10 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) ))));
    }
+321:       f_l = logsumexp(trans_ll_view) # Logsum of ROH States
    __pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
 322: 
 323:       # Do the 0 State:
+324:       two_v_view[0] = bwd[0] + t0[i, 0, 0] + e_mat0[0, i]   # Staying in 0 State
    __pyx_t_15 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 324, __pyx_L1_error)
    }
    __pyx_t_10 = __pyx_v_i;
    __pyx_t_8 = 0;
    __pyx_t_17 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_10 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 324, __pyx_L1_error)
    }
    __pyx_t_16 = 0;
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_9 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_9 = 1;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 324, __pyx_L1_error)
    }
    __pyx_t_21 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_21 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_two_v_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 324, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_21 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_10 * __pyx_v_t0.strides[0]) ) + __pyx_t_8 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))));
+325:       two_v_view[1] = f_l + t0[i, 0, 1]                         # Going into 0 State
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_16 = 0;
    __pyx_t_17 = 1;
    __pyx_t_9 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_17 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 325, __pyx_L1_error)
    }
    __pyx_t_8 = 1;
    __pyx_t_9 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_two_v_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 325, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_8 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
+326:       tmp[0] = logsumexp(two_v_view)
    __pyx_t_17 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_tmp.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 326, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_17 * __pyx_v_tmp.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view);
 327: 
 328:       ### Do the other states
 329:       # Preprocessing:
+330:       three_v_view[0] = e_mat0[0, i] + bwd[0] + t0[i, 1, 0]
    __pyx_t_17 = 0;
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_9 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[1])) __pyx_t_9 = 1;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 330, __pyx_L1_error)
    }
    __pyx_t_13 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 330, __pyx_L1_error)
    }
    __pyx_t_8 = __pyx_v_i;
    __pyx_t_10 = 1;
    __pyx_t_15 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_10 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 330, __pyx_L1_error)
    }
    __pyx_t_21 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_21 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_21 >= __pyx_v_three_v_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 330, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_21 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_13 * __pyx_v_bwd.strides[0]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_8 * __pyx_v_t0.strides[0]) ) + __pyx_t_10 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+331:       three_v_view[1] = f_l + t0[i, 1, 2]    # Coming from other ROH State
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_10 = 1;
    __pyx_t_8 = 2;
    __pyx_t_9 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0;
    if (__pyx_t_10 < 0) {
      __pyx_t_9 = 1;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 2;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 331, __pyx_L1_error)
    }
    __pyx_t_13 = 1;
    __pyx_t_9 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 331, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_10 * __pyx_v_t0.strides[1]) ) + __pyx_t_8 * __pyx_v_t0.strides[2]) ))));
 332: 
+333:       for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_9 = __pyx_v_n_states;
    __pyx_t_11 = __pyx_t_9;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+334:         three_v_view[2] = e_mat0[j, i] + bwd[j] +  stay
      __pyx_t_8 = __pyx_v_j;
      __pyx_t_10 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_8 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_8 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_10 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_10 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 334, __pyx_L1_error)
      }
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 334, __pyx_L1_error)
      }
      __pyx_t_13 = 2;
      __pyx_t_14 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 334, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_8 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_10 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) )))) + __pyx_v_stay);
+335:         tmp[j] = logsumexp(three_v_view)  # Fill in the backward Probability
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 335, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_15 * __pyx_v_tmp.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view);
    }
 336: 
 337:       ### Make tmp new bwd vec:
+338:       for j in range(0, n_states):
    __pyx_t_9 = __pyx_v_n_states;
    __pyx_t_11 = __pyx_t_9;
    for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+339:         bwd[j] = tmp[j]
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_14 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 339, __pyx_L1_error)
      }
      __pyx_t_10 = __pyx_v_j;
      __pyx_t_14 = -1;
      if (__pyx_t_10 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_10 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 339, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_10 * __pyx_v_bwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_15 * __pyx_v_tmp.strides[0]) )));
    }
 340: 
 341:       ### Finalize the 0 Posterior
+342:       post_view[i-1] = post_view[i-1] + bwd[0] - tot_ll
    __pyx_t_15 = (__pyx_v_i - 1);
    __pyx_t_9 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 342, __pyx_L1_error)
    }
    __pyx_t_10 = 0;
    __pyx_t_9 = -1;
    if (__pyx_t_10 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_10 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 342, __pyx_L1_error)
    }
    __pyx_t_8 = (__pyx_v_i - 1);
    __pyx_t_9 = -1;
    if (__pyx_t_8 < 0) {
      __pyx_t_9 = 0;
    } else if (unlikely(__pyx_t_8 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0;
    if (unlikely(__pyx_t_9 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_9);
      __PYX_ERR(0, 342, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_8 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_15 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_10 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll);
  }
 343: 
+344:     post = np.exp(post) # To transform to normal space
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_exp); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
    }
  }
  __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_post);
  __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 344, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_2);
  __pyx_t_2 = 0;
+345:     if output:
  __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 345, __pyx_L1_error)
  if (__pyx_t_22) {
/* … */
  }
+346:         print(f"Total Log likelihood: {tot_ll: .3f}")
    __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __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;
+347:         print_memory_usage()   ## For MEMORY_BENCH
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 347, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 347, __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;
 348: 
+349:     if full==False:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error)
  __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 349, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_22) {
/* … */
  }
+350:       return post[None,:]  # For "fake" axis
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_post, __pyx_tuple__9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
/* … */
  __pyx_tuple__9 = PyTuple_Pack(2, Py_None, __pyx_slice__3); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 350, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
 351: 
+352:     elif full==True:   # Return everything
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error)
  __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 352, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_22) {
/* … */
  }
+353:       return post[None,:], fwd0, bwd0, tot_ll
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_post, __pyx_tuple__9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
    __Pyx_INCREF(__pyx_v_fwd0);
    __Pyx_GIVEREF(__pyx_v_fwd0);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_fwd0);
    __Pyx_INCREF(__pyx_v_bwd0);
    __Pyx_GIVEREF(__pyx_v_bwd0);
    PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_bwd0);
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_2);
    __pyx_t_1 = 0;
    __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
 354: 
 355: ###############################################################################
 356: 
+357: def fwd_bkwd_scaled(double[:, :] e_mat, double[:, :, :] t_mat,
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_8fwd_bkwd_scaled[] = "Takes emission and transition probabilities, and calculates posteriors.\n    Uses speed-up specific for Genotype data (pooling same transition rates)\n    Uses rescaling of fwd and bwd matrices\n    e_mat: Emission probabilities [k x l] (normal space)\n    t_mat: Transition Matrix: [l x 3 x 3]  (normal space)\n    in_val: Intitial probability of single symmetric state (normal space)\n    full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n    output: Whether to print output useful for monitoring\n    Otherwise only posterior mat [kxl] of post is returned\n    ";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_9fwd_bkwd_scaled = {"fwd_bkwd_scaled", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_8fwd_bkwd_scaled};
static PyObject *__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_in_val;
  PyObject *__pyx_v_full = 0;
  PyObject *__pyx_v_output = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_scaled (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0};
    PyObject* values[5] = {0,0,0,0,0};
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6ancIBD_5cfunc_8fwd_bkwd_scaled(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_j;
  Py_ssize_t __pyx_v_k;
  double __pyx_v_stay;
  double __pyx_v_x1;
  double __pyx_v_x2;
  double __pyx_v_x3;
  PyObject *__pyx_v_post = NULL;
  PyObject *__pyx_v_c = NULL;
  __Pyx_memviewslice __pyx_v_c_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_temp = NULL;
  __Pyx_memviewslice __pyx_v_temp_v = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_temp1 = NULL;
  __Pyx_memviewslice __pyx_v_temp1_v = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_fwd1 = NULL;
  __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_bwd1 = NULL;
  __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_f_l = NULL;
  PyObject *__pyx_v_tot_ll = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_scaled", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __Pyx_XDECREF(__pyx_t_24);
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_post);
  __Pyx_XDECREF(__pyx_v_c);
  __PYX_XDEC_MEMVIEW(&__pyx_v_c_view, 1);
  __Pyx_XDECREF(__pyx_v_temp);
  __PYX_XDEC_MEMVIEW(&__pyx_v_temp_v, 1);
  __Pyx_XDECREF(__pyx_v_temp1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_temp1_v, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1);
  __Pyx_XDECREF(__pyx_v_fwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1);
  __Pyx_XDECREF(__pyx_v_bwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1);
  __Pyx_XDECREF(__pyx_v_f_l);
  __Pyx_XDECREF(__pyx_v_tot_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__37 = PyTuple_Pack(28, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_x3, __pyx_n_s_post, __pyx_n_s_c, __pyx_n_s_c_view, __pyx_n_s_temp, __pyx_n_s_temp_v, __pyx_n_s_temp1, __pyx_n_s_temp1_v, __pyx_n_s_t, __pyx_n_s_fwd1, __pyx_n_s_fwd, __pyx_n_s_bwd1, __pyx_n_s_bwd, __pyx_n_s_f_l, __pyx_n_s_tot_ll); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__37);
  __Pyx_GIVEREF(__pyx_tuple__37);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_9fwd_bkwd_scaled, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_scaled, __pyx_t_2) < 0) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(5, 0, 28, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_scaled, 357, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 357, __pyx_L1_error)
+358:                     double in_val = 1e-4, full=False, output=True):
    values[3] = ((PyObject *)Py_False);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled", 0, 2, 5, 1); __PYX_ERR(0, 357, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_scaled") < 0)) __PYX_ERR(0, 357, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 357, __pyx_L3_error)
    __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 357, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 358, __pyx_L3_error)
    } else {
      __pyx_v_in_val = ((double)1e-4);
    }
    __pyx_v_full = values[3];
    __pyx_v_output = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 357, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_8fwd_bkwd_scaled(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
 359:     """Takes emission and transition probabilities, and calculates posteriors.
 360:     Uses speed-up specific for Genotype data (pooling same transition rates)
 361:     Uses rescaling of fwd and bwd matrices
 362:     e_mat: Emission probabilities [k x l] (normal space)
 363:     t_mat: Transition Matrix: [l x 3 x 3]  (normal space)
 364:     in_val: Intitial probability of single symmetric state (normal space)
 365:     full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
 366:     output: Whether to print output useful for monitoring
 367:     Otherwise only posterior mat [kxl] of post is returned
 368:     """
+369:     cdef int n_states = e_mat.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+370:     cdef int n_loci = e_mat.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
 371:     cdef Py_ssize_t i, j, k    # The Array and Iteration Indices
 372:     cdef double stay           # The Probablility of Staying
 373:     cdef double x1, x2, x3     # Place holder variables [make code readable]
 374: 
 375:     # Initialize Posterior and Transition Probabilities
+376:     post = np.empty([n_states, n_loci], dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 376, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_post = __pyx_t_1;
  __pyx_t_1 = 0;
 377: 
+378:     c = np.empty(n_loci, dtype=DTYPE) # Array of normalization constants
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 378, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __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_1); __pyx_t_1 = 0;
  __pyx_v_c = __pyx_t_2;
  __pyx_t_2 = 0;
+379:     cdef double[:] c_view = c
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_c, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 379, __pyx_L1_error)
  __pyx_v_c_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 380: 
+381:     temp = np.empty(n_states, dtype=DTYPE) # l Array for calculations
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 381, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_temp = __pyx_t_4;
  __pyx_t_4 = 0;
+382:     cdef double[:] temp_v = temp
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 382, __pyx_L1_error)
  __pyx_v_temp_v = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 383: 
+384:     temp1 = np.empty(n_states-1, dtype=DTYPE) # l-1 Array for calculatons
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 384, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_temp1 = __pyx_t_1;
  __pyx_t_1 = 0;
+385:     cdef double[:] temp1_v = temp1
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 385, __pyx_L1_error)
  __pyx_v_temp1_v = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 386: 
+387:     cdef double[:,:,:] t = t_mat   # C View of transition matrix
  __PYX_INC_MEMVIEW(&__pyx_v_t_mat, 0);
  __pyx_v_t = __pyx_v_t_mat;
 388: 
 389:     ### Initialize FWD BWD matrices with first and last entries filled
+390:     fwd1 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 390, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __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;
  __pyx_v_fwd1 = __pyx_t_1;
  __pyx_t_1 = 0;
+391:     fwd1[:, 0] = in_val  # Initial Probabilities
  __pyx_t_1 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__4, __pyx_t_1) < 0)) __PYX_ERR(0, 391, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+392:     fwd1[0, 0] = 1 - (n_states - 1) * in_val
  __pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 392, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__5, __pyx_t_1) < 0)) __PYX_ERR(0, 392, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+393:     cdef double[:,:] fwd = fwd1
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 393, __pyx_L1_error)
  __pyx_v_fwd = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 394: 
+395:     c_view[0] = 1 # Set the first normalization constant
  __pyx_t_7 = 0;
  __pyx_t_8 = -1;
  if (__pyx_t_7 < 0) {
    __pyx_t_8 = 0;
  } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_8 = 0;
  if (unlikely(__pyx_t_8 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_8);
    __PYX_ERR(0, 395, __pyx_L1_error)
  }
  *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) )) = 1.0;
 396: 
+397:     bwd1 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 397, __pyx_L1_error)
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_bwd1 = __pyx_t_1;
  __pyx_t_1 = 0;
+398:     bwd1[:, -1] = 1 # The initial values for the backward pass
  if (unlikely(PyObject_SetItem(__pyx_v_bwd1, __pyx_tuple__6, __pyx_int_1) < 0)) __PYX_ERR(0, 398, __pyx_L1_error)
 399:     #bwd1[0, -1] = 1 - (n_states - 1) * in_val
+400:     cdef double[:,:] bwd = bwd1
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 400, __pyx_L1_error)
  __pyx_v_bwd = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 401: 
 402:     #############################
 403:     ### Do the Forward Algorithm
+404:     for i in range(1, n_loci):  # Run forward recursion
  __pyx_t_8 = __pyx_v_n_loci;
  __pyx_t_9 = __pyx_t_8;
  for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;
+405:         stay = t[i, 1, 1] - t[i, 1, 2]  # Do the log of the Stay term
    __pyx_t_7 = __pyx_v_i;
    __pyx_t_11 = 1;
    __pyx_t_12 = 1;
    __pyx_t_13 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_12 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 405, __pyx_L1_error)
    }
    __pyx_t_14 = __pyx_v_i;
    __pyx_t_15 = 1;
    __pyx_t_16 = 2;
    __pyx_t_13 = -1;
    if (__pyx_t_14 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 405, __pyx_L1_error)
    }
    __pyx_v_stay = ((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_7 * __pyx_v_t.strides[0]) ) + __pyx_t_11 * __pyx_v_t.strides[1]) ) + __pyx_t_12 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_15 * __pyx_v_t.strides[1]) ) + __pyx_t_16 * __pyx_v_t.strides[2]) ))));
 406: 
 407:         #for k in range(1, n_states): # Calculate Sum of ROH states. 
+408:         f_l = 1 - fwd[0, i-1]  ### Assume they are normalized!!!
    __pyx_t_16 = 0;
    __pyx_t_15 = (__pyx_v_i - 1);
    __pyx_t_13 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 408, __pyx_L1_error)
    }
    __pyx_t_1 = PyFloat_FromDouble((1.0 - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) ))))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 408, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_XDECREF_SET(__pyx_v_f_l, __pyx_t_1);
    __pyx_t_1 = 0;
 409: 
 410:         ### Do the 0 State:
+411:         x1 = fwd[0, i - 1] * t[i, 0, 0]    # Staying in 0 State
    __pyx_t_15 = 0;
    __pyx_t_16 = (__pyx_v_i - 1);
    __pyx_t_13 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 411, __pyx_L1_error)
    }
    __pyx_t_14 = __pyx_v_i;
    __pyx_t_12 = 0;
    __pyx_t_11 = 0;
    __pyx_t_13 = -1;
    if (__pyx_t_14 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 411, __pyx_L1_error)
    }
    __pyx_v_x1 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) ))));
+412:         x2 = f_l * t[i, 1, 0]               # Going into 0 State from any other
    __pyx_t_11 = __pyx_v_i;
    __pyx_t_12 = 1;
    __pyx_t_14 = 0;
    __pyx_t_13 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_14 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 412, __pyx_L1_error)
    }
    __pyx_t_1 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_11 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_14 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 412, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 412, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 412, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_v_x2 = __pyx_t_17;
+413:         temp_v[0] = e_mat[0, i] * (x1 + x2) # Set the unnorm. 0 forward variable
    __pyx_t_14 = 0;
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_13 = -1;
    if (__pyx_t_14 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 413, __pyx_L1_error)
    }
    __pyx_t_11 = 0;
    __pyx_t_13 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 413, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_14 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_e_mat.strides[1]) ))) * (__pyx_v_x1 + __pyx_v_x2));
 414: 
 415:         ### Do the other states
 416:         # Preprocessing:
+417:         x1 = fwd[0, i - 1] * t[i, 0, 1]   # Coming from 0 State
    __pyx_t_12 = 0;
    __pyx_t_14 = (__pyx_v_i - 1);
    __pyx_t_13 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_14 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 417, __pyx_L1_error)
    }
    __pyx_t_11 = __pyx_v_i;
    __pyx_t_16 = 0;
    __pyx_t_15 = 1;
    __pyx_t_13 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 417, __pyx_L1_error)
    }
    __pyx_v_x1 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_14 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_11 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))));
+418:         x2 = f_l * t[i, 1, 2]             # Coming from other ROH State
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_16 = 1;
    __pyx_t_11 = 2;
    __pyx_t_13 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_13 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 2;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 418, __pyx_L1_error)
    }
    __pyx_t_4 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_15 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 418, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_17 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 418, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_x2 = __pyx_t_17;
 419: 
+420:         for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_13 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_13;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+421:             x3 = fwd[j, i-1] *  stay # Staying in state
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_16 = (__pyx_v_i - 1);
      __pyx_t_20 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 421, __pyx_L1_error)
      }
      __pyx_v_x3 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_11 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) ))) * __pyx_v_stay);
+422:             temp_v[j] = e_mat[j, i] * (x1 + x2 + x3)
      __pyx_t_16 = __pyx_v_j;
      __pyx_t_11 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_11 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_e_mat.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 422, __pyx_L1_error)
      }
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_temp_v.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 422, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_15 * __pyx_v_temp_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_16 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_e_mat.strides[1]) ))) * ((__pyx_v_x1 + __pyx_v_x2) + __pyx_v_x3));
    }
 423: 
 424:         ### Do the normalization
+425:         c_view[i] = sum_array(temp_v, n_states)
    __pyx_t_11 = __pyx_v_i;
    __pyx_t_13 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_13 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_c_view.shape[0])) __pyx_t_13 = 0;
    if (unlikely(__pyx_t_13 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_13);
      __PYX_ERR(0, 425, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_11 * __pyx_v_c_view.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp_v, __pyx_v_n_states);
+426:         for j in range(n_states):
    __pyx_t_13 = __pyx_v_n_states;
    __pyx_t_18 = __pyx_t_13;
    for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+427:             fwd[j,i] = temp_v[j] / c_view[i] # Rescale to prob. distribution
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_20 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 427, __pyx_L1_error)
      }
      __pyx_t_17 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) )));
      __pyx_t_11 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_c_view.shape[0])) __pyx_t_20 = 0;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 427, __pyx_L1_error)
      }
      __pyx_t_21 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_11 * __pyx_v_c_view.strides[0]) )));
      if (unlikely(__pyx_t_21 == 0)) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float division");
        __PYX_ERR(0, 427, __pyx_L1_error)
      }
      __pyx_t_11 = __pyx_v_j;
      __pyx_t_16 = __pyx_v_i;
      __pyx_t_20 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_20 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0;
      if (__pyx_t_16 < 0) {
        __pyx_t_20 = 1;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1;
      if (unlikely(__pyx_t_20 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_20);
        __PYX_ERR(0, 427, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_11 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) )) = (__pyx_t_17 / __pyx_t_21);
    }
  }
 428: 
 429:     #############################
 430:     ### Do the Backward Algorithm
+431:     for i in range(n_loci-1, 0, -1):  # Run backward recursion
  for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) {
    __pyx_v_i = __pyx_t_10;
+432:         stay = t[i, 1, 1] - t[i, 1, 2]
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_11 = 1;
    __pyx_t_15 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 432, __pyx_L1_error)
    }
    __pyx_t_14 = __pyx_v_i;
    __pyx_t_12 = 1;
    __pyx_t_7 = 2;
    __pyx_t_8 = -1;
    if (__pyx_t_14 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_7 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 432, __pyx_L1_error)
    }
    __pyx_v_stay = ((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_16 * __pyx_v_t.strides[0]) ) + __pyx_t_11 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_7 * __pyx_v_t.strides[2]) ))));
 433: 
+434:         for k in range(1, n_states): # Calculate logsum of ROH states:
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) {
      __pyx_v_k = __pyx_t_19;
+435:             temp1_v[k-1] = bwd[k, i] * e_mat[k, i]
      __pyx_t_7 = __pyx_v_k;
      __pyx_t_12 = __pyx_v_i;
      __pyx_t_13 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0;
      if (__pyx_t_12 < 0) {
        __pyx_t_13 = 1;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 435, __pyx_L1_error)
      }
      __pyx_t_14 = __pyx_v_k;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_13 = -1;
      if (__pyx_t_14 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_13 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 435, __pyx_L1_error)
      }
      __pyx_t_11 = (__pyx_v_k - 1);
      __pyx_t_13 = -1;
      if (__pyx_t_11 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_11 >= __pyx_v_temp1_v.shape[0])) __pyx_t_13 = 0;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 435, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_temp1_v.data + __pyx_t_11 * __pyx_v_temp1_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_7 * __pyx_v_bwd.strides[0]) ) + __pyx_t_12 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_14 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat.strides[1]) ))));
    }
+436:         f_l = sum_array(temp1_v, n_states-1) # Logsum of ROH States
    __pyx_t_1 = PyFloat_FromDouble(__pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp1_v, (__pyx_v_n_states - 1))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 436, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_XDECREF_SET(__pyx_v_f_l, __pyx_t_1);
    __pyx_t_1 = 0;
 437: 
 438:       # Do the 0 State:
+439:         x1 = bwd[0, i] * t[i, 0, 0] * e_mat[0, i]   # Staying in 0 State
    __pyx_t_15 = 0;
    __pyx_t_14 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_14 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 439, __pyx_L1_error)
    }
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_7 = 0;
    __pyx_t_11 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 439, __pyx_L1_error)
    }
    __pyx_t_16 = 0;
    __pyx_t_22 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_22 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 439, __pyx_L1_error)
    }
    __pyx_v_x1 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_14 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_12 * __pyx_v_t.strides[0]) ) + __pyx_t_7 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_16 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_22 * __pyx_v_e_mat.strides[1]) ))));
+440:         x2 = f_l * t[i, 0, 1]                         # Going into 0 State
    __pyx_t_22 = __pyx_v_i;
    __pyx_t_16 = 0;
    __pyx_t_11 = 1;
    __pyx_t_8 = -1;
    if (__pyx_t_22 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 440, __pyx_L1_error)
    }
    __pyx_t_1 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_22 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 440, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 440, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_21 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 440, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_v_x2 = __pyx_t_21;
+441:         temp_v[0] = x1 + x2
    __pyx_t_11 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_8 = 0;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 441, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) )) = (__pyx_v_x1 + __pyx_v_x2);
 442: 
 443:       ### Do the other states
 444:       # Preprocessing:
+445:         x1 = e_mat[0, i] * bwd[0, i] * t[i, 1, 0]
    __pyx_t_11 = 0;
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_11 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_11 >= __pyx_v_e_mat.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 445, __pyx_L1_error)
    }
    __pyx_t_22 = 0;
    __pyx_t_7 = __pyx_v_i;
    __pyx_t_8 = -1;
    if (__pyx_t_22 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_22 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_7 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 445, __pyx_L1_error)
    }
    __pyx_t_12 = __pyx_v_i;
    __pyx_t_14 = 1;
    __pyx_t_15 = 0;
    __pyx_t_8 = -1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_14 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 445, __pyx_L1_error)
    }
    __pyx_v_x1 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_11 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) ) + __pyx_t_7 * __pyx_v_bwd.strides[1]) )))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_12 * __pyx_v_t.strides[0]) ) + __pyx_t_14 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))));
+446:         x2 = f_l * t[i, 1, 2]    # Coming from other ROH State
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_14 = 1;
    __pyx_t_12 = 2;
    __pyx_t_8 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_8 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0;
    if (__pyx_t_14 < 0) {
      __pyx_t_8 = 1;
    } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1;
    if (__pyx_t_12 < 0) {
      __pyx_t_8 = 2;
    } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2;
    if (unlikely(__pyx_t_8 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_8);
      __PYX_ERR(0, 446, __pyx_L1_error)
    }
    __pyx_t_4 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_15 * __pyx_v_t.strides[0]) ) + __pyx_t_14 * __pyx_v_t.strides[1]) ) + __pyx_t_12 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 446, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 446, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_21 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 446, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_x2 = __pyx_t_21;
 447: 
+448:         for j in range(1, n_states):  # Do the final run over all states
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+449:             x3 = e_mat[j, i] * bwd[j, i] *  stay
      __pyx_t_12 = __pyx_v_j;
      __pyx_t_14 = __pyx_v_i;
      __pyx_t_13 = -1;
      if (__pyx_t_12 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0;
      if (__pyx_t_14 < 0) {
        __pyx_t_13 = 1;
      } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 449, __pyx_L1_error)
      }
      __pyx_t_15 = __pyx_v_j;
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_13 = -1;
      if (__pyx_t_15 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 1;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 449, __pyx_L1_error)
      }
      __pyx_v_x3 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_12 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_14 * __pyx_v_e_mat.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_7 * __pyx_v_bwd.strides[1]) )))) * __pyx_v_stay);
+450:             temp_v[j] = x1 + x2 + x3  # Fill in the backward Probability
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_13 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 450, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_7 * __pyx_v_temp_v.strides[0]) )) = ((__pyx_v_x1 + __pyx_v_x2) + __pyx_v_x3);
    }
 451: 
 452:         ### Do the normalization
+453:         for j in range(n_states):
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) {
      __pyx_v_j = __pyx_t_19;
+454:             bwd[j, i - 1] = temp_v[j] / c_view[i] # Rescale to prob. distribution
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_13 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 454, __pyx_L1_error)
      }
      __pyx_t_21 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_7 * __pyx_v_temp_v.strides[0]) )));
      __pyx_t_7 = __pyx_v_i;
      __pyx_t_13 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_13 = 0;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 454, __pyx_L1_error)
      }
      __pyx_t_17 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) )));
      if (unlikely(__pyx_t_17 == 0)) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float division");
        __PYX_ERR(0, 454, __pyx_L1_error)
      }
      __pyx_t_7 = __pyx_v_j;
      __pyx_t_15 = (__pyx_v_i - 1);
      __pyx_t_13 = -1;
      if (__pyx_t_7 < 0) {
        __pyx_t_13 = 0;
      } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_13 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1;
      if (unlikely(__pyx_t_13 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_13);
        __PYX_ERR(0, 454, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_7 * __pyx_v_bwd.strides[0]) ) + __pyx_t_15 * __pyx_v_bwd.strides[1]) )) = (__pyx_t_21 / __pyx_t_17);
    }
  }
 455: 
 456:     ### Combine the forward and backward calculations for posterior
+457:     post = fwd1 * bwd1
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 457, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_1);
  __pyx_t_1 = 0;
+458:     if output:
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 458, __pyx_L1_error)
  if (__pyx_t_23) {
/* … */
  }
+459:         print("Memory Usage at end of HMM:")
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 459, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
/* … */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Memory_Usage_at_end_of_HMM); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 459, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);
+460:         print_memory_usage()   ## For MEMORY_BENCH
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 460, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_4);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 460, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 461: 
+462:     if full==False:
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 462, __pyx_L1_error)
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 462, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_23) {
/* … */
  }
+463:         return post
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_post);
    __pyx_r = __pyx_v_post;
    goto __pyx_L0;
 464: 
+465:     elif full==True:   # Return everything
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error)
  __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 465, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_23) {
/* … */
  }
+466:         tot_ll = np.sum(np.log(c)) # Tot Likelihood is product over all c. 
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_sum); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_log); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_24);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_24))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_24);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_24);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_24, function);
      }
    }
    __pyx_t_4 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_24, __pyx_t_2, __pyx_v_c) : __Pyx_PyObject_CallOneArg(__pyx_t_24, __pyx_v_c);
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0;
    __pyx_t_24 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_24)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_24);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    __pyx_t_1 = (__pyx_t_24) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_24, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4);
    __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 466, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_tot_ll = __pyx_t_1;
    __pyx_t_1 = 0;
+467:         if output:
    __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 467, __pyx_L1_error)
    if (__pyx_t_23) {
/* … */
    }
+468:             print(f"Total Log likelihood: {tot_ll: .3f}")
      __pyx_t_1 = __Pyx_PyObject_Format(__pyx_v_tot_ll, __pyx_kp_u_3f); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 468, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 468, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 468, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+469:         return post, fwd1, bwd1, tot_ll
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_v_post);
    __Pyx_GIVEREF(__pyx_v_post);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_post);
    __Pyx_INCREF(__pyx_v_fwd1);
    __Pyx_GIVEREF(__pyx_v_fwd1);
    PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_fwd1);
    __Pyx_INCREF(__pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_v_bwd1);
    PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_bwd1);
    __Pyx_INCREF(__pyx_v_tot_ll);
    __Pyx_GIVEREF(__pyx_v_tot_ll);
    PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_tot_ll);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
 470: 
 471: ###############################################################################
 472: ###############################################################################
 473: ### Viterbi Path
 474: 
+475: def viterbi_path(double[:, :] e_mat0, double[:, :, :] t_mat0, double[:] end_p0):
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_11viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_10viterbi_path[] = "Implementation of a Viterbi Path.\n    e_mat0  Matrices with Emission Probabilities, [k,l] (log space)\n    t_mat: Transition Matrix: [l x 3 x 3]  (normal space)\n    end_p: probability to begin/end in states [k]";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_11viterbi_path = {"viterbi_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_11viterbi_path, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_10viterbi_path};
static PyObject *__pyx_pw_6ancIBD_5cfunc_11viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_end_p0 = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("viterbi_path (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat0,&__pyx_n_s_t_mat0,&__pyx_n_s_end_p0,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat0)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, 1); __PYX_ERR(0, 475, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_end_p0)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, 2); __PYX_ERR(0, 475, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "viterbi_path") < 0)) __PYX_ERR(0, 475, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_e_mat0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat0.memview)) __PYX_ERR(0, 475, __pyx_L3_error)
    __pyx_v_t_mat0 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat0.memview)) __PYX_ERR(0, 475, __pyx_L3_error)
    __pyx_v_end_p0 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_end_p0.memview)) __PYX_ERR(0, 475, __pyx_L3_error)
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 475, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.viterbi_path", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_10viterbi_path(__pyx_self, __pyx_v_e_mat0, __pyx_v_t_mat0, __pyx_v_end_p0);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;

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

static PyObject *__pyx_pf_6ancIBD_5cfunc_10viterbi_path(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat0, __Pyx_memviewslice __pyx_v_t_mat0, __Pyx_memviewslice __pyx_v_end_p0) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_k;
  int __pyx_v_m;
  double __pyx_v_v;
  __Pyx_memviewslice __pyx_v_mp = { 0, 0, { 0 }, { 0 }, { 0 } };
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_new_p = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_pt = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_trans_ll = NULL;
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_three_v = NULL;
  __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_three_vi = NULL;
  __Pyx_memviewslice __pyx_v_three_vi_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_two_v = NULL;
  __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_two_vi = NULL;
  __Pyx_memviewslice __pyx_v_two_vi_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_path = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_x = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("viterbi_path", 0);
/* … */
  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __Pyx_XDECREF(__pyx_t_7);
  __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1);
  __Pyx_AddTraceback("ancIBD.cfunc.viterbi_path", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __PYX_XDEC_MEMVIEW(&__pyx_v_mp, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_new_p, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_pt, 1);
  __Pyx_XDECREF(__pyx_v_trans_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1);
  __Pyx_XDECREF(__pyx_v_three_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1);
  __Pyx_XDECREF(__pyx_v_three_vi);
  __PYX_XDEC_MEMVIEW(&__pyx_v_three_vi_view, 1);
  __Pyx_XDECREF(__pyx_v_two_v);
  __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1);
  __Pyx_XDECREF(__pyx_v_two_vi);
  __PYX_XDEC_MEMVIEW(&__pyx_v_two_vi_view, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_path, 1);
  __Pyx_XDECREF(__pyx_v_x);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat0, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_end_p0, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__39 = PyTuple_Pack(25, __pyx_n_s_e_mat0, __pyx_n_s_t_mat0, __pyx_n_s_end_p0, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_m, __pyx_n_s_v, __pyx_n_s_mp, __pyx_n_s_new_p, __pyx_n_s_pt, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_three_vi, __pyx_n_s_three_vi_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_two_vi, __pyx_n_s_two_vi_view, __pyx_n_s_path, __pyx_n_s_x); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__39);
  __Pyx_GIVEREF(__pyx_tuple__39);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_11viterbi_path, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_viterbi_path, __pyx_t_2) < 0) __PYX_ERR(0, 475, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(3, 0, 25, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_viterbi_path, 475, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 475, __pyx_L1_error)
 476:     """Implementation of a Viterbi Path.
 477:     e_mat0  Matrices with Emission Probabilities, [k,l] (log space)
 478:     t_mat: Transition Matrix: [l x 3 x 3]  (normal space)
 479:     end_p: probability to begin/end in states [k]"""
+480:     cdef int n_states = e_mat0.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat0.shape[0]);
+481:     cdef int n_loci = e_mat0.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat0.shape[1]);
 482:     cdef Py_ssize_t i, j, k # The Array Indices
 483:     cdef int m  # Placeholder for Maximum
 484:     cdef double v # Value to set
 485: 
 486:     # Do the actual optimization (with back-tracking)
 487:     # Initialize Views:
+488:     cdef double[:, :] mp = np.empty((n_states, n_loci), dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 488, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_mp = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
+489:     cdef double[:] new_p = np.empty(n_states, dtype = DTYPE) # Temporary Array
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 489, __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_1); __pyx_t_1 = 0;
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 489, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_new_p = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
+490:     cdef long[:,:] pt = np.empty((n_states, n_loci), dtype = np.int16)  # Previous State Pointer
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_long(__pyx_t_7, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 490, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_pt = __pyx_t_8;
  __pyx_t_8.memview = NULL;
  __pyx_t_8.data = NULL;
 491: 
+492:     trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_7);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
  __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 492, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_trans_ll = __pyx_t_1;
  __pyx_t_1 = 0;
+493:     cdef double[:] trans_ll_view = trans_ll
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 493, __pyx_L1_error)
  __pyx_v_trans_ll_view = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 494: 
+495:     three_v = np.empty(3, dtype=DTYPE)     # Array of size three
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_three_v = __pyx_t_3;
  __pyx_t_3 = 0;
+496:     cdef double[:] three_v_view = three_v
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 496, __pyx_L1_error)
  __pyx_v_three_v_view = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 497: 
+498:     three_vi = np.empty(3, dtype=int)       # Int Array of size three
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, ((PyObject *)(&PyInt_Type))) < 0) __PYX_ERR(0, 498, __pyx_L1_error)
  __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple_, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 498, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_three_vi = __pyx_t_7;
  __pyx_t_7 = 0;
+499:     cdef long[:] three_vi_view = three_vi
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_v_three_vi, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 499, __pyx_L1_error)
  __pyx_v_three_vi_view = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
 500: 
+501:     two_v = np.empty(2, dtype=DTYPE)       # Array of size two
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__2, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 501, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_two_v = __pyx_t_1;
  __pyx_t_1 = 0;
+502:     cdef double[:] two_v_view = two_v
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 502, __pyx_L1_error)
  __pyx_v_two_v_view = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 503: 
+504:     two_vi = np.empty(2, dtype=int)       # Int Array of size two
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 504, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 504, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 504, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, ((PyObject *)(&PyInt_Type))) < 0) __PYX_ERR(0, 504, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 504, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_two_vi = __pyx_t_3;
  __pyx_t_3 = 0;
+505:     cdef long[:] two_vi_view = two_vi
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_v_two_vi, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 505, __pyx_L1_error)
  __pyx_v_two_vi_view = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
 506: 
+507:     for k in range(n_states):
  __pyx_t_10 = __pyx_v_n_states;
  __pyx_t_11 = __pyx_t_10;
  for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
    __pyx_v_k = __pyx_t_12;
+508:       mp[k, 0] = end_p0[k]  # Initialize with Ending Probabilities
    __pyx_t_13 = __pyx_v_k;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_end_p0.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 508, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_k;
    __pyx_t_16 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 508, __pyx_L1_error)
    }
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_15 * __pyx_v_mp.strides[0]) ) + __pyx_t_16 * __pyx_v_mp.strides[1]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_end_p0.data + __pyx_t_13 * __pyx_v_end_p0.strides[0]) )));
 509: 
+510:       two_vi_view[0] = 0
    __pyx_t_13 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 510, __pyx_L1_error)
    }
    *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_13 * __pyx_v_two_vi_view.strides[0]) )) = 0;
+511:       three_vi_view[0] = 0
    __pyx_t_13 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 511, __pyx_L1_error)
    }
    *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_13 * __pyx_v_three_vi_view.strides[0]) )) = 0;
  }
 512: 
+513:     for i in range(1, n_loci):  # Do the Viterbi-Iteration
  __pyx_t_10 = __pyx_v_n_loci;
  __pyx_t_11 = __pyx_t_10;
  for (__pyx_t_12 = 1; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) {
    __pyx_v_i = __pyx_t_12;
 514:         ### Precomputation:
 515:         # Do the maximal log probability of 1, ...k State:
+516:         m = argmax(mp[1:, i - 1])
    __pyx_t_6.data = __pyx_v_mp.data;
    __pyx_t_6.memview = __pyx_v_mp.memview;
    __PYX_INC_MEMVIEW(&__pyx_t_6, 0);
    __pyx_t_14 = -1;
    if (unlikely(__pyx_memoryview_slice_memviewslice(
    &__pyx_t_6,
    __pyx_v_mp.shape[0], __pyx_v_mp.strides[0], __pyx_v_mp.suboffsets[0],
    0,
    0,
    &__pyx_t_14,
    1,
    0,
    0,
    1,
    0,
    0,
    1) < 0))
{
    __PYX_ERR(0, 516, __pyx_L1_error)
}

{
    Py_ssize_t __pyx_tmp_idx = (__pyx_v_i - 1);
        Py_ssize_t __pyx_tmp_shape = __pyx_v_mp.shape[1];
    Py_ssize_t __pyx_tmp_stride = __pyx_v_mp.strides[1];
        if (unlikely(!__Pyx_is_valid_index(__pyx_tmp_idx, __pyx_tmp_shape))) {
            PyErr_SetString(PyExc_IndexError,
                            "Index out of bounds (axis 1)");
            __PYX_ERR(0, 516, __pyx_L1_error)
        }
        __pyx_t_6.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_t_6);
    __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
    __pyx_t_6.memview = NULL;
    __pyx_t_6.data = NULL;
+517:         v = mp[m+1, i - 1]
    __pyx_t_13 = (__pyx_v_m + 1);
    __pyx_t_16 = (__pyx_v_i - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 517, __pyx_L1_error)
    }
    __pyx_v_v = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_13 * __pyx_v_mp.strides[0]) ) + __pyx_t_16 * __pyx_v_mp.strides[1]) )));
 518: 
 519:         # Do the States from collapsed states
+520:         two_vi_view[1] = m+1   # Set the Pointers
    __pyx_t_16 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 520, __pyx_L1_error)
    }
    *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_16 * __pyx_v_two_vi_view.strides[0]) )) = (__pyx_v_m + 1);
+521:         three_vi_view[1] = m+1
    __pyx_t_16 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 521, __pyx_L1_error)
    }
    *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_16 * __pyx_v_three_vi_view.strides[0]) )) = (__pyx_v_m + 1);
 522: 
+523:         two_v_view[1] = v + t_mat0[i, 1, 0]
    __pyx_t_16 = __pyx_v_i;
    __pyx_t_13 = 1;
    __pyx_t_15 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 523, __pyx_L1_error)
    }
    __pyx_t_17 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 523, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_16 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_15 * __pyx_v_t_mat0.strides[2]) ))));
+524:         three_v_view[1] = v + t_mat0[i, 1, 2] # Move in from other ROH
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_13 = 1;
    __pyx_t_16 = 2;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 524, __pyx_L1_error)
    }
    __pyx_t_17 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 524, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_17 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_15 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_16 * __pyx_v_t_mat0.strides[2]) ))));
 525: 
 526:         ### Do the zero State
+527:         two_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 0]
    __pyx_t_16 = 0;
    __pyx_t_13 = (__pyx_v_i - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 527, __pyx_L1_error)
    }
    __pyx_t_15 = __pyx_v_i;
    __pyx_t_17 = 0;
    __pyx_t_18 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_18 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 527, __pyx_L1_error)
    }
    __pyx_t_19 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_19 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_19 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 527, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_19 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_16 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_15 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_18 * __pyx_v_t_mat0.strides[2]) ))));
 528: 
+529:         m = argmax(two_v_view)      ### Do a Maximum
    __pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_v_two_v_view);
+530:         v = two_v_view[m]
    __pyx_t_18 = __pyx_v_m;
    __pyx_t_14 = -1;
    if (__pyx_t_18 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 530, __pyx_L1_error)
    }
    __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_18 * __pyx_v_two_v_view.strides[0]) )));
+531:         mp[0, i] = v + e_mat0[0, i]   ### Set Max. Probability
    __pyx_t_18 = 0;
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_18 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 531, __pyx_L1_error)
    }
    __pyx_t_15 = 0;
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 531, __pyx_L1_error)
    }
    *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_15 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_18 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_e_mat0.strides[1]) ))));
+532:         pt[0, i] = two_vi_view[m]      ### Set Pointer for Backtrace
    __pyx_t_17 = __pyx_v_m;
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 532, __pyx_L1_error)
    }
    __pyx_t_18 = 0;
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_14 = -1;
    if (__pyx_t_18 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_pt.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_pt.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 532, __pyx_L1_error)
    }
    *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_18 * __pyx_v_pt.strides[0]) ) + __pyx_t_13 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_17 * __pyx_v_two_vi_view.strides[0]) )));
 533: 
 534:         ### Do the other States
+535:         three_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 1] # Move from 0 State
    __pyx_t_17 = 0;
    __pyx_t_13 = (__pyx_v_i - 1);
    __pyx_t_14 = -1;
    if (__pyx_t_17 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_13 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 535, __pyx_L1_error)
    }
    __pyx_t_18 = __pyx_v_i;
    __pyx_t_15 = 0;
    __pyx_t_16 = 1;
    __pyx_t_14 = -1;
    if (__pyx_t_18 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0;
    if (__pyx_t_15 < 0) {
      __pyx_t_14 = 1;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1;
    if (__pyx_t_16 < 0) {
      __pyx_t_14 = 2;
    } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 535, __pyx_L1_error)
    }
    __pyx_t_19 = 0;
    __pyx_t_14 = -1;
    if (__pyx_t_19 < 0) {
      __pyx_t_14 = 0;
    } else if (unlikely(__pyx_t_19 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0;
    if (unlikely(__pyx_t_14 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_14);
      __PYX_ERR(0, 535, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_19 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_17 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_18 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_16 * __pyx_v_t_mat0.strides[2]) ))));
 536: 
+537:         for k in range(1, n_states):   # Find Maximum
    __pyx_t_14 = __pyx_v_n_states;
    __pyx_t_20 = __pyx_t_14;
    for (__pyx_t_21 = 1; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) {
      __pyx_v_k = __pyx_t_21;
+538:           three_v_view[2] = mp[k, i - 1] + t_mat0[i, 1, 1] # The Stay State
      __pyx_t_16 = __pyx_v_k;
      __pyx_t_15 = (__pyx_v_i - 1);
      __pyx_t_22 = -1;
      if (__pyx_t_16 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[0])) __pyx_t_22 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_22 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[1])) __pyx_t_22 = 1;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 538, __pyx_L1_error)
      }
      __pyx_t_18 = __pyx_v_i;
      __pyx_t_13 = 1;
      __pyx_t_17 = 1;
      __pyx_t_22 = -1;
      if (__pyx_t_18 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[0])) __pyx_t_22 = 0;
      if (__pyx_t_13 < 0) {
        __pyx_t_22 = 1;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_22 = 1;
      if (__pyx_t_17 < 0) {
        __pyx_t_22 = 2;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat0.shape[2])) __pyx_t_22 = 2;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 538, __pyx_L1_error)
      }
      __pyx_t_19 = 2;
      __pyx_t_22 = -1;
      if (__pyx_t_19 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_19 >= __pyx_v_three_v_view.shape[0])) __pyx_t_22 = 0;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 538, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_19 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_16 * __pyx_v_mp.strides[0]) ) + __pyx_t_15 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_18 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat0.strides[2]) ))));
+539:           three_vi_view[2] = k
      __pyx_t_17 = 2;
      __pyx_t_22 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_22 = 0;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 539, __pyx_L1_error)
      }
      *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_17 * __pyx_v_three_vi_view.strides[0]) )) = __pyx_v_k;
 540: 
+541:           m = argmax(three_v_view)      ### Do a Maximum
      __pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_v_three_v_view);
+542:           v = three_v_view[m]
      __pyx_t_17 = __pyx_v_m;
      __pyx_t_22 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_three_v_view.shape[0])) __pyx_t_22 = 0;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 542, __pyx_L1_error)
      }
      __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_17 * __pyx_v_three_v_view.strides[0]) )));
 543: 
+544:           mp[k, i] = v + e_mat0[k, i]   ### Set Max. Probability
      __pyx_t_17 = __pyx_v_k;
      __pyx_t_13 = __pyx_v_i;
      __pyx_t_22 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_22 = 0;
      if (__pyx_t_13 < 0) {
        __pyx_t_22 = 1;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_22 = 1;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 544, __pyx_L1_error)
      }
      __pyx_t_18 = __pyx_v_k;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_22 = -1;
      if (__pyx_t_18 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_18 >= __pyx_v_mp.shape[0])) __pyx_t_22 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_22 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[1])) __pyx_t_22 = 1;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 544, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_18 * __pyx_v_mp.strides[0]) ) + __pyx_t_15 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))));
+545:           pt[k, i] = three_vi_view[m]      ### Set Pointer for Backtrace
      __pyx_t_13 = __pyx_v_m;
      __pyx_t_22 = -1;
      if (__pyx_t_13 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_13 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_22 = 0;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 545, __pyx_L1_error)
      }
      __pyx_t_17 = __pyx_v_k;
      __pyx_t_15 = __pyx_v_i;
      __pyx_t_22 = -1;
      if (__pyx_t_17 < 0) {
        __pyx_t_22 = 0;
      } else if (unlikely(__pyx_t_17 >= __pyx_v_pt.shape[0])) __pyx_t_22 = 0;
      if (__pyx_t_15 < 0) {
        __pyx_t_22 = 1;
      } else if (unlikely(__pyx_t_15 >= __pyx_v_pt.shape[1])) __pyx_t_22 = 1;
      if (unlikely(__pyx_t_22 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_22);
        __PYX_ERR(0, 545, __pyx_L1_error)
      }
      *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_17 * __pyx_v_pt.strides[0]) ) + __pyx_t_15 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_13 * __pyx_v_three_vi_view.strides[0]) )));
    }
  }
 546: 
 547:     ### Do the trace back
+548:     cdef long[:] path = -np.ones(n_loci, dtype=np.int16)  # Initialize
  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3);
  __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int16); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_Negative(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_t_3, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 548, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_path = __pyx_t_9;
  __pyx_t_9.memview = NULL;
  __pyx_t_9.data = NULL;
 549: 
+550:     x = np.argmax(mp[:, n_loci-1])  # The highest probability
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_argmax); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6.data = __pyx_v_mp.data;
  __pyx_t_6.memview = __pyx_v_mp.memview;
  __PYX_INC_MEMVIEW(&__pyx_t_6, 0);
  __pyx_t_6.shape[0] = __pyx_v_mp.shape[0];
__pyx_t_6.strides[0] = __pyx_v_mp.strides[0];
    __pyx_t_6.suboffsets[0] = -1;

{
    Py_ssize_t __pyx_tmp_idx = (__pyx_v_n_loci - 1);
        Py_ssize_t __pyx_tmp_shape = __pyx_v_mp.shape[1];
    Py_ssize_t __pyx_tmp_stride = __pyx_v_mp.strides[1];
        if (unlikely(!__Pyx_is_valid_index(__pyx_tmp_idx, __pyx_tmp_shape))) {
            PyErr_SetString(PyExc_IndexError,
                            "Index out of bounds (axis 1)");
            __PYX_ERR(0, 550, __pyx_L1_error)
        }
        __pyx_t_6.data += __pyx_tmp_idx * __pyx_tmp_stride;
}

__pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_6, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_7, function);
    }
  }
  __pyx_t_3 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_1, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_2);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 550, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_v_x = __pyx_t_3;
  __pyx_t_3 = 0;
+551:     path[n_loci-1] = x
  __pyx_t_23 = __Pyx_PyInt_As_long(__pyx_v_x); if (unlikely((__pyx_t_23 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 551, __pyx_L1_error)
  __pyx_t_13 = (__pyx_v_n_loci - 1);
  __pyx_t_10 = -1;
  if (__pyx_t_13 < 0) {
    __pyx_t_10 = 0;
  } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0;
  if (unlikely(__pyx_t_10 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_10);
    __PYX_ERR(0, 551, __pyx_L1_error)
  }
  *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) )) = __pyx_t_23;
 552: 
+553:     for i in range(n_loci - 1, 0, -1):
  for (__pyx_t_12 = (__pyx_v_n_loci - 1); __pyx_t_12 > 0; __pyx_t_12-=1) {
    __pyx_v_i = __pyx_t_12;
 554:         # Always th pointer to the previous path
+555:         path[i - 1] = pt[path[i], i]
    __pyx_t_13 = __pyx_v_i;
    __pyx_t_10 = -1;
    if (__pyx_t_13 < 0) {
      __pyx_t_10 = 0;
    } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0;
    if (unlikely(__pyx_t_10 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_10);
      __PYX_ERR(0, 555, __pyx_L1_error)
    }
    __pyx_t_15 = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) )));
    __pyx_t_17 = __pyx_v_i;
    __pyx_t_10 = -1;
    if (__pyx_t_15 < 0) {
      __pyx_t_10 = 0;
    } else if (unlikely(__pyx_t_15 >= __pyx_v_pt.shape[0])) __pyx_t_10 = 0;
    if (__pyx_t_17 < 0) {
      __pyx_t_10 = 1;
    } else if (unlikely(__pyx_t_17 >= __pyx_v_pt.shape[1])) __pyx_t_10 = 1;
    if (unlikely(__pyx_t_10 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_10);
      __PYX_ERR(0, 555, __pyx_L1_error)
    }
    __pyx_t_18 = (__pyx_v_i - 1);
    __pyx_t_10 = -1;
    if (__pyx_t_18 < 0) {
      __pyx_t_10 = 0;
    } else if (unlikely(__pyx_t_18 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0;
    if (unlikely(__pyx_t_10 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_10);
      __PYX_ERR(0, 555, __pyx_L1_error)
    }
    *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_18 * __pyx_v_path.strides[0]) )) = (*((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_15 * __pyx_v_pt.strides[0]) ) + __pyx_t_17 * __pyx_v_pt.strides[1]) )));
  }
 556: 
+557:     m = path[n_loci-1]
  __pyx_t_13 = (__pyx_v_n_loci - 1);
  __pyx_t_10 = -1;
  if (__pyx_t_13 < 0) {
    __pyx_t_10 = 0;
  } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0;
  if (unlikely(__pyx_t_10 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_10);
    __PYX_ERR(0, 557, __pyx_L1_error)
  }
  __pyx_v_m = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) )));
+558:     print(f"Log likelihood Path: {mp[m,n_loci-1]:.3f}")
  __pyx_t_13 = __pyx_v_m;
  __pyx_t_17 = (__pyx_v_n_loci - 1);
  __pyx_t_10 = -1;
  if (__pyx_t_13 < 0) {
    __pyx_t_10 = 0;
  } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[0])) __pyx_t_10 = 0;
  if (__pyx_t_17 < 0) {
    __pyx_t_10 = 1;
  } else if (unlikely(__pyx_t_17 >= __pyx_v_mp.shape[1])) __pyx_t_10 = 1;
  if (unlikely(__pyx_t_10 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_10);
    __PYX_ERR(0, 558, __pyx_L1_error)
  }
  __pyx_t_3 = PyFloat_FromDouble((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_13 * __pyx_v_mp.strides[0]) ) + __pyx_t_17 * __pyx_v_mp.strides[1]) )))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_7 = __Pyx_PyObject_Format(__pyx_t_3, __pyx_kp_u_3f_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Log_likelihood_Path, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 558, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+559:     assert(np.min(path)>=0) #Sanity check if everything was filled up
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_min); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    __pyx_t_7 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyObject_RichCompare(__pyx_t_7, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_24 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_24 < 0)) __PYX_ERR(0, 559, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (unlikely(!__pyx_t_24)) {
      PyErr_SetNone(PyExc_AssertionError);
      __PYX_ERR(0, 559, __pyx_L1_error)
    }
  }
  #endif
+560:     return np.asarray(path)
  __Pyx_XDECREF(__pyx_r);
  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 560, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 560, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 560, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  __pyx_t_1 = NULL;
  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_7);
  __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 560, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;
 561: 
 562: 
 563: ################################################### code for IBD2 states ###########################################
 564: 
+565: cdef inline void elementwise_multiple(double[:] vec1, double[:] vec2, double[:] dest, int n):
static CYTHON_INLINE void __pyx_f_6ancIBD_5cfunc_elementwise_multiple(__Pyx_memviewslice __pyx_v_vec1, __Pyx_memviewslice __pyx_v_vec2, __Pyx_memviewslice __pyx_v_dest, int __pyx_v_n) {
  int __pyx_v_i;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("elementwise_multiple", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("ancIBD.cfunc.elementwise_multiple", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
+566:   for i in range(n):
  __pyx_t_1 = __pyx_v_n;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+567:     dest[i] = vec1[i]*vec2[i]
    __pyx_t_4 = __pyx_v_i;
    __pyx_t_5 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_5 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_vec1.shape[0])) __pyx_t_5 = 0;
    if (unlikely(__pyx_t_5 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_5);
      __PYX_ERR(0, 567, __pyx_L1_error)
    }
    __pyx_t_6 = __pyx_v_i;
    __pyx_t_5 = -1;
    if (__pyx_t_6 < 0) {
      __pyx_t_5 = 0;
    } else if (unlikely(__pyx_t_6 >= __pyx_v_vec2.shape[0])) __pyx_t_5 = 0;
    if (unlikely(__pyx_t_5 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_5);
      __PYX_ERR(0, 567, __pyx_L1_error)
    }
    __pyx_t_7 = __pyx_v_i;
    __pyx_t_5 = -1;
    if (__pyx_t_7 < 0) {
      __pyx_t_5 = 0;
    } else if (unlikely(__pyx_t_7 >= __pyx_v_dest.shape[0])) __pyx_t_5 = 0;
    if (unlikely(__pyx_t_5 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_5);
      __PYX_ERR(0, 567, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_dest.data + __pyx_t_7 * __pyx_v_dest.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_vec1.data + __pyx_t_4 * __pyx_v_vec1.strides[0]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec2.data + __pyx_t_6 * __pyx_v_vec2.strides[0]) ))));
  }
 568: 
+569: cdef inline void set2zero(double[:] vec, int n):
static CYTHON_INLINE void __pyx_f_6ancIBD_5cfunc_set2zero(__Pyx_memviewslice __pyx_v_vec, int __pyx_v_n) {
  int __pyx_v_i;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("set2zero", 0);
/* … */
  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_WriteUnraisable("ancIBD.cfunc.set2zero", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}
+570:   for i in range(n):
  __pyx_t_1 = __pyx_v_n;
  __pyx_t_2 = __pyx_t_1;
  for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) {
    __pyx_v_i = __pyx_t_3;
+571:     vec[i] = 0.0
    __pyx_t_4 = __pyx_v_i;
    __pyx_t_5 = -1;
    if (__pyx_t_4 < 0) {
      __pyx_t_5 = 0;
    } else if (unlikely(__pyx_t_4 >= __pyx_v_vec.shape[0])) __pyx_t_5 = 0;
    if (unlikely(__pyx_t_5 != -1)) {
      __Pyx_RaiseBufferIndexError(__pyx_t_5);
      __PYX_ERR(0, 571, __pyx_L1_error)
    }
    *((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_4 * __pyx_v_vec.strides[0]) )) = 0.0;
  }
 572: 
 573: 
+574: def fwd_bkwd_scaled_asymmetricTransition(double[:, :] e_mat, double[:, :, :] t_mat,
/* Python wrapper */
static PyObject *__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition[] = "Takes emission and transition probabilities, and calculates posteriors.\n    Uses speed-up specific for Genotype data (pooling same transition rates)\n    Uses rescaling of fwd and bwd matrices\n    e_mat: Emission probabilities [k x l] (normal space)\n    t_mat: Transition Matrix: [l x 7 x 7]  (normal space)\n    in_val: Intitial probability of single symmetric state (normal space)\n    full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n    output: Whether to print output useful for monitoring\n    Otherwise only posterior mat [kxl] of post is returned\n    ";
static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition = {"fwd_bkwd_scaled_asymmetricTransition", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition};
static PyObject *__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } };
  double __pyx_v_in_val;
  PyObject *__pyx_v_full = 0;
  PyObject *__pyx_v_output = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_scaled_asymmetricTransition (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0};
    PyObject* values[5] = {0,0,0,0,0};
/* … */
  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) {
  int __pyx_v_n_states;
  int __pyx_v_n_loci;
  Py_ssize_t __pyx_v_i;
  Py_ssize_t __pyx_v_j;
  Py_ssize_t __pyx_v_k;
  PyObject *__pyx_v_post = NULL;
  PyObject *__pyx_v_c = NULL;
  __Pyx_memviewslice __pyx_v_c_view = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_temp = NULL;
  __Pyx_memviewslice __pyx_v_temp_v = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_temp1 = NULL;
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_temp1_v = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_temp2 = NULL;
  CYTHON_UNUSED __Pyx_memviewslice __pyx_v_temp2_v = { 0, 0, { 0 }, { 0 }, { 0 } };
  __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_fwd1 = NULL;
  __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_bwd1 = NULL;
  __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } };
  PyObject *__pyx_v_tot_ll = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("fwd_bkwd_scaled_asymmetricTransition", 0);
/* … */
  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1);
  __Pyx_XDECREF(__pyx_t_28);
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled_asymmetricTransition", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_post);
  __Pyx_XDECREF(__pyx_v_c);
  __PYX_XDEC_MEMVIEW(&__pyx_v_c_view, 1);
  __Pyx_XDECREF(__pyx_v_temp);
  __PYX_XDEC_MEMVIEW(&__pyx_v_temp_v, 1);
  __Pyx_XDECREF(__pyx_v_temp1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_temp1_v, 1);
  __Pyx_XDECREF(__pyx_v_temp2);
  __PYX_XDEC_MEMVIEW(&__pyx_v_temp2_v, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1);
  __Pyx_XDECREF(__pyx_v_fwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1);
  __Pyx_XDECREF(__pyx_v_bwd1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1);
  __Pyx_XDECREF(__pyx_v_tot_ll);
  __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1);
  __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
/* … */
  __pyx_tuple__41 = PyTuple_Pack(29, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_x3, __pyx_n_s_post, __pyx_n_s_c, __pyx_n_s_c_view, __pyx_n_s_temp, __pyx_n_s_temp_v, __pyx_n_s_temp1, __pyx_n_s_temp1_v, __pyx_n_s_temp2, __pyx_n_s_temp2_v, __pyx_n_s_t, __pyx_n_s_fwd1, __pyx_n_s_fwd, __pyx_n_s_bwd1, __pyx_n_s_bwd, __pyx_n_s_tot_ll); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 574, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__41);
  __Pyx_GIVEREF(__pyx_tuple__41);
/* … */
  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 574, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_scaled_asymmetricTransi, __pyx_t_2) < 0) __PYX_ERR(0, 574, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(5, 0, 29, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_scaled_asymmetricTransi, 574, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 574, __pyx_L1_error)
+575:                     double in_val = 1e-4, full=False, output=True):
    values[3] = ((PyObject *)Py_False);
    values[4] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        CYTHON_FALLTHROUGH;
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        CYTHON_FALLTHROUGH;
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        CYTHON_FALLTHROUGH;
        case  1:
        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled_asymmetricTransition", 0, 2, 5, 1); __PYX_ERR(0, 574, __pyx_L3_error)
        }
        CYTHON_FALLTHROUGH;
        case  2:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val);
          if (value) { values[2] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  3:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full);
          if (value) { values[3] = value; kw_args--; }
        }
        CYTHON_FALLTHROUGH;
        case  4:
        if (kw_args > 0) {
          PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_scaled_asymmetricTransition") < 0)) __PYX_ERR(0, 574, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        CYTHON_FALLTHROUGH;
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        CYTHON_FALLTHROUGH;
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        CYTHON_FALLTHROUGH;
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 574, __pyx_L3_error)
    __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 574, __pyx_L3_error)
    if (values[2]) {
      __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L3_error)
    } else {
      __pyx_v_in_val = ((double)1e-4);
    }
    __pyx_v_full = values[3];
    __pyx_v_output = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled_asymmetricTransition", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 574, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled_asymmetricTransition", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
 576:     """Takes emission and transition probabilities, and calculates posteriors.
 577:     Uses speed-up specific for Genotype data (pooling same transition rates)
 578:     Uses rescaling of fwd and bwd matrices
 579:     e_mat: Emission probabilities [k x l] (normal space)
 580:     t_mat: Transition Matrix: [l x 7 x 7]  (normal space)
 581:     in_val: Intitial probability of single symmetric state (normal space)
 582:     full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
 583:     output: Whether to print output useful for monitoring
 584:     Otherwise only posterior mat [kxl] of post is returned
 585:     """
+586:     cdef int n_states = e_mat.shape[0]
  __pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+587:     cdef int n_loci = e_mat.shape[1]
  __pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
 588:     cdef Py_ssize_t i, j, k    # The Array and Iteration Indices
 589:     cdef double stay           # The Probablility of Staying
 590:     cdef double x1, x2, x3     # Place holder variables [make code readable]
 591: 
 592:     # Initialize Posterior and Transition Probabilities
+593:     post = np.empty([n_states, n_loci], dtype=DTYPE)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_1);
  PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_3);
  PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_1 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 593, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_post = __pyx_t_1;
  __pyx_t_1 = 0;
 594: 
+595:     c = np.empty(n_loci, dtype=DTYPE) # Array of normalization constants
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 595, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 595, __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_1); __pyx_t_1 = 0;
  __pyx_v_c = __pyx_t_2;
  __pyx_t_2 = 0;
+596:     cdef double[:] c_view = c
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_c, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 596, __pyx_L1_error)
  __pyx_v_c_view = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 597: 
+598:     temp = np.empty(n_states, dtype=DTYPE) # l Array for calculations
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 598, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_temp = __pyx_t_4;
  __pyx_t_4 = 0;
+599:     cdef double[:] temp_v = temp
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 599, __pyx_L1_error)
  __pyx_v_temp_v = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 600: 
+601:     temp1 = np.empty(n_states-1, dtype=DTYPE) # l-1 Array for calculatons
  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 601, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __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(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_temp1 = __pyx_t_1;
  __pyx_t_1 = 0;
+602:     cdef double[:] temp1_v = temp1
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 602, __pyx_L1_error)
  __pyx_v_temp1_v = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 603: 
+604:     temp2 = np.empty(n_states, dtype=DTYPE) # l Array for temporary storage (added by Yilei)
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 604, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 604, __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_1); __pyx_t_1 = 0;
  __pyx_v_temp2 = __pyx_t_2;
  __pyx_t_2 = 0;
+605:     cdef double[:] temp2_v = temp2
  __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 605, __pyx_L1_error)
  __pyx_v_temp2_v = __pyx_t_5;
  __pyx_t_5.memview = NULL;
  __pyx_t_5.data = NULL;
 606: 
+607:     cdef double[:,:,:] t = t_mat   # C View of transition matrix
  __PYX_INC_MEMVIEW(&__pyx_v_t_mat, 0);
  __pyx_v_t = __pyx_v_t_mat;
 608: 
 609:     ### Initialize FWD BWD matrices with first and last entries filled
+610:     fwd1 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3);
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 610, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_fwd1 = __pyx_t_2;
  __pyx_t_2 = 0;
+611:     fwd1[:, 0] = in_val  # Initial Probabilities
  __pyx_t_2 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 611, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__4, __pyx_t_2) < 0)) __PYX_ERR(0, 611, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+612:     fwd1[0, 0] = 1 - (n_states - 1) * in_val
  __pyx_t_2 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 612, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__5, __pyx_t_2) < 0)) __PYX_ERR(0, 612, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+613:     cdef double[:,:] fwd = fwd1
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 613, __pyx_L1_error)
  __pyx_v_fwd = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 614: 
+615:     c_view[0] = 1 # Set the first normalization constant
  __pyx_t_7 = 0;
  __pyx_t_8 = -1;
  if (__pyx_t_7 < 0) {
    __pyx_t_8 = 0;
  } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_8 = 0;
  if (unlikely(__pyx_t_8 != -1)) {
    __Pyx_RaiseBufferIndexError(__pyx_t_8);
    __PYX_ERR(0, 615, __pyx_L1_error)
  }
  *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) )) = 1.0;
 616: 
+617:     bwd1 = np.zeros((n_states, n_loci), dtype="float")
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_3);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3);
  __pyx_t_2 = 0;
  __pyx_t_3 = 0;
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 617, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 617, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __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_1); __pyx_t_1 = 0;
  __pyx_v_bwd1 = __pyx_t_2;
  __pyx_t_2 = 0;
+618:     bwd1[:, -1] = 1 # The initial values for the backward pass
  if (unlikely(PyObject_SetItem(__pyx_v_bwd1, __pyx_tuple__6, __pyx_int_1) < 0)) __PYX_ERR(0, 618, __pyx_L1_error)
+619:     cdef double[:,:] bwd = bwd1
  __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 619, __pyx_L1_error)
  __pyx_v_bwd = __pyx_t_6;
  __pyx_t_6.memview = NULL;
  __pyx_t_6.data = NULL;
 620: 
 621:     #############################
 622:     ### Do the Forward Algorithm
+623:     for i in range(1, n_loci):  # Run forward recursion
  __pyx_t_8 = __pyx_v_n_loci;
  __pyx_t_9 = __pyx_t_8;
  for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {
    __pyx_v_i = __pyx_t_10;
+624:       set2zero(temp_v, n_states)
    __pyx_f_6ancIBD_5cfunc_set2zero(__pyx_v_temp_v, __pyx_v_n_states);
+625:       for j in range(n_states):
    __pyx_t_11 = __pyx_v_n_states;
    __pyx_t_12 = __pyx_t_11;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+626:         for k in range(n_states):
      __pyx_t_14 = __pyx_v_n_states;
      __pyx_t_15 = __pyx_t_14;
      for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) {
        __pyx_v_k = __pyx_t_16;
+627:           temp_v[j] += fwd[k, i-1]*t[i, k, j]
        __pyx_t_7 = __pyx_v_k;
        __pyx_t_17 = (__pyx_v_i - 1);
        __pyx_t_18 = -1;
        if (__pyx_t_7 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_fwd.shape[0])) __pyx_t_18 = 0;
        if (__pyx_t_17 < 0) {
          __pyx_t_18 = 1;
        } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_18 = 1;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 627, __pyx_L1_error)
        }
        __pyx_t_19 = __pyx_v_i;
        __pyx_t_20 = __pyx_v_k;
        __pyx_t_21 = __pyx_v_j;
        __pyx_t_18 = -1;
        if (__pyx_t_19 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_19 >= __pyx_v_t.shape[0])) __pyx_t_18 = 0;
        if (__pyx_t_20 < 0) {
          __pyx_t_18 = 1;
        } else if (unlikely(__pyx_t_20 >= __pyx_v_t.shape[1])) __pyx_t_18 = 1;
        if (__pyx_t_21 < 0) {
          __pyx_t_18 = 2;
        } else if (unlikely(__pyx_t_21 >= __pyx_v_t.shape[2])) __pyx_t_18 = 2;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 627, __pyx_L1_error)
        }
        __pyx_t_22 = __pyx_v_j;
        __pyx_t_18 = -1;
        if (__pyx_t_22 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_22 >= __pyx_v_temp_v.shape[0])) __pyx_t_18 = 0;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 627, __pyx_L1_error)
        }
        *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_22 * __pyx_v_temp_v.strides[0]) )) += ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_7 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_19 * __pyx_v_t.strides[0]) ) + __pyx_t_20 * __pyx_v_t.strides[1]) ) + __pyx_t_21 * __pyx_v_t.strides[2]) ))));
      }
+628:         temp_v[j] *= e_mat[j, i]
      __pyx_t_21 = __pyx_v_j;
      __pyx_t_20 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_21 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat.shape[0])) __pyx_t_14 = 0;
      if (__pyx_t_20 < 0) {
        __pyx_t_14 = 1;
      } else if (unlikely(__pyx_t_20 >= __pyx_v_e_mat.shape[1])) __pyx_t_14 = 1;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 628, __pyx_L1_error)
      }
      __pyx_t_19 = __pyx_v_j;
      __pyx_t_14 = -1;
      if (__pyx_t_19 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_19 >= __pyx_v_temp_v.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 628, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_19 * __pyx_v_temp_v.strides[0]) )) *= (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_21 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_20 * __pyx_v_e_mat.strides[1]) )));
 629: 
 630:         ### Do the normalization
+631:         c_view[i] = sum_array(temp_v, n_states)
      __pyx_t_20 = __pyx_v_i;
      __pyx_t_14 = -1;
      if (__pyx_t_20 < 0) {
        __pyx_t_14 = 0;
      } else if (unlikely(__pyx_t_20 >= __pyx_v_c_view.shape[0])) __pyx_t_14 = 0;
      if (unlikely(__pyx_t_14 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_14);
        __PYX_ERR(0, 631, __pyx_L1_error)
      }
      *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_20 * __pyx_v_c_view.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp_v, __pyx_v_n_states);
+632:         for j in range(n_states):
      __pyx_t_14 = __pyx_v_n_states;
      __pyx_t_15 = __pyx_t_14;
      for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) {
        __pyx_v_j = __pyx_t_16;
+633:             fwd[j,i] = temp_v[j] / c_view[i] # Rescale to prob. distribution
        __pyx_t_20 = __pyx_v_j;
        __pyx_t_18 = -1;
        if (__pyx_t_20 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_20 >= __pyx_v_temp_v.shape[0])) __pyx_t_18 = 0;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 633, __pyx_L1_error)
        }
        __pyx_t_23 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_20 * __pyx_v_temp_v.strides[0]) )));
        __pyx_t_20 = __pyx_v_i;
        __pyx_t_18 = -1;
        if (__pyx_t_20 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_20 >= __pyx_v_c_view.shape[0])) __pyx_t_18 = 0;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 633, __pyx_L1_error)
        }
        __pyx_t_24 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_20 * __pyx_v_c_view.strides[0]) )));
        if (unlikely(__pyx_t_24 == 0)) {
          PyErr_SetString(PyExc_ZeroDivisionError, "float division");
          __PYX_ERR(0, 633, __pyx_L1_error)
        }
        __pyx_t_20 = __pyx_v_j;
        __pyx_t_21 = __pyx_v_i;
        __pyx_t_18 = -1;
        if (__pyx_t_20 < 0) {
          __pyx_t_18 = 0;
        } else if (unlikely(__pyx_t_20 >= __pyx_v_fwd.shape[0])) __pyx_t_18 = 0;
        if (__pyx_t_21 < 0) {
          __pyx_t_18 = 1;
        } else if (unlikely(__pyx_t_21 >= __pyx_v_fwd.shape[1])) __pyx_t_18 = 1;
        if (unlikely(__pyx_t_18 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_18);
          __PYX_ERR(0, 633, __pyx_L1_error)
        }
        *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_20 * __pyx_v_fwd.strides[0]) ) + __pyx_t_21 * __pyx_v_fwd.strides[1]) )) = (__pyx_t_23 / __pyx_t_24);
      }
    }
  }
 634: 
 635:     #############################
 636:     ### Do the Backward Algorithm
+637:     for i in range(n_loci-1, 0, -1):  # Run backward recursion
  for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) {
    __pyx_v_i = __pyx_t_10;
+638:       set2zero(temp_v, n_states)
    __pyx_f_6ancIBD_5cfunc_set2zero(__pyx_v_temp_v, __pyx_v_n_states);
+639:       for j in range(n_states):
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+640:         for k in range(n_states):
      __pyx_t_11 = __pyx_v_n_states;
      __pyx_t_12 = __pyx_t_11;
      for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_12; __pyx_t_16+=1) {
        __pyx_v_k = __pyx_t_16;
+641:           temp_v[j] += bwd[k, i]*t[i, j, k]*e_mat[k, i]
        __pyx_t_21 = __pyx_v_k;
        __pyx_t_20 = __pyx_v_i;
        __pyx_t_14 = -1;
        if (__pyx_t_21 < 0) {
          __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_21 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_20 < 0) {
          __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_20 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_14);
          __PYX_ERR(0, 641, __pyx_L1_error)
        }
        __pyx_t_19 = __pyx_v_i;
        __pyx_t_17 = __pyx_v_j;
        __pyx_t_7 = __pyx_v_k;
        __pyx_t_14 = -1;
        if (__pyx_t_19 < 0) {
          __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_19 >= __pyx_v_t.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_17 < 0) {
          __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_17 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1;
        if (__pyx_t_7 < 0) {
          __pyx_t_14 = 2;
        } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_14);
          __PYX_ERR(0, 641, __pyx_L1_error)
        }
        __pyx_t_22 = __pyx_v_k;
        __pyx_t_25 = __pyx_v_i;
        __pyx_t_14 = -1;
        if (__pyx_t_22 < 0) {
          __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat.shape[0])) __pyx_t_14 = 0;
        if (__pyx_t_25 < 0) {
          __pyx_t_14 = 1;
        } else if (unlikely(__pyx_t_25 >= __pyx_v_e_mat.shape[1])) __pyx_t_14 = 1;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_14);
          __PYX_ERR(0, 641, __pyx_L1_error)
        }
        __pyx_t_26 = __pyx_v_j;
        __pyx_t_14 = -1;
        if (__pyx_t_26 < 0) {
          __pyx_t_14 = 0;
        } else if (unlikely(__pyx_t_26 >= __pyx_v_temp_v.shape[0])) __pyx_t_14 = 0;
        if (unlikely(__pyx_t_14 != -1)) {
          __Pyx_RaiseBufferIndexError(__pyx_t_14);
          __PYX_ERR(0, 641, __pyx_L1_error)
        }
        *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_26 * __pyx_v_temp_v.strides[0]) )) += (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_21 * __pyx_v_bwd.strides[0]) ) + __pyx_t_20 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_19 * __pyx_v_t.strides[0]) ) + __pyx_t_17 * __pyx_v_t.strides[1]) ) + __pyx_t_7 * __pyx_v_t.strides[2]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_22 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_25 * __pyx_v_e_mat.strides[1]) ))));
      }
    }
 642: 
 643:       ### Do the normalization
+644:       for j in range(n_states):
    __pyx_t_8 = __pyx_v_n_states;
    __pyx_t_9 = __pyx_t_8;
    for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) {
      __pyx_v_j = __pyx_t_13;
+645:         bwd[j, i - 1] = temp_v[j] / c_view[i] # Rescale to prob. distribution
      __pyx_t_25 = __pyx_v_j;
      __pyx_t_11 = -1;
      if (__pyx_t_25 < 0) {
        __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_25 >= __pyx_v_temp_v.shape[0])) __pyx_t_11 = 0;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_11);
        __PYX_ERR(0, 645, __pyx_L1_error)
      }
      __pyx_t_24 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_25 * __pyx_v_temp_v.strides[0]) )));
      __pyx_t_25 = __pyx_v_i;
      __pyx_t_11 = -1;
      if (__pyx_t_25 < 0) {
        __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_25 >= __pyx_v_c_view.shape[0])) __pyx_t_11 = 0;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_11);
        __PYX_ERR(0, 645, __pyx_L1_error)
      }
      __pyx_t_23 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_25 * __pyx_v_c_view.strides[0]) )));
      if (unlikely(__pyx_t_23 == 0)) {
        PyErr_SetString(PyExc_ZeroDivisionError, "float division");
        __PYX_ERR(0, 645, __pyx_L1_error)
      }
      __pyx_t_25 = __pyx_v_j;
      __pyx_t_22 = (__pyx_v_i - 1);
      __pyx_t_11 = -1;
      if (__pyx_t_25 < 0) {
        __pyx_t_11 = 0;
      } else if (unlikely(__pyx_t_25 >= __pyx_v_bwd.shape[0])) __pyx_t_11 = 0;
      if (__pyx_t_22 < 0) {
        __pyx_t_11 = 1;
      } else if (unlikely(__pyx_t_22 >= __pyx_v_bwd.shape[1])) __pyx_t_11 = 1;
      if (unlikely(__pyx_t_11 != -1)) {
        __Pyx_RaiseBufferIndexError(__pyx_t_11);
        __PYX_ERR(0, 645, __pyx_L1_error)
      }
      *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_25 * __pyx_v_bwd.strides[0]) ) + __pyx_t_22 * __pyx_v_bwd.strides[1]) )) = (__pyx_t_24 / __pyx_t_23);
    }
  }
 646: 
 647:     ### Combine the forward and backward calculations for posterior
+648:     post = fwd1 * bwd1
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 648, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_2);
  __pyx_t_2 = 0;
+649:     if output:
  __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 649, __pyx_L1_error)
  if (__pyx_t_27) {
/* … */
  }
+650:         print("Memory Usage at end of HMM:")
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 650, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+651:         print_memory_usage()   ## For MEMORY_BENCH
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 651, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_1);
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 651, __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;
 652: 
+653:     if full==False:
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 653, __pyx_L1_error)
  __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 653, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_27) {
/* … */
  }
+654:         return post
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_post);
    __pyx_r = __pyx_v_post;
    goto __pyx_L0;
 655: 
+656:     elif full==True:   # Return everything
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 656, __pyx_L1_error)
  __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 656, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_27) {
/* … */
  }
+657:         tot_ll = np.sum(np.log(c)) # Tot Likelihood is product over all c. 
    __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sum); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_28)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_28);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_28))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_28);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_28);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_28, function);
      }
    }
    __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_28, __pyx_t_4, __pyx_v_c) : __Pyx_PyObject_CallOneArg(__pyx_t_28, __pyx_v_c);
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
    if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_28); __pyx_t_28 = 0;
    __pyx_t_28 = NULL;
    if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_28 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_28)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_28);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    __pyx_t_2 = (__pyx_t_28) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_28, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1);
    __Pyx_XDECREF(__pyx_t_28); __pyx_t_28 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 657, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_tot_ll = __pyx_t_2;
    __pyx_t_2 = 0;
+658:         if output:
    __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 658, __pyx_L1_error)
    if (__pyx_t_27) {
/* … */
    }
+659:             print(f"Total Log likelihood: {tot_ll: .3f}")
      __pyx_t_2 = __Pyx_PyObject_Format(__pyx_v_tot_ll, __pyx_kp_u_3f); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 659, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __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;
+660:         return post, fwd1, bwd1, tot_ll
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 660, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_post);
    __Pyx_GIVEREF(__pyx_v_post);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_post);
    __Pyx_INCREF(__pyx_v_fwd1);
    __Pyx_GIVEREF(__pyx_v_fwd1);
    PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_fwd1);
    __Pyx_INCREF(__pyx_v_bwd1);
    __Pyx_GIVEREF(__pyx_v_bwd1);
    PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_bwd1);
    __Pyx_INCREF(__pyx_v_tot_ll);
    __Pyx_GIVEREF(__pyx_v_tot_ll);
    PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_tot_ll);
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;