Generated by Cython 0.29.20
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.float # 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_float); 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: cdef inline double logsumexp(double[:] vec):
static CYTHON_INLINE double __pyx_f_8hapsburg_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("hapsburg.cfunc.logsumexp", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
013: """Do the Log of the Sum of Exponentials."""
014: cdef Py_ssize_t i # The iterator Variable
+015: cdef double result = 0.0
__pyx_v_result = 0.0;
+016: 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, 16, __pyx_L1_error) } __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
017:
+018: 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;
+019: 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, 19, __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) { /* … */ } }
+020: 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, 20, __pyx_L1_error) } __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
+021: 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;
+022: 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, 22, __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))); }
+023: return largest + log(result)
__pyx_r = (__pyx_v_largest + log(__pyx_v_result)); goto __pyx_L0;
024:
+025: cdef inline long argmax(double[:] vec):
static CYTHON_INLINE long __pyx_f_8hapsburg_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("hapsburg.cfunc.argmax", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
026: """Return Max and ArgMax"""
027: cdef Py_ssize_t i # The iterator Variable.
+028: cdef int m = 0 # Position of the Maximum.
__pyx_v_m = 0;
+029: 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, 29, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
030:
+031: 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;
+032: 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, 32, __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) { /* … */ } }
+033: 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, 33, __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;
+034: return m # Return Argmax
__pyx_r = __pyx_v_m; goto __pyx_L0;
035:
036:
+037: def print_memory_usage():
/* Python wrapper */ static PyObject *__pyx_pw_8hapsburg_5cfunc_1print_memory_usage(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static char __pyx_doc_8hapsburg_5cfunc_print_memory_usage[] = "Print the current Memory Usage in mB"; static PyMethodDef __pyx_mdef_8hapsburg_5cfunc_1print_memory_usage = {"print_memory_usage", (PyCFunction)__pyx_pw_8hapsburg_5cfunc_1print_memory_usage, METH_NOARGS, __pyx_doc_8hapsburg_5cfunc_print_memory_usage}; static PyObject *__pyx_pw_8hapsburg_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_8hapsburg_5cfunc_print_memory_usage(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_8hapsburg_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("hapsburg.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__27 = PyTuple_Pack(2, __pyx_n_s_process, __pyx_n_s_mb_usage); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 37, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__27); __Pyx_GIVEREF(__pyx_tuple__27); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8hapsburg_5cfunc_1print_memory_usage, NULL, __pyx_n_s_hapsburg_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 37, __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, 37, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_hapsburg_cfunc_pyx, __pyx_n_s_print_memory_usage, 37, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 37, __pyx_L1_error)
038: """Print the current Memory Usage in mB"""
+039: process = psutil.Process(os.getpid())
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_psutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 39, __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, 39, __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, 39, __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, 39, __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, 39, __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, 39, __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;
+040: 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, 40, __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, 40, __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, 40, __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, 40, __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;
+041: print(f"Memory Usage: {mb_usage} mB")
__pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 41, __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, 41, __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, 41, __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, 41, __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;
042:
043:
+044: def fwd_bkwd(double[:, :] e_prob0, double[:, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_8hapsburg_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_8hapsburg_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 log Space\n full: Boolean whether to return everything"; static PyMethodDef __pyx_mdef_8hapsburg_5cfunc_3fwd_bkwd = {"fwd_bkwd", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8hapsburg_5cfunc_3fwd_bkwd, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8hapsburg_5cfunc_2fwd_bkwd}; static PyObject *__pyx_pw_8hapsburg_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_prob0 = { 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_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_prob0,&__pyx_n_s_t_mat,&__pyx_n_s_fwd,&__pyx_n_s_bwd,&__pyx_n_s_t,&__pyx_n_s_full,0}; PyObject* values[6] = {0,0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_8hapsburg_5cfunc_2fwd_bkwd(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_prob0, __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) { 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 } }; 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("hapsburg.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_XDECREF(__pyx_v_fwd1); __Pyx_XDECREF(__pyx_v_bwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_prob0, 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__29 = PyTuple_Pack(18, __pyx_n_s_e_prob0, __pyx_n_s_t_mat, __pyx_n_s_fwd, __pyx_n_s_bwd, __pyx_n_s_t, __pyx_n_s_full, __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_tot_ll, __pyx_n_s_fwd1, __pyx_n_s_bwd1); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 44, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__29); __Pyx_GIVEREF(__pyx_tuple__29); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8hapsburg_5cfunc_3fwd_bkwd, NULL, __pyx_n_s_hapsburg_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 44, __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, 44, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(6, 0, 18, 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_hapsburg_cfunc_pyx, __pyx_n_s_fwd_bkwd, 44, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 44, __pyx_L1_error)
+045: double[:, :] fwd, double[:, :] bwd, double[:,:,:] t, full=False):
values[5] = ((PyObject *)Py_False); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 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_prob0)) != 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, 6, 1); __PYX_ERR(0, 44, __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, 6, 2); __PYX_ERR(0, 44, __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, 6, 3); __PYX_ERR(0, 44, __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, 6, 4); __PYX_ERR(0, 44, __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--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd") < 0)) __PYX_ERR(0, 44, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); 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_prob0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_prob0.memview)) __PYX_ERR(0, 44, __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, 44, __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, 45, __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, 45, __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, 45, __pyx_L3_error) __pyx_v_full = values[5]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 44, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("hapsburg.cfunc.fwd_bkwd", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_8hapsburg_5cfunc_2fwd_bkwd(__pyx_self, __pyx_v_e_prob0, __pyx_v_t_mat, __pyx_v_fwd, __pyx_v_bwd, __pyx_v_t, __pyx_v_full);
046: """Takes emission and transition probabilities, and calculates posteriors.
047: Input: kxl matrices of emission, transition
048: and initialized fwd and bwd probabilities. Given in log Space
049: full: Boolean whether to return everything"""
+050: cdef int n_states = e_prob0.shape[0]
__pyx_v_n_states = (__pyx_v_e_prob0.shape[0]);
+051: cdef int n_loci = e_prob0.shape[1]
__pyx_v_n_loci = (__pyx_v_e_prob0.shape[1]);
052: cdef Py_ssize_t i, j, k # The Array Indices
053:
054: # Initialize Posterior and Transition Probabilities
+055: 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, 55, __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, 55, __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, 55, __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, 55, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 55, __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, 55, __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, 55, __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, 55, __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, 55, __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, 55, __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;
056:
+057: 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, 57, __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, 57, __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, 57, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 57, __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, 57, __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, 57, __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, 57, __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, 57, __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;
+058: 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, 58, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
059:
060: ### Transform to Log space
+061: 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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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, 61, __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;
062:
+063: 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;
+064: 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;
+065: 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;
+066: 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, 66, __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, 66, __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, 66, __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]) )))); }
067:
+068: fwd[j, i] = e_prob0[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_prob0.shape[0])) __pyx_t_15 = 0; if (__pyx_t_21 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_e_prob0.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 68, __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, 68, __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_prob0.data + __pyx_t_22 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_21 * __pyx_v_e_prob0.strides[1]) ))) + __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view)); } }
069:
+070: 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;
+071: 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;
+072: 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;
+073: trans_ll_view[k] = t_mat0[j, k] + e_prob0[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, 73, __pyx_L1_error) } __pyx_t_24 = __pyx_v_k; __pyx_t_25 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_24 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_24 >= __pyx_v_e_prob0.shape[0])) __pyx_t_15 = 0; if (__pyx_t_25 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_25 >= __pyx_v_e_prob0.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 73, __pyx_L1_error) } __pyx_t_26 = __pyx_v_k; __pyx_t_27 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_26 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_bwd.shape[0])) __pyx_t_15 = 0; if (__pyx_t_27 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_27 >= __pyx_v_bwd.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 73, __pyx_L1_error) } __pyx_t_28 = __pyx_v_k; __pyx_t_15 = -1; if (__pyx_t_28 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_28 >= __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, 73, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_28 * __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_prob0.data + __pyx_t_24 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_25 * __pyx_v_e_prob0.strides[1]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_26 * __pyx_v_bwd.strides[0]) ) + __pyx_t_27 * __pyx_v_bwd.strides[1]) )))); }
+074: bwd[j, i - 1] = logsumexp(trans_ll_view)
__pyx_t_27 = __pyx_v_j; __pyx_t_26 = (__pyx_v_i - 1); __pyx_t_12 = -1; if (__pyx_t_27 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_27 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0; if (__pyx_t_26 < 0) { __pyx_t_12 = 1; } else if (unlikely(__pyx_t_26 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 74, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_27 * __pyx_v_bwd.strides[0]) ) + __pyx_t_26 * __pyx_v_bwd.strides[1]) )) = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view); } }
075:
076: # Get total log likelihood
+077: 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;
+078: trans_ll_view[k] = fwd[k, n_loci-1] + bwd[k, n_loci-1]
__pyx_t_25 = __pyx_v_k; __pyx_t_24 = (__pyx_v_n_loci - 1); __pyx_t_12 = -1; if (__pyx_t_25 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_25 >= __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, 78, __pyx_L1_error) } __pyx_t_22 = __pyx_v_k; __pyx_t_21 = (__pyx_v_n_loci - 1); __pyx_t_12 = -1; if (__pyx_t_22 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0; if (__pyx_t_21 < 0) { __pyx_t_12 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 78, __pyx_L1_error) } __pyx_t_29 = __pyx_v_k; __pyx_t_12 = -1; if (__pyx_t_29 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_29 >= __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, 78, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_29 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_25 * __pyx_v_fwd.strides[0]) ) + __pyx_t_24 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) ) + __pyx_t_21 * __pyx_v_bwd.strides[1]) )))); }
+079: tot_ll = logsumexp(trans_ll_view)
__pyx_v_tot_ll = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view);
080:
+081: 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, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 81, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
082:
083: # Combine the forward and backward calculations
+084: fwd1 = np.asarray(fwd) # Transform
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __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, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __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_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __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_3)) __PYX_ERR(0, 84, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_fwd1 = __pyx_t_3; __pyx_t_3 = 0;
+085: bwd1 = np.asarray(bwd)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __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_4)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __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_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __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_3)) __PYX_ERR(0, 85, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_bwd1 = __pyx_t_3; __pyx_t_3 = 0;
+086: post = fwd1 + bwd1 - tot_ll
__pyx_t_3 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 86, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 86, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 86, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_4); __pyx_t_4 = 0;
087:
+088: if full==False:
__pyx_t_4 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 88, __pyx_L1_error) __pyx_t_30 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_30 < 0)) __PYX_ERR(0, 88, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_30) { /* … */ }
+089: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
090:
+091: elif full==True: # Return everything
__pyx_t_4 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 91, __pyx_L1_error) __pyx_t_30 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_30 < 0)) __PYX_ERR(0, 91, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_30) { /* … */ }
+092: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 92, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 92, __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_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_4); __pyx_t_4 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0;
093:
094:
+095: def fwd_bkwd_fast(double[:, :] e_prob0, double[:, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_8hapsburg_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_8hapsburg_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 Emission probabilities [k x l] (log space) (log space)\n Transition probabilities (infinitesimal) [k x k] (normal space)\n Initialized fwd and bwd probabilities [k x l] (log space)\n t: Transition Matrix: [l x 3 x 3] (normal space)\n full: Boolean whether to return everything"; static PyMethodDef __pyx_mdef_8hapsburg_5cfunc_5fwd_bkwd_fast = {"fwd_bkwd_fast", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8hapsburg_5cfunc_5fwd_bkwd_fast, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8hapsburg_5cfunc_4fwd_bkwd_fast}; static PyObject *__pyx_pw_8hapsburg_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_prob0 = { 0, 0, { 0 }, { 0 }, { 0 } }; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_fast (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_prob0,&__pyx_n_s_t_mat,&__pyx_n_s_t,&__pyx_n_s_in_val,&__pyx_n_s_full,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_8hapsburg_5cfunc_4fwd_bkwd_fast(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_prob0, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t_mat, __Pyx_memviewslice __pyx_v_t, double __pyx_v_in_val, PyObject *__pyx_v_full) { 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 } }; 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_XDECREF(__pyx_t_40); __Pyx_AddTraceback("hapsburg.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_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_prob0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__31 = PyTuple_Pack(29, __pyx_n_s_e_prob0, __pyx_n_s_t_mat, __pyx_n_s_t, __pyx_n_s_in_val, __pyx_n_s_full, __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_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__31)) __PYX_ERR(0, 95, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__31); __Pyx_GIVEREF(__pyx_tuple__31); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8hapsburg_5cfunc_5fwd_bkwd_fast, NULL, __pyx_n_s_hapsburg_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 95, __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, 95, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(5, 0, 29, 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_hapsburg_cfunc_pyx, __pyx_n_s_fwd_bkwd_fast, 95, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 95, __pyx_L1_error)
+096: double[:, :, :] t, double in_val = 1e-4, full=False):
values[4] = ((PyObject *)Py_False); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 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_prob0)) != 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, 3, 5, 1); __PYX_ERR(0, 95, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 3, 5, 2); __PYX_ERR(0, 95, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); 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_full); 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, 95, __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); 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_prob0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_prob0.memview)) __PYX_ERR(0, 95, __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, 95, __pyx_L3_error) __pyx_v_t = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t.memview)) __PYX_ERR(0, 96, __pyx_L3_error) if (values[3]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 96, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 95, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("hapsburg.cfunc.fwd_bkwd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_8hapsburg_5cfunc_4fwd_bkwd_fast(__pyx_self, __pyx_v_e_prob0, __pyx_v_t_mat, __pyx_v_t, __pyx_v_in_val, __pyx_v_full);
097: """Takes emission and transition probabilities, and calculates posteriors.
098: Uses speed-up specific for Genotype data (pooling same transition rates)
099: Input:
100: Emission probabilities [k x l] (log space) (log space)
101: Transition probabilities (infinitesimal) [k x k] (normal space)
102: Initialized fwd and bwd probabilities [k x l] (log space)
103: t: Transition Matrix: [l x 3 x 3] (normal space)
104: full: Boolean whether to return everything"""
+105: cdef int n_states = e_prob0.shape[0]
__pyx_v_n_states = (__pyx_v_e_prob0.shape[0]);
+106: cdef int n_loci = e_prob0.shape[1]
__pyx_v_n_loci = (__pyx_v_e_prob0.shape[1]);
107: cdef Py_ssize_t i, j, k # The Array Indices
108: cdef double stay # The Probablility of Staying
109:
110: # Initialize Posterior and Transition Probabilities
+111: 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, 111, __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, 111, __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, 111, __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, 111, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __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, 111, __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, 111, __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, 111, __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, 111, __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, 111, __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;
112:
+113: 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, 113, __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, 113, __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, 113, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 113, __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, 113, __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, 113, __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, 113, __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, 113, __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;
+114: 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, 114, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
115:
+116: 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, 116, __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, 116, __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, 116, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 116, __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, 116, __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, 116, __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, 116, __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, 116, __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;
+117: 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, 117, __pyx_L1_error) __pyx_v_trans_ll_view1 = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
118:
+119: 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, 119, __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, 119, __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, 119, __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, 119, __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, 119, __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, 119, __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, 119, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_);
+120: 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, 120, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
121:
+122: 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, 122, __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, 122, __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, 122, __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, 122, __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, 122, __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, 122, __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, 122, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2);
+123: 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, 123, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
124:
125: # Do transform to Log Space:
+126: cdef double[:,:,:] t0 = np.log(t) # Do log of recombination Map
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __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, 126, __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, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 126, __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, 126, __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, 126, __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;
127:
128: ### Initialize FWD BWD matrices
+129: 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, 129, __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, 129, __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, 129, __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, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __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, 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); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 129, __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, 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_fwd0 = __pyx_t_2; __pyx_t_2 = 0;
+130: 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, 130, __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, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __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, 130, __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, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* … */ __pyx_slice__3 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__3)) __PYX_ERR(0, 130, __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, 130, __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, 130, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4);
+131: fwd0[0, 0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 131, __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, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 131, __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, 131, __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, 131, __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, 131, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5);
+132: 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, 132, __pyx_L1_error) __pyx_v_fwd = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
133:
+134: 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, 134, __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, 134, __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, 134, __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, 134, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 134, __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, 134, __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, 134, __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, 134, __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, 134, __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_bwd0 = __pyx_t_2; __pyx_t_2 = 0;
+135: bwd0[:, -1] = np.log(in_val)
__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_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __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, 135, __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, 135, __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__6, __pyx_t_2) < 0)) __PYX_ERR(0, 135, __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, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6);
+136: bwd0[0, -1] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 136, __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, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 136, __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, 136, __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__7, __pyx_t_2) < 0)) __PYX_ERR(0, 136, __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, 136, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7);
+137: 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, 137, __pyx_L1_error) __pyx_v_bwd = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
138:
139: #############################
140: ### Do the Forward Algorithm
+141: 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;
+142: stay = log(t[i, 1, 1] - t[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.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1; if (__pyx_t_13 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 142, __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.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 142, __pyx_L1_error) } __pyx_v_stay = log(((*((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_13 * __pyx_v_t.strides[2]) ))) - (*((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_17 * __pyx_v_t.strides[2]) )))));
143:
+144: 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;
+145: 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, 145, __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, 145, __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]) ))); }
+146: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view);
147:
148: # Do the 0 State:
+149: 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, 149, __pyx_L1_error) } __pyx_t_13 = __pyx_v_i; __pyx_t_12 = 0; __pyx_t_11 = 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_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_11 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 149, __pyx_L1_error) } __pyx_t_21 = 0; __pyx_t_14 = -1; if (__pyx_t_21 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_21 >= __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, 149, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_21 * __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_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_11 * __pyx_v_t0.strides[2]) ))));
+150: two_v_view[1] = f_l + t0[i, 1, 0] # Going into 0 State
__pyx_t_11 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __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_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, 150, __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, 150, __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_11 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_13 * __pyx_v_t0.strides[2]) ))));
+151: fwd[0, i] = e_prob0[0, i] + logsumexp(two_v_view)
__pyx_t_13 = 0; __pyx_t_12 = __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_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 151, __pyx_L1_error) } __pyx_t_11 = 0; __pyx_t_16 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 151, __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]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_13 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_12 * __pyx_v_e_prob0.strides[1]) ))) + __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_two_v_view));
152:
153: ### Do the other states
154: # Preprocessing:
+155: three_v_view[0] = fwd[0, i - 1] + t0[i, 0, 1] # Coming from 0 State
__pyx_t_12 = 0; __pyx_t_13 = (__pyx_v_i - 1); __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_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 155, __pyx_L1_error) } __pyx_t_22 = __pyx_v_i; __pyx_t_23 = 0; __pyx_t_24 = 1; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_23 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_24 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_24 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 155, __pyx_L1_error) } __pyx_t_25 = 0; __pyx_t_14 = -1; if (__pyx_t_25 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_25 >= __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, 155, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_25 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_13 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_22 * __pyx_v_t0.strides[0]) ) + __pyx_t_23 * __pyx_v_t0.strides[1]) ) + __pyx_t_24 * __pyx_v_t0.strides[2]) ))));
+156: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_24 = __pyx_v_i; __pyx_t_23 = 1; __pyx_t_22 = 2; __pyx_t_14 = -1; if (__pyx_t_24 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_24 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_23 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_22 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 156, __pyx_L1_error) } __pyx_t_13 = 1; __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, 156, __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_24 * __pyx_v_t0.strides[0]) ) + __pyx_t_23 * __pyx_v_t0.strides[1]) ) + __pyx_t_22 * __pyx_v_t0.strides[2]) ))));
157:
+158: 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;
+159: three_v_view[2] = fwd[j, i-1] + stay
__pyx_t_22 = __pyx_v_j; __pyx_t_23 = (__pyx_v_i - 1); __pyx_t_20 = -1; if (__pyx_t_22 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_23 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 159, __pyx_L1_error) } __pyx_t_24 = 2; __pyx_t_20 = -1; if (__pyx_t_24 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_24 >= __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, 159, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_24 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_22 * __pyx_v_fwd.strides[0]) ) + __pyx_t_23 * __pyx_v_fwd.strides[1]) ))) + __pyx_v_stay);
+160: fwd[j, i] = e_prob0[j, i] + logsumexp(three_v_view)
__pyx_t_23 = __pyx_v_j; __pyx_t_22 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_23 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_23 >= __pyx_v_e_prob0.shape[0])) __pyx_t_20 = 0; if (__pyx_t_22 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_prob0.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 160, __pyx_L1_error) } __pyx_t_12 = __pyx_v_j; __pyx_t_26 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_12 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_26 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_26 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 160, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_26 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_23 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_22 * __pyx_v_e_prob0.strides[1]) ))) + __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_three_v_view)); } }
161:
162: #############################
163: ### Do the Backward Algorithm
+164: 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;
+165: stay = log(t[i, 1, 1] - t[i, 1, 2])
__pyx_t_22 = __pyx_v_i; __pyx_t_23 = 1; __pyx_t_27 = 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_23 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_27 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_27 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 165, __pyx_L1_error) } __pyx_t_28 = __pyx_v_i; __pyx_t_29 = 1; __pyx_t_30 = 2; __pyx_t_8 = -1; if (__pyx_t_28 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_29 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_29 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_30 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_30 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 165, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_22 * __pyx_v_t.strides[0]) ) + __pyx_t_23 * __pyx_v_t.strides[1]) ) + __pyx_t_27 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_28 * __pyx_v_t.strides[0]) ) + __pyx_t_29 * __pyx_v_t.strides[1]) ) + __pyx_t_30 * __pyx_v_t.strides[2]) )))));
166:
+167: 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;
+168: trans_ll_view[k-1] = bwd[k, i] + e_prob0[k, i]
__pyx_t_30 = __pyx_v_k; __pyx_t_29 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_30 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_29 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_29 >= __pyx_v_bwd.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_28 = __pyx_v_k; __pyx_t_27 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_28 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_e_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_27 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_27 >= __pyx_v_e_prob0.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_23 = (__pyx_v_k - 1); __pyx_t_14 = -1; if (__pyx_t_23 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_23 >= __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, 168, __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_bwd.data + __pyx_t_30 * __pyx_v_bwd.strides[0]) ) + __pyx_t_29 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_28 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_27 * __pyx_v_e_prob0.strides[1]) )))); }
+169: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view);
170:
171: # Do the 0 State:
+172: two_v_view[0] = bwd[0, i] + t0[i, 0, 0] + e_prob0[0, i] # Staying in 0 State
__pyx_t_27 = 0; __pyx_t_28 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_27 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_27 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_28 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_28 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 172, __pyx_L1_error) } __pyx_t_29 = __pyx_v_i; __pyx_t_30 = 0; __pyx_t_22 = 0; __pyx_t_8 = -1; if (__pyx_t_29 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_29 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_30 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_30 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_22 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 172, __pyx_L1_error) } __pyx_t_31 = 0; __pyx_t_32 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_31 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_v_e_prob0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_32 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_32 >= __pyx_v_e_prob0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 172, __pyx_L1_error) } __pyx_t_33 = 0; __pyx_t_8 = -1; if (__pyx_t_33 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_33 >= __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, 172, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_33 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_27 * __pyx_v_bwd.strides[0]) ) + __pyx_t_28 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_29 * __pyx_v_t0.strides[0]) ) + __pyx_t_30 * __pyx_v_t0.strides[1]) ) + __pyx_t_22 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_31 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_32 * __pyx_v_e_prob0.strides[1]) ))));
+173: two_v_view[1] = f_l + t0[i, 0, 1] # Going into 0 State
__pyx_t_32 = __pyx_v_i; __pyx_t_31 = 0; __pyx_t_22 = 1; __pyx_t_8 = -1; if (__pyx_t_32 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_32 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_31 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_31 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_22 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 173, __pyx_L1_error) } __pyx_t_30 = 1; __pyx_t_8 = -1; if (__pyx_t_30 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_30 >= __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, 173, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_30 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_32 * __pyx_v_t0.strides[0]) ) + __pyx_t_31 * __pyx_v_t0.strides[1]) ) + __pyx_t_22 * __pyx_v_t0.strides[2]) ))));
+174: bwd[0, i - 1] = logsumexp(two_v_view)
__pyx_t_22 = 0; __pyx_t_31 = (__pyx_v_i - 1); __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_31 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_31 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 174, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) ) + __pyx_t_31 * __pyx_v_bwd.strides[1]) )) = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_two_v_view);
175:
176: ### Do the other states
177: # Preprocessing:
+178: three_v_view[0] = e_prob0[0, i] + bwd[0, i] + t0[i, 1, 0]
__pyx_t_32 = 0; __pyx_t_29 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_32 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_32 >= __pyx_v_e_prob0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_29 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_29 >= __pyx_v_e_prob0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 178, __pyx_L1_error) } __pyx_t_28 = 0; __pyx_t_27 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_28 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_27 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_27 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 178, __pyx_L1_error) } __pyx_t_34 = __pyx_v_i; __pyx_t_35 = 1; __pyx_t_36 = 0; __pyx_t_8 = -1; if (__pyx_t_34 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_34 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_35 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_36 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_36 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 178, __pyx_L1_error) } __pyx_t_37 = 0; __pyx_t_8 = -1; if (__pyx_t_37 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_37 >= __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, 178, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_37 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_32 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_29 * __pyx_v_e_prob0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_28 * __pyx_v_bwd.strides[0]) ) + __pyx_t_27 * __pyx_v_bwd.strides[1]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_34 * __pyx_v_t0.strides[0]) ) + __pyx_t_35 * __pyx_v_t0.strides[1]) ) + __pyx_t_36 * __pyx_v_t0.strides[2]) ))));
+179: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_36 = __pyx_v_i; __pyx_t_35 = 1; __pyx_t_34 = 2; __pyx_t_8 = -1; if (__pyx_t_36 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_35 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_34 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_34 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 179, __pyx_L1_error) } __pyx_t_27 = 1; __pyx_t_8 = -1; if (__pyx_t_27 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_27 >= __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, 179, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_27 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_36 * __pyx_v_t0.strides[0]) ) + __pyx_t_35 * __pyx_v_t0.strides[1]) ) + __pyx_t_34 * __pyx_v_t0.strides[2]) ))));
180:
+181: 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;
+182: three_v_view[2] = e_prob0[j, i] + bwd[j, i] + stay
__pyx_t_34 = __pyx_v_j; __pyx_t_35 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_34 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_34 >= __pyx_v_e_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_35 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 182, __pyx_L1_error) } __pyx_t_36 = __pyx_v_j; __pyx_t_28 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_36 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_28 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_28 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 182, __pyx_L1_error) } __pyx_t_29 = 2; __pyx_t_14 = -1; if (__pyx_t_29 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_29 >= __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, 182, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_29 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_34 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_35 * __pyx_v_e_prob0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_36 * __pyx_v_bwd.strides[0]) ) + __pyx_t_28 * __pyx_v_bwd.strides[1]) )))) + __pyx_v_stay);
+183: bwd[j, i - 1] = logsumexp(three_v_view) # Fill in the backward Probability
__pyx_t_28 = __pyx_v_j; __pyx_t_36 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_28 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_36 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_36 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 183, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_28 * __pyx_v_bwd.strides[0]) ) + __pyx_t_36 * __pyx_v_bwd.strides[1]) )) = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_three_v_view); } }
184:
185: # Get total log likelihood
+186: 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;
+187: trans_ll_view1[k] = fwd[k, n_loci - 1] + bwd[k, n_loci - 1]
__pyx_t_35 = __pyx_v_k; __pyx_t_34 = (__pyx_v_n_loci - 1); __pyx_t_14 = -1; if (__pyx_t_35 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_35 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_34 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_34 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 187, __pyx_L1_error) } __pyx_t_32 = __pyx_v_k; __pyx_t_38 = (__pyx_v_n_loci - 1); __pyx_t_14 = -1; if (__pyx_t_32 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_32 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_38 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_38 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 187, __pyx_L1_error) } __pyx_t_39 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_39 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_39 >= __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, 187, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_39 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_35 * __pyx_v_fwd.strides[0]) ) + __pyx_t_34 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_32 * __pyx_v_bwd.strides[0]) ) + __pyx_t_38 * __pyx_v_bwd.strides[1]) )))); }
+188: tot_ll = logsumexp(trans_ll_view1)
__pyx_v_tot_ll = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
189:
190: # Combine the forward and backward calculations
+191: fwd1 = np.asarray(fwd, dtype=np.float) # Transform
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __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, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 191, __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, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_40 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_40) < 0) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; __pyx_t_40 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 191, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __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_40; __pyx_t_40 = 0;
+192: bwd1 = np.asarray(bwd, dtype=np.float)
__Pyx_GetModuleGlobalName(__pyx_t_40, __pyx_n_s_np); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_40, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; __pyx_t_40 = __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_40)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_40); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_40); __pyx_t_40 = 0; __pyx_t_40 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_float); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 192, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_40, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 192, __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_40); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 192, __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_40); __pyx_t_40 = 0; __pyx_v_bwd1 = __pyx_t_1; __pyx_t_1 = 0;
+193: post = fwd1 + bwd1 - np.float(tot_ll)
__pyx_t_1 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_float); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_40 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __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_40)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyNumber_Subtract(__pyx_t_1, __pyx_t_40); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_2); __pyx_t_2 = 0;
194:
+195: print("Memory Usage Full:")
__pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* … */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Memory_Usage_Full); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 195, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8);
+196: print_memory_usage() ## For MEMORY_BENCH
__Pyx_GetModuleGlobalName(__pyx_t_40, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 196, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_40))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_40); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_40); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_40, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_CallOneArg(__pyx_t_40, __pyx_t_1) : __Pyx_PyObject_CallNoArg(__pyx_t_40); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 196, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+197: 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, 197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_40 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_40); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; __pyx_t_40 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 197, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0;
198:
+199: if full==False:
__pyx_t_40 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_40); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 199, __pyx_L1_error) __pyx_t_41 = __Pyx_PyObject_IsTrue(__pyx_t_40); if (unlikely(__pyx_t_41 < 0)) __PYX_ERR(0, 199, __pyx_L1_error) __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; if (__pyx_t_41) { /* … */ }
+200: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
201:
+202: elif full==True: # Return everything
__pyx_t_40 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_40); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 202, __pyx_L1_error) __pyx_t_41 = __Pyx_PyObject_IsTrue(__pyx_t_40); if (unlikely(__pyx_t_41 < 0)) __PYX_ERR(0, 202, __pyx_L1_error) __Pyx_DECREF(__pyx_t_40); __pyx_t_40 = 0; if (__pyx_t_41) { /* … */ }
+203: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_40 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_40)) __PYX_ERR(0, 203, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_40); __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 203, __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_GIVEREF(__pyx_t_40); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_t_40); __pyx_t_40 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0;
204:
205:
+206: def fwd_bkwd_lowmem(double[:, :] e_prob0, double[:, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_8hapsburg_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_8hapsburg_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.\n Input:\n Emission probabilities [k x l] (log space) (log space)\n Transition probabilities (infinitesimal) [k x k] (normal space)\n Initialized fwd and bwd probabilities [k x l] (log space)\n t: Transition Matrix: [l x 3 x 3] (normal space)\n full: Boolean whether to return everything"; static PyMethodDef __pyx_mdef_8hapsburg_5cfunc_7fwd_bkwd_lowmem = {"fwd_bkwd_lowmem", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8hapsburg_5cfunc_7fwd_bkwd_lowmem, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8hapsburg_5cfunc_6fwd_bkwd_lowmem}; static PyObject *__pyx_pw_8hapsburg_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_prob0 = { 0, 0, { 0 }, { 0 }, { 0 } }; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_lowmem (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_prob0,&__pyx_n_s_t_mat,&__pyx_n_s_t,&__pyx_n_s_in_val,&__pyx_n_s_full,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_8hapsburg_5cfunc_6fwd_bkwd_lowmem(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_prob0, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t_mat, __Pyx_memviewslice __pyx_v_t, double __pyx_v_in_val, PyObject *__pyx_v_full) { 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 } }; 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_AddTraceback("hapsburg.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_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_prob0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__33 = PyTuple_Pack(30, __pyx_n_s_e_prob0, __pyx_n_s_t_mat, __pyx_n_s_t, __pyx_n_s_in_val, __pyx_n_s_full, __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_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__33)) __PYX_ERR(0, 206, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__33); __Pyx_GIVEREF(__pyx_tuple__33); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8hapsburg_5cfunc_7fwd_bkwd_lowmem, NULL, __pyx_n_s_hapsburg_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 206, __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, 206, __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_hapsburg_cfunc_pyx, __pyx_n_s_fwd_bkwd_lowmem, 206, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 206, __pyx_L1_error)
+207: double[:, :, :] t, double in_val = 1e-4, full=False):
values[4] = ((PyObject *)Py_False); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 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_prob0)) != 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, 3, 5, 1); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 3, 5, 2); __PYX_ERR(0, 206, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); 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_full); 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, 206, __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); 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_prob0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_prob0.memview)) __PYX_ERR(0, 206, __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, 206, __pyx_L3_error) __pyx_v_t = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t.memview)) __PYX_ERR(0, 207, __pyx_L3_error) if (values[3]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 207, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 206, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("hapsburg.cfunc.fwd_bkwd_lowmem", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_8hapsburg_5cfunc_6fwd_bkwd_lowmem(__pyx_self, __pyx_v_e_prob0, __pyx_v_t_mat, __pyx_v_t, __pyx_v_in_val, __pyx_v_full);
208: """Takes emission and transition probabilities, and calculates posteriors.
209: Uses speed-up specific for Genotype data (pooling same transition rates)
210: Low-Mem: Do no save the full FWD BWD and Posterior. Use temporary
211: Arrays for saving.
212: Input:
213: Emission probabilities [k x l] (log space) (log space)
214: Transition probabilities (infinitesimal) [k x k] (normal space)
215: Initialized fwd and bwd probabilities [k x l] (log space)
216: t: Transition Matrix: [l x 3 x 3] (normal space)
217: full: Boolean whether to return everything"""
+218: cdef int n_states = e_prob0.shape[0]
__pyx_v_n_states = (__pyx_v_e_prob0.shape[0]);
+219: cdef int n_loci = e_prob0.shape[1]
__pyx_v_n_loci = (__pyx_v_e_prob0.shape[1]);
220: cdef Py_ssize_t i, j, k # The Array Indices
221: cdef double stay # The Probablility of Staying
222: cdef double tot_ll # The total Likelihood (need for Posterior)
223:
224: # Initialize Posterior and Transition Probabilities
+225: 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, 225, __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, 225, __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, 225, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 225, __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, 225, __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, 225, __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, 225, __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, 225, __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;
+226: 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, 226, __pyx_L1_error) __pyx_v_post_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
227:
+228: 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, 228, __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, 228, __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, 228, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 228, __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, 228, __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, 228, __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, 228, __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, 228, __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;
+229: 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, 229, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
230:
+231: 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, 231, __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, 231, __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, 231, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 231, __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, 231, __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, 231, __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, 231, __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, 231, __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;
+232: 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, 232, __pyx_L1_error) __pyx_v_trans_ll_view1 = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
233:
+234: 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, 234, __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, 234, __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, 234, __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, 234, __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, 234, __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, 234, __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;
+235: 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, 235, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
236:
+237: 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, 237, __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, 237, __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, 237, __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, 237, __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, 237, __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, 237, __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;
+238: 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, 238, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
239:
240: # Do transform to Log Space:
+241: cdef double[:,:,:] t0 = np.log(t) # Do log of recombination Map
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __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, 241, __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, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __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, 241, __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, 241, __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;
242:
243: ### Initialize FWD BWD Arrays
+244: fwd0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 244, __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, 244, __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, 244, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __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, 244, __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, 244, __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, 244, __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, 244, __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_fwd0 = __pyx_t_4; __pyx_t_4 = 0;
+245: fwd0[:] = np.log(in_val) # Initial Probabilities
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __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, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __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_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __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_4)) __PYX_ERR(0, 245, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 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, 245, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+246: fwd0[0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 246, __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_4 = (__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_4)) __PYX_ERR(0, 246, __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, 246, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+247: 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, 247, __pyx_L1_error) __pyx_v_fwd = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
248:
+249: bwd0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __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, 249, __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, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __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_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, 249, __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, 249, __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, 249, __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, 249, __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_bwd0 = __pyx_t_1; __pyx_t_1 = 0;
+250: bwd0[:] = np.log(in_val)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 250, __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, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __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, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __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_1)) __PYX_ERR(0, 250, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__Pyx_PyObject_SetSlice(__pyx_v_bwd0, __pyx_t_1, 0, 0, NULL, NULL, &__pyx_slice__3, 0, 0, 0) < 0) __PYX_ERR(0, 250, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+251: bwd0[0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 251, __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, 251, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 251, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __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_1 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 251, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(__Pyx_SetItemInt(__pyx_v_bwd0, 0, __pyx_t_1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 251, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+252: 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, 252, __pyx_L1_error) __pyx_v_bwd = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
253:
+254: tmp0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 254, __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, 254, __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, 254, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 254, __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, 254, __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, 254, __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, 254, __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, 254, __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_tmp0 = __pyx_t_2; __pyx_t_2 = 0;
+255: 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, 255, __pyx_L1_error) __pyx_v_tmp = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
256:
257: #############################
258: ### Do the Forward Algorithm
259:
+260: post_view[0] = fwd[0] # Add to first locus 0 Posterior
__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_fwd.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 260, __pyx_L1_error) } __pyx_t_9 = 0; __pyx_t_8 = -1; if (__pyx_t_9 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_9 >= __pyx_v_post_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 260, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_9 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_7 * __pyx_v_fwd.strides[0]) )));
+261: for i in range(1, n_loci): # Run forward recursion
__pyx_t_8 = __pyx_v_n_loci; __pyx_t_10 = __pyx_t_8; for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { __pyx_v_i = __pyx_t_11;
+262: stay = log(t[i, 1, 1] - t[i, 1, 2]) # Do the log of the Stay term
__pyx_t_7 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_13 = 1; __pyx_t_14 = -1; if (__pyx_t_7 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1; if (__pyx_t_13 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 262, __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.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 262, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_7 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_13 * __pyx_v_t.strides[2]) ))) - (*((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_17 * __pyx_v_t.strides[2]) )))));
263:
+264: 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;
+265: 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, 265, __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, 265, __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]) ))); }
+266: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view);
267:
268: # Do the 0 State:
+269: 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, 269, __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, 269, __pyx_L1_error) } __pyx_t_7 = 0; __pyx_t_14 = -1; if (__pyx_t_7 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_7 >= __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, 269, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_7 * __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_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) ))));
+270: 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, 270, __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, 270, __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]) ))));
+271: tmp[0] = e_prob0[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_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 271, __pyx_L1_error) } __pyx_t_12 = 0; __pyx_t_14 = -1; if (__pyx_t_12 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 271, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_12 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_15 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_prob0.strides[1]) ))) + __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_two_v_view));
272:
273: ### Do the other states
274: # Preprocessing:
+275: three_v_view[0] = fwd[0] + t0[i, 0, 1] # Coming from 0 State
__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, 275, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_21 = 0; __pyx_t_22 = 1; __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_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_22 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 275, __pyx_L1_error) } __pyx_t_23 = 0; __pyx_t_14 = -1; if (__pyx_t_23 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_23 >= __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, 275, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_23 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_21 * __pyx_v_t0.strides[1]) ) + __pyx_t_22 * __pyx_v_t0.strides[2]) ))));
+276: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_22 = __pyx_v_i; __pyx_t_21 = 1; __pyx_t_15 = 2; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __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, 276, __pyx_L1_error) } __pyx_t_13 = 1; __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, 276, __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_22 * __pyx_v_t0.strides[0]) ) + __pyx_t_21 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
277:
+278: 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;
+279: three_v_view[2] = fwd[j] + stay
__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_fwd.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 279, __pyx_L1_error) } __pyx_t_21 = 2; __pyx_t_20 = -1; if (__pyx_t_21 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_21 >= __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, 279, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_21 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ))) + __pyx_v_stay);
+280: tmp[j] = e_prob0[j, i] + logsumexp(three_v_view)
__pyx_t_15 = __pyx_v_j; __pyx_t_22 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_15 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_prob0.shape[0])) __pyx_t_20 = 0; if (__pyx_t_22 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_prob0.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 280, __pyx_L1_error) } __pyx_t_24 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_24 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_24 >= __pyx_v_tmp.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 280, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_24 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_15 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_22 * __pyx_v_e_prob0.strides[1]) ))) + __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_three_v_view)); }
281:
282: ### Make tmp new fwd vec:
+283: 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;
+284: fwd[j] = tmp[j]
__pyx_t_22 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_22 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_tmp.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_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_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) } *((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_22 * __pyx_v_tmp.strides[0]) ))); }
+285: post_view[i] = fwd[0] # Add to 0-State Posterior
__pyx_t_22 = 0; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 285, __pyx_L1_error) } __pyx_t_25 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_25 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_post_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 285, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_25 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_22 * __pyx_v_fwd.strides[0]) ))); }
286:
287: ### Get total log likelihood
+288: for k in range(n_states): # Simply sum the two 1D arrays
__pyx_t_8 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_8; for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { __pyx_v_k = __pyx_t_11;
+289: trans_ll_view1[k] = fwd[k] + bwd[k]
__pyx_t_22 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 289, __pyx_L1_error) } __pyx_t_26 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_26 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 289, __pyx_L1_error) } __pyx_t_27 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_27 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_27 >= __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, 289, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_27 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_22 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_26 * __pyx_v_bwd.strides[0]) )))); }
+290: tot_ll = logsumexp(trans_ll_view1)
__pyx_v_tot_ll = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
291:
292: #############################
293: ### Do the Backward Algorithm
294: ## last0-State Posterior
+295: post_view[n_loci-1] = post_view[n_loci-1] + bwd[0] - tot_ll
__pyx_t_26 = (__pyx_v_n_loci - 1); __pyx_t_8 = -1; if (__pyx_t_26 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_post_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 295, __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_bwd.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 295, __pyx_L1_error) } __pyx_t_28 = (__pyx_v_n_loci - 1); __pyx_t_8 = -1; if (__pyx_t_28 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_post_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 295, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_28 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_26 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll);
296:
+297: for i in range(n_loci-1, 0, -1): # Run 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;
+298: stay = log(t[i, 1, 1] - t[i, 1, 2])
__pyx_t_22 = __pyx_v_i; __pyx_t_26 = 1; __pyx_t_29 = 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_26 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_26 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_29 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_29 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 298, __pyx_L1_error) } __pyx_t_30 = __pyx_v_i; __pyx_t_31 = 1; __pyx_t_32 = 2; __pyx_t_8 = -1; if (__pyx_t_30 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_31 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_31 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_32 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_32 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 298, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_22 * __pyx_v_t.strides[0]) ) + __pyx_t_26 * __pyx_v_t.strides[1]) ) + __pyx_t_29 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_30 * __pyx_v_t.strides[0]) ) + __pyx_t_31 * __pyx_v_t.strides[1]) ) + __pyx_t_32 * __pyx_v_t.strides[2]) )))));
299:
+300: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_8 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_10; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+301: trans_ll_view[k-1] = bwd[k] + e_prob0[k, i]
__pyx_t_32 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_32 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_32 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 301, __pyx_L1_error) } __pyx_t_31 = __pyx_v_k; __pyx_t_30 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_31 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_v_e_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_30 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_30 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 301, __pyx_L1_error) } __pyx_t_29 = (__pyx_v_k - 1); __pyx_t_14 = -1; if (__pyx_t_29 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_29 >= __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, 301, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_29 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_32 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_31 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_30 * __pyx_v_e_prob0.strides[1]) )))); }
+302: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_trans_ll_view);
303:
304: # Do the 0 State:
+305: two_v_view[0] = bwd[0] + t0[i, 0, 0] + e_prob0[0, i] # Staying in 0 State
__pyx_t_30 = 0; __pyx_t_8 = -1; if (__pyx_t_30 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 305, __pyx_L1_error) } __pyx_t_31 = __pyx_v_i; __pyx_t_32 = 0; __pyx_t_26 = 0; __pyx_t_8 = -1; if (__pyx_t_31 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_32 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_32 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_26 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_26 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 305, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_33 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_prob0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_33 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_33 >= __pyx_v_e_prob0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 305, __pyx_L1_error) } __pyx_t_34 = 0; __pyx_t_8 = -1; if (__pyx_t_34 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_34 >= __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, 305, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_34 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_30 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_31 * __pyx_v_t0.strides[0]) ) + __pyx_t_32 * __pyx_v_t0.strides[1]) ) + __pyx_t_26 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_22 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_33 * __pyx_v_e_prob0.strides[1]) ))));
+306: two_v_view[1] = f_l + t0[i, 0, 1] # Going into 0 State
__pyx_t_33 = __pyx_v_i; __pyx_t_22 = 0; __pyx_t_26 = 1; __pyx_t_8 = -1; if (__pyx_t_33 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_33 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_22 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_26 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_26 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 306, __pyx_L1_error) } __pyx_t_32 = 1; __pyx_t_8 = -1; if (__pyx_t_32 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_32 >= __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, 306, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_32 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_33 * __pyx_v_t0.strides[0]) ) + __pyx_t_22 * __pyx_v_t0.strides[1]) ) + __pyx_t_26 * __pyx_v_t0.strides[2]) ))));
+307: tmp[0] = logsumexp(two_v_view)
__pyx_t_26 = 0; __pyx_t_8 = -1; if (__pyx_t_26 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_tmp.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 307, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_26 * __pyx_v_tmp.strides[0]) )) = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_two_v_view);
308:
309: ### Do the other states
310: # Preprocessing:
+311: three_v_view[0] = e_prob0[0, i] + bwd[0] + t0[i, 1, 0]
__pyx_t_22 = 0; __pyx_t_33 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_prob0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_33 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_33 >= __pyx_v_e_prob0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 311, __pyx_L1_error) } __pyx_t_31 = 0; __pyx_t_8 = -1; if (__pyx_t_31 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 311, __pyx_L1_error) } __pyx_t_30 = __pyx_v_i; __pyx_t_35 = 1; __pyx_t_36 = 0; __pyx_t_8 = -1; if (__pyx_t_30 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_35 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_36 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_36 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 311, __pyx_L1_error) } __pyx_t_37 = 0; __pyx_t_8 = -1; if (__pyx_t_37 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_37 >= __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, 311, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_37 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_22 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_33 * __pyx_v_e_prob0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_31 * __pyx_v_bwd.strides[0]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_30 * __pyx_v_t0.strides[0]) ) + __pyx_t_35 * __pyx_v_t0.strides[1]) ) + __pyx_t_36 * __pyx_v_t0.strides[2]) ))));
+312: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_36 = __pyx_v_i; __pyx_t_35 = 1; __pyx_t_30 = 2; __pyx_t_8 = -1; if (__pyx_t_36 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_35 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_30 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_30 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 312, __pyx_L1_error) } __pyx_t_31 = 1; __pyx_t_8 = -1; if (__pyx_t_31 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_31 >= __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, 312, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_31 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_36 * __pyx_v_t0.strides[0]) ) + __pyx_t_35 * __pyx_v_t0.strides[1]) ) + __pyx_t_30 * __pyx_v_t0.strides[2]) ))));
313:
+314: for j in range(1, n_states): # Do the final run over all states
__pyx_t_8 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_10; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+315: three_v_view[2] = e_prob0[j, i] + bwd[j] + stay
__pyx_t_30 = __pyx_v_j; __pyx_t_35 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_30 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_e_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_35 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_35 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 315, __pyx_L1_error) } __pyx_t_36 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_36 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 315, __pyx_L1_error) } __pyx_t_33 = 2; __pyx_t_14 = -1; if (__pyx_t_33 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_33 >= __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, 315, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_33 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_30 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_35 * __pyx_v_e_prob0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_36 * __pyx_v_bwd.strides[0]) )))) + __pyx_v_stay);
+316: tmp[j] = logsumexp(three_v_view) # Fill in the backward Probability
__pyx_t_36 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_36 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 316, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_36 * __pyx_v_tmp.strides[0]) )) = __pyx_f_8hapsburg_5cfunc_logsumexp(__pyx_v_three_v_view); }
317:
318: ### Make tmp new bwd vec:
+319: for j in range(0, n_states):
__pyx_t_8 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_8; for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_10; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+320: bwd[j] = tmp[j]
__pyx_t_35 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_35 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_35 >= __pyx_v_tmp.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_30 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_30 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_30 >= __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) } *((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_30 * __pyx_v_bwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_35 * __pyx_v_tmp.strides[0]) ))); }
321:
322: ### Finalize the 0 Posterior
+323: post_view[i-1] = post_view[i-1] + bwd[0] - tot_ll
__pyx_t_35 = (__pyx_v_i - 1); __pyx_t_8 = -1; if (__pyx_t_35 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_35 >= __pyx_v_post_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 323, __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_bwd.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 323, __pyx_L1_error) } __pyx_t_38 = (__pyx_v_i - 1); __pyx_t_8 = -1; if (__pyx_t_38 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_38 >= __pyx_v_post_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 323, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_38 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_35 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll); }
324:
+325: 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, 325, __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, 325, __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, 325, __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, 325, __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;
+326: 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, 326, __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, 326, __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;
327:
+328: 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, 328, __pyx_L1_error) __pyx_t_39 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_39 < 0)) __PYX_ERR(0, 328, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_39) { /* … */ }
+329: 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, 329, __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, 329, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9);
330:
+331: 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, 331, __pyx_L1_error) __pyx_t_39 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_39 < 0)) __PYX_ERR(0, 331, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_39) { /* … */ }
+332: 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, 332, __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, 332, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 332, __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;
333:
334:
+335: def viterbi_path(double[:, :] e_prob0, double[:, :, :] t_mat0, double[:] end_p0):
/* Python wrapper */ static PyObject *__pyx_pw_8hapsburg_5cfunc_9viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_8hapsburg_5cfunc_8viterbi_path[] = "Implementation of a Viterbi Path.\n e_prob0 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_8hapsburg_5cfunc_9viterbi_path = {"viterbi_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_8hapsburg_5cfunc_9viterbi_path, METH_VARARGS|METH_KEYWORDS, __pyx_doc_8hapsburg_5cfunc_8viterbi_path}; static PyObject *__pyx_pw_8hapsburg_5cfunc_9viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_prob0 = { 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_prob0,&__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_prob0)) != 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, 335, __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, 335, __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, 335, __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_prob0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_prob0.memview)) __PYX_ERR(0, 335, __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, 335, __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, 335, __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, 335, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("hapsburg.cfunc.viterbi_path", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_8hapsburg_5cfunc_8viterbi_path(__pyx_self, __pyx_v_e_prob0, __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_8hapsburg_5cfunc_8viterbi_path(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_prob0, __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_XDECREF(__pyx_t_5); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1); __Pyx_AddTraceback("hapsburg.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_prob0, 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__35 = PyTuple_Pack(25, __pyx_n_s_e_prob0, __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__35)) __PYX_ERR(0, 335, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__35); __Pyx_GIVEREF(__pyx_tuple__35); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_8hapsburg_5cfunc_9viterbi_path, NULL, __pyx_n_s_hapsburg_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 335, __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, 335, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(3, 0, 25, 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_hapsburg_cfunc_pyx, __pyx_n_s_viterbi_path, 335, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 335, __pyx_L1_error)
336: """Implementation of a Viterbi Path.
337: e_prob0 Matrices with Emission Probabilities, [k,l] (log space)
338: t_mat: Transition Matrix: [l x 3 x 3] (normal space)
339: end_p: probability to begin/end in states [k]"""
+340: cdef int n_states = e_prob0.shape[0]
__pyx_v_n_states = (__pyx_v_e_prob0.shape[0]);
+341: cdef int n_loci = e_prob0.shape[1]
__pyx_v_n_loci = (__pyx_v_e_prob0.shape[1]);
342: cdef Py_ssize_t i, j, k # The Array Indices
343: cdef int m # Placeholder for Maximum
344: cdef double v # Value to set
345:
346: # Do the actual optimization (with back-tracking)
347: # Initialize Views:
+348: cdef double[:, :] mp = np.empty((n_states, n_loci), dtype=np.float)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __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, 348, __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, 348, __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, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 348, __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, 348, __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, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_5, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 348, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_mp = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
+349: cdef double[:] new_p = np.empty(n_states, dtype = np.float) # Temporary Array
__Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_float); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 349, __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_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __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_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_new_p = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
+350: cdef long[:,:] pt = np.empty((n_states, n_loci), dtype = np.int) # Previous State Pointer
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __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, 350, __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, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 350, __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, 350, __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, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_int); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_long(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_pt = __pyx_t_8; __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
351:
+352: trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __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, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 352, __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, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_trans_ll = __pyx_t_5; __pyx_t_5 = 0;
+353: cdef double[:] trans_ll_view = trans_ll
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 353, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
354:
+355: three_v = np.empty(3, dtype=DTYPE) # Array of size three
__Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 355, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 355, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 355, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 355, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 355, __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_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 355, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_three_v = __pyx_t_3; __pyx_t_3 = 0;
+356: cdef double[:] three_v_view = three_v
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 356, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
357:
+358: 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, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 358, __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, 358, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_tuple_, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 358, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_three_vi = __pyx_t_2; __pyx_t_2 = 0;
+359: 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, 359, __pyx_L1_error) __pyx_v_three_vi_view = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
360:
+361: two_v = np.empty(2, dtype=DTYPE) # Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_5) < 0) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__2, __pyx_t_2); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 361, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_two_v = __pyx_t_5; __pyx_t_5 = 0;
+362: cdef double[:] two_v_view = two_v
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 362, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
363:
+364: two_vi = np.empty(2, dtype=int) # Int Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_np); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 364, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 364, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 364, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); if (PyDict_SetItem(__pyx_t_5, __pyx_n_s_dtype, ((PyObject *)(&PyInt_Type))) < 0) __PYX_ERR(0, 364, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__2, __pyx_t_5); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 364, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_v_two_vi = __pyx_t_3; __pyx_t_3 = 0;
+365: 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, 365, __pyx_L1_error) __pyx_v_two_vi_view = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
366:
+367: 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;
+368: 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, 368, __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, 368, __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]) )));
369:
+370: 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, 370, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_13 * __pyx_v_two_vi_view.strides[0]) )) = 0;
+371: three_vi_view[0] = 0
__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_three_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 371, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_17 * __pyx_v_three_vi_view.strides[0]) )) = 0; }
372:
+373: 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;
374: ### Precomputation:
375: # Do the maximal log probability of 1, ...k State:
+376: m = argmax(mp[1:, i - 1])
__pyx_t_7.data = __pyx_v_mp.data; __pyx_t_7.memview = __pyx_v_mp.memview; __PYX_INC_MEMVIEW(&__pyx_t_7, 0); __pyx_t_14 = -1; if (unlikely(__pyx_memoryview_slice_memviewslice( &__pyx_t_7, __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, 376, __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, 376, __pyx_L1_error) } __pyx_t_7.data += __pyx_tmp_idx * __pyx_tmp_stride; } __pyx_v_m = __pyx_f_8hapsburg_5cfunc_argmax(__pyx_t_7); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
+377: v = mp[m+1, i - 1]
__pyx_t_18 = (__pyx_v_m + 1); __pyx_t_19 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_19 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_19 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 377, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_18 * __pyx_v_mp.strides[0]) ) + __pyx_t_19 * __pyx_v_mp.strides[1]) )));
378:
379: # Do the States from collapsed states
+380: two_vi_view[1] = m+1 # Set the Pointers
__pyx_t_19 = 1; __pyx_t_14 = -1; if (__pyx_t_19 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_19 >= __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, 380, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_19 * __pyx_v_two_vi_view.strides[0]) )) = (__pyx_v_m + 1);
+381: three_vi_view[1] = m+1
__pyx_t_18 = 1; __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __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, 381, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_18 * __pyx_v_three_vi_view.strides[0]) )) = (__pyx_v_m + 1);
382:
+383: two_v_view[1] = v + t_mat0[i, 1, 0]
__pyx_t_20 = __pyx_v_i; __pyx_t_21 = 1; __pyx_t_22 = 0; __pyx_t_14 = -1; if (__pyx_t_20 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_22 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 383, __pyx_L1_error) } __pyx_t_23 = 1; __pyx_t_14 = -1; if (__pyx_t_23 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_23 >= __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, 383, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_23 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_20 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_22 * __pyx_v_t_mat0.strides[2]) ))));
+384: three_v_view[1] = v + t_mat0[i, 1, 2] # Move in from other ROH
__pyx_t_22 = __pyx_v_i; __pyx_t_21 = 1; __pyx_t_20 = 2; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_20 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_20 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 384, __pyx_L1_error) } __pyx_t_24 = 1; __pyx_t_14 = -1; if (__pyx_t_24 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_24 >= __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, 384, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_24 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_22 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_20 * __pyx_v_t_mat0.strides[2]) ))));
385:
386: ### Do the zero State
+387: two_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 0]
__pyx_t_20 = 0; __pyx_t_21 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_20 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 387, __pyx_L1_error) } __pyx_t_22 = __pyx_v_i; __pyx_t_25 = 0; __pyx_t_26 = 0; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_25 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_25 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_26 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_26 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 387, __pyx_L1_error) } __pyx_t_27 = 0; __pyx_t_14 = -1; if (__pyx_t_27 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_27 >= __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, 387, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_27 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_20 * __pyx_v_mp.strides[0]) ) + __pyx_t_21 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_22 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_25 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_26 * __pyx_v_t_mat0.strides[2]) ))));
388:
+389: m = argmax(two_v_view) ### Do a Maximum
__pyx_v_m = __pyx_f_8hapsburg_5cfunc_argmax(__pyx_v_two_v_view);
+390: v = two_v_view[m]
__pyx_t_26 = __pyx_v_m; __pyx_t_14 = -1; if (__pyx_t_26 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_26 >= __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, 390, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_26 * __pyx_v_two_v_view.strides[0]) )));
+391: mp[0, i] = v + e_prob0[0, i] ### Set Max. Probability
__pyx_t_26 = 0; __pyx_t_25 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_26 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_e_prob0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_25 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_25 >= __pyx_v_e_prob0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 391, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_21 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_21 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 391, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_22 * __pyx_v_mp.strides[0]) ) + __pyx_t_21 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_26 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_25 * __pyx_v_e_prob0.strides[1]) ))));
+392: pt[0, i] = two_vi_view[m] ### Set Pointer for Backtrace
__pyx_t_25 = __pyx_v_m; __pyx_t_14 = -1; if (__pyx_t_25 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_25 >= __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, 392, __pyx_L1_error) } __pyx_t_26 = 0; __pyx_t_20 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_26 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_pt.shape[0])) __pyx_t_14 = 0; if (__pyx_t_20 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_20 >= __pyx_v_pt.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 392, __pyx_L1_error) } *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_26 * __pyx_v_pt.strides[0]) ) + __pyx_t_20 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_25 * __pyx_v_two_vi_view.strides[0]) )));
393:
394: ### Do the other States
+395: three_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 1] # Move from 0 State
__pyx_t_25 = 0; __pyx_t_28 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_25 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_28 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_28 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 395, __pyx_L1_error) } __pyx_t_29 = __pyx_v_i; __pyx_t_30 = 0; __pyx_t_31 = 1; __pyx_t_14 = -1; if (__pyx_t_29 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_29 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_30 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_30 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_31 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_31 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 395, __pyx_L1_error) } __pyx_t_32 = 0; __pyx_t_14 = -1; if (__pyx_t_32 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_32 >= __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, 395, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_32 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_25 * __pyx_v_mp.strides[0]) ) + __pyx_t_28 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_29 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_30 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_31 * __pyx_v_t_mat0.strides[2]) ))));
396:
+397: for k in range(1, n_states): # Find Maximum
__pyx_t_14 = __pyx_v_n_states; __pyx_t_33 = __pyx_t_14; for (__pyx_t_34 = 1; __pyx_t_34 < __pyx_t_33; __pyx_t_34+=1) { __pyx_v_k = __pyx_t_34;
+398: three_v_view[2] = mp[k, i - 1] + t_mat0[i, 1, 1] # The Stay State
__pyx_t_31 = __pyx_v_k; __pyx_t_30 = (__pyx_v_i - 1); __pyx_t_35 = -1; if (__pyx_t_31 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_31 >= __pyx_v_mp.shape[0])) __pyx_t_35 = 0; if (__pyx_t_30 < 0) { __pyx_t_35 = 1; } else if (unlikely(__pyx_t_30 >= __pyx_v_mp.shape[1])) __pyx_t_35 = 1; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 398, __pyx_L1_error) } __pyx_t_29 = __pyx_v_i; __pyx_t_28 = 1; __pyx_t_25 = 1; __pyx_t_35 = -1; if (__pyx_t_29 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_29 >= __pyx_v_t_mat0.shape[0])) __pyx_t_35 = 0; if (__pyx_t_28 < 0) { __pyx_t_35 = 1; } else if (unlikely(__pyx_t_28 >= __pyx_v_t_mat0.shape[1])) __pyx_t_35 = 1; if (__pyx_t_25 < 0) { __pyx_t_35 = 2; } else if (unlikely(__pyx_t_25 >= __pyx_v_t_mat0.shape[2])) __pyx_t_35 = 2; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 398, __pyx_L1_error) } __pyx_t_36 = 2; __pyx_t_35 = -1; if (__pyx_t_36 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_36 >= __pyx_v_three_v_view.shape[0])) __pyx_t_35 = 0; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 398, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_36 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_31 * __pyx_v_mp.strides[0]) ) + __pyx_t_30 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_29 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_28 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_25 * __pyx_v_t_mat0.strides[2]) ))));
+399: three_vi_view[2] = k
__pyx_t_25 = 2; __pyx_t_35 = -1; if (__pyx_t_25 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_35 = 0; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 399, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_25 * __pyx_v_three_vi_view.strides[0]) )) = __pyx_v_k;
400:
+401: m = argmax(three_v_view) ### Do a Maximum
__pyx_v_m = __pyx_f_8hapsburg_5cfunc_argmax(__pyx_v_three_v_view);
+402: v = three_v_view[m]
__pyx_t_28 = __pyx_v_m; __pyx_t_35 = -1; if (__pyx_t_28 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_three_v_view.shape[0])) __pyx_t_35 = 0; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 402, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_28 * __pyx_v_three_v_view.strides[0]) )));
403:
+404: mp[k, i] = v + e_prob0[k, i] ### Set Max. Probability
__pyx_t_28 = __pyx_v_k; __pyx_t_29 = __pyx_v_i; __pyx_t_35 = -1; if (__pyx_t_28 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_e_prob0.shape[0])) __pyx_t_35 = 0; if (__pyx_t_29 < 0) { __pyx_t_35 = 1; } else if (unlikely(__pyx_t_29 >= __pyx_v_e_prob0.shape[1])) __pyx_t_35 = 1; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 404, __pyx_L1_error) } __pyx_t_30 = __pyx_v_k; __pyx_t_31 = __pyx_v_i; __pyx_t_35 = -1; if (__pyx_t_30 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_30 >= __pyx_v_mp.shape[0])) __pyx_t_35 = 0; if (__pyx_t_31 < 0) { __pyx_t_35 = 1; } else if (unlikely(__pyx_t_31 >= __pyx_v_mp.shape[1])) __pyx_t_35 = 1; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 404, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_30 * __pyx_v_mp.strides[0]) ) + __pyx_t_31 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_prob0.data + __pyx_t_28 * __pyx_v_e_prob0.strides[0]) ) + __pyx_t_29 * __pyx_v_e_prob0.strides[1]) ))));
+405: pt[k, i] = three_vi_view[m] ### Set Pointer for Backtrace
__pyx_t_29 = __pyx_v_m; __pyx_t_35 = -1; if (__pyx_t_29 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_29 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_35 = 0; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 405, __pyx_L1_error) } __pyx_t_28 = __pyx_v_k; __pyx_t_37 = __pyx_v_i; __pyx_t_35 = -1; if (__pyx_t_28 < 0) { __pyx_t_35 = 0; } else if (unlikely(__pyx_t_28 >= __pyx_v_pt.shape[0])) __pyx_t_35 = 0; if (__pyx_t_37 < 0) { __pyx_t_35 = 1; } else if (unlikely(__pyx_t_37 >= __pyx_v_pt.shape[1])) __pyx_t_35 = 1; if (unlikely(__pyx_t_35 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_35); __PYX_ERR(0, 405, __pyx_L1_error) } *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_28 * __pyx_v_pt.strides[0]) ) + __pyx_t_37 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_29 * __pyx_v_three_vi_view.strides[0]) ))); } }
406:
407: ### Do the trace back
+408: cdef long[:] path = -np.ones(n_loci, dtype=np.int) # Initialize
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __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, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 408, __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, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Negative(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_t_3, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 408, __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;
409:
+410: x = np.argmax(mp[:, n_loci-1]) # The highest probability
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 410, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_argmax); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 410, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_7.data = __pyx_v_mp.data; __pyx_t_7.memview = __pyx_v_mp.memview; __PYX_INC_MEMVIEW(&__pyx_t_7, 0); __pyx_t_7.shape[0] = __pyx_v_mp.shape[0]; __pyx_t_7.strides[0] = __pyx_v_mp.strides[0]; __pyx_t_7.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, 410, __pyx_L1_error) } __pyx_t_7.data += __pyx_tmp_idx * __pyx_tmp_stride; } __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_t_7, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 410, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 410, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_x = __pyx_t_3; __pyx_t_3 = 0;
+411: path[n_loci-1] = x
__pyx_t_38 = __Pyx_PyInt_As_long(__pyx_v_x); if (unlikely((__pyx_t_38 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 411, __pyx_L1_error) __pyx_t_29 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_29 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_29 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 411, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_29 * __pyx_v_path.strides[0]) )) = __pyx_t_38;
412:
+413: 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;
414: # Always th pointer to the previous path
+415: path[i - 1] = pt[path[i], i]
__pyx_t_39 = __pyx_v_i; __pyx_t_10 = -1; if (__pyx_t_39 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_39 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 415, __pyx_L1_error) } __pyx_t_40 = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_39 * __pyx_v_path.strides[0]) ))); __pyx_t_41 = __pyx_v_i; __pyx_t_10 = -1; if (__pyx_t_40 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_40 >= __pyx_v_pt.shape[0])) __pyx_t_10 = 0; if (__pyx_t_41 < 0) { __pyx_t_10 = 1; } else if (unlikely(__pyx_t_41 >= __pyx_v_pt.shape[1])) __pyx_t_10 = 1; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 415, __pyx_L1_error) } __pyx_t_42 = (__pyx_v_i - 1); __pyx_t_10 = -1; if (__pyx_t_42 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_42 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 415, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_42 * __pyx_v_path.strides[0]) )) = (*((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_40 * __pyx_v_pt.strides[0]) ) + __pyx_t_41 * __pyx_v_pt.strides[1]) ))); }
416:
+417: m = path[n_loci-1]
__pyx_t_39 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_39 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_39 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 417, __pyx_L1_error) } __pyx_v_m = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_39 * __pyx_v_path.strides[0]) )));
+418: print(f"Log likelihood Path: {mp[m,n_loci-1]:.3f}")
__pyx_t_39 = __pyx_v_m; __pyx_t_41 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_39 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_39 >= __pyx_v_mp.shape[0])) __pyx_t_10 = 0; if (__pyx_t_41 < 0) { __pyx_t_10 = 1; } else if (unlikely(__pyx_t_41 >= __pyx_v_mp.shape[1])) __pyx_t_10 = 1; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 418, __pyx_L1_error) } __pyx_t_3 = PyFloat_FromDouble((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_39 * __pyx_v_mp.strides[0]) ) + __pyx_t_41 * __pyx_v_mp.strides[1]) )))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_Format(__pyx_t_3, __pyx_kp_u_3f_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Log_likelihood_Path, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 418, __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, 418, __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;
+419: 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, 419, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_min); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 419, __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_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 419, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 419, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 419, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_43 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_43 < 0)) __PYX_ERR(0, 419, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_43)) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 419, __pyx_L1_error) } } #endif
+420: return np.asarray(path)
__Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 420, __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, 420, __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_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __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, 420, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0;