Generated by Cython 0.29.34
Yellow lines hint at Python interaction.
Click on a line that starts with a "+
" to see the C code that Cython generated for it.
Raw output: cfunc.c
+001: # cython: language_level=3, boundscheck=True, wraparound=False
__pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+002: import numpy as np
__pyx_t_1 = __Pyx_Import(__pyx_n_s_numpy, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_np, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+003: import psutil # For Memory Profiling
__pyx_t_1 = __Pyx_Import(__pyx_n_s_psutil, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_psutil, __pyx_t_1) < 0) __PYX_ERR(0, 3, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+004: import os
__pyx_t_1 = __Pyx_Import(__pyx_n_s_os, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_os, __pyx_t_1) < 0) __PYX_ERR(0, 4, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
005: cimport cython
006:
007: #from scipy.special import logsumexp
008: from libc.math cimport exp, log # For doing Exponentials and Logs
009:
+010: DTYPE = np.float64 # The float data type
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_float64); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (PyDict_SetItem(__pyx_d, __pyx_n_s_DTYPE, __pyx_t_2) < 0) __PYX_ERR(0, 10, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
011:
012:
+013: cdef inline double logsumexp(double[:] vec):
static CYTHON_INLINE double __pyx_f_6ancIBD_5cfunc_logsumexp(__Pyx_memviewslice __pyx_v_vec) { Py_ssize_t __pyx_v_i; double __pyx_v_result; double __pyx_v_largest; double __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("logsumexp", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_WriteUnraisable("ancIBD.cfunc.logsumexp", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
014: """Do the Log of the Sum of Exponentials."""
015: cdef Py_ssize_t i # The iterator Variable
+016: cdef double result = 0.0
__pyx_v_result = 0.0;
+017: cdef double largest = vec[0]
__pyx_t_1 = 0; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 17, __pyx_L1_error) } __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
018:
+019: for i in range(1, vec.shape[0]): # Find Maximum in vec
__pyx_t_3 = (__pyx_v_vec.shape[0]); __pyx_t_4 = __pyx_t_3; for (__pyx_t_5 = 1; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5;
+020: if (vec[i] > largest):
__pyx_t_1 = __pyx_v_i; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 20, __pyx_L1_error) } __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) > __pyx_v_largest) != 0); if (__pyx_t_6) { /* … */ } }
+021: largest = vec[i]
__pyx_t_1 = __pyx_v_i; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 21, __pyx_L1_error) } __pyx_v_largest = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
+022: for i in range(vec.shape[0]):
__pyx_t_3 = (__pyx_v_vec.shape[0]); __pyx_t_4 = __pyx_t_3; for (__pyx_t_5 = 0; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_i = __pyx_t_5;
+023: result += exp(vec[i] - largest)
__pyx_t_1 = __pyx_v_i; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 23, __pyx_L1_error) } __pyx_v_result = (__pyx_v_result + exp(((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) - __pyx_v_largest))); }
+024: return largest + log(result)
__pyx_r = (__pyx_v_largest + log(__pyx_v_result)); goto __pyx_L0;
025:
+026: cdef inline long argmax(double[:] vec):
static CYTHON_INLINE long __pyx_f_6ancIBD_5cfunc_argmax(__Pyx_memviewslice __pyx_v_vec) { int __pyx_v_m; double __pyx_v_v; Py_ssize_t __pyx_v_k; long __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("argmax", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_WriteUnraisable("ancIBD.cfunc.argmax", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
027: """Return Max and ArgMax"""
028: cdef Py_ssize_t i # The iterator Variable.
+029: cdef int m = 0 # Position of the Maximum.
__pyx_v_m = 0;
+030: cdef double v = vec[0]
__pyx_t_1 = 0; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 30, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
031:
+032: for k in range(1, vec.shape[0]): # Find Maximum
__pyx_t_3 = (__pyx_v_vec.shape[0]); __pyx_t_4 = __pyx_t_3; for (__pyx_t_5 = 1; __pyx_t_5 < __pyx_t_4; __pyx_t_5+=1) { __pyx_v_k = __pyx_t_5;
+033: if (vec[k] > v):
__pyx_t_1 = __pyx_v_k; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 33, __pyx_L1_error) } __pyx_t_6 = (((*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))) > __pyx_v_v) != 0); if (__pyx_t_6) { /* … */ } }
+034: m, v = k, vec[k]
__pyx_t_7 = __pyx_v_k; __pyx_t_1 = __pyx_v_k; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 34, __pyx_L1_error) } __pyx_t_8 = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) ))); __pyx_v_m = __pyx_t_7; __pyx_v_v = __pyx_t_8;
+035: return m # Return Argmax
__pyx_r = __pyx_v_m; goto __pyx_L0;
036:
+037: cdef inline double sum_array(double[:] vec, int n):
static CYTHON_INLINE double __pyx_f_6ancIBD_5cfunc_sum_array(__Pyx_memviewslice __pyx_v_vec, int __pyx_v_n) { double __pyx_v_s; long __pyx_v_i; double __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("sum_array", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_WriteUnraisable("ancIBD.cfunc.sum_array", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; }
038: """Sum over array.
039: vec: Array to sum
040: n: Number of elements"""
+041: cdef double s = vec[0]
__pyx_t_1 = 0; __pyx_t_2 = -1; if (__pyx_t_1 < 0) { __pyx_t_2 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_2 = 0; if (unlikely(__pyx_t_2 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_2); __PYX_ERR(0, 41, __pyx_L1_error) } __pyx_v_s = (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )));
+042: for i in range(1,n):
__pyx_t_2 = __pyx_v_n; __pyx_t_3 = __pyx_t_2; for (__pyx_t_4 = 1; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_i = __pyx_t_4;
+043: s = s + vec[i]
__pyx_t_1 = __pyx_v_i; __pyx_t_5 = -1; if (__pyx_t_1 < 0) { __pyx_t_5 = 0; } else if (unlikely(__pyx_t_1 >= __pyx_v_vec.shape[0])) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); __PYX_ERR(0, 43, __pyx_L1_error) } __pyx_v_s = (__pyx_v_s + (*((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_1 * __pyx_v_vec.strides[0]) )))); }
+044: return s
__pyx_r = __pyx_v_s; goto __pyx_L0;
045:
+046: def print_memory_usage():
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_1print_memory_usage(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_print_memory_usage[] = "Print the current Memory Usage in mB"; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_1print_memory_usage = {"print_memory_usage", (PyCFunction)__pyx_pw_6ancIBD_5cfunc_1print_memory_usage, METH_NOARGS, __pyx_doc_6ancIBD_5cfunc_print_memory_usage}; static PyObject *__pyx_pw_6ancIBD_5cfunc_1print_memory_usage(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("print_memory_usage (wrapper)", 0); __pyx_r = __pyx_pf_6ancIBD_5cfunc_print_memory_usage(__pyx_self); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_print_memory_usage(CYTHON_UNUSED PyObject *__pyx_self) { PyObject *__pyx_v_process = NULL; PyObject *__pyx_v_mb_usage = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("print_memory_usage", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("ancIBD.cfunc.print_memory_usage", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_process); __Pyx_XDECREF(__pyx_v_mb_usage); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__29 = PyTuple_Pack(2, __pyx_n_s_process, __pyx_n_s_mb_usage); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__29); __Pyx_GIVEREF(__pyx_tuple__29); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_1print_memory_usage, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_print_memory_usage, __pyx_t_2) < 0) __PYX_ERR(0, 46, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_print_memory_usage, 46, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 46, __pyx_L1_error)
047: """Print the current Memory Usage in mB"""
+048: process = psutil.Process(os.getpid())
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_psutil); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Process); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_os); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_getpid); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_5); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_5, function); } } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_5)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_5); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_5, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 48, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_process = __pyx_t_1; __pyx_t_1 = 0;
+049: mb_usage = process.memory_info().rss / 1e6
__pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_process, __pyx_n_s_memory_info); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_2) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_rss); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyFloat_TrueDivideObjC(__pyx_t_3, __pyx_float_1e6, 1e6, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 49, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_mb_usage = __pyx_t_1; __pyx_t_1 = 0;
+050: print(f"Memory Usage: {mb_usage} mB")
__pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_6 = 0; __pyx_t_7 = 127; __Pyx_INCREF(__pyx_kp_u_Memory_Usage); __pyx_t_6 += 14; __Pyx_GIVEREF(__pyx_kp_u_Memory_Usage); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_kp_u_Memory_Usage); __pyx_t_3 = __Pyx_PyObject_FormatSimple(__pyx_v_mb_usage, __pyx_empty_unicode); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = (__Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_3) > __pyx_t_7) ? __Pyx_PyUnicode_MAX_CHAR_VALUE(__pyx_t_3) : __pyx_t_7; __pyx_t_6 += __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); __pyx_t_3 = 0; __Pyx_INCREF(__pyx_kp_u_mB); __pyx_t_6 += 3; __Pyx_GIVEREF(__pyx_kp_u_mB); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_kp_u_mB); __pyx_t_3 = __Pyx_PyUnicode_Join(__pyx_t_1, 3, __pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 50, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
051:
052:
+053: def fwd_bkwd(double[:, :] e_mat, double[:, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_2fwd_bkwd[] = "Takes emission and transition probabilities, and calculates posteriors.\n Input: kxl matrices of emission, transition\n and initialized fwd and bwd probabilities. Given in normal space\n full: Boolean whether to return everything.\n output: Whether to print output useful for monitoring"; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_3fwd_bkwd = {"fwd_bkwd", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_2fwd_bkwd}; static PyObject *__pyx_pw_6ancIBD_5cfunc_3fwd_bkwd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } }; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_full = 0; PyObject *__pyx_v_output = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_fwd,&__pyx_n_s_bwd,&__pyx_n_s_t,&__pyx_n_s_full,&__pyx_n_s_output,0}; PyObject* values[7] = {0,0,0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_2fwd_bkwd(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, __Pyx_memviewslice __pyx_v_fwd, __Pyx_memviewslice __pyx_v_bwd, CYTHON_UNUSED __Pyx_memviewslice __pyx_v_t, PyObject *__pyx_v_full, PyObject *__pyx_v_output) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; PyObject *__pyx_v_post = NULL; PyObject *__pyx_v_trans_ll = NULL; __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_tot_ll; PyObject *__pyx_v_fwd1 = NULL; PyObject *__pyx_v_bwd1 = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_post); __Pyx_XDECREF(__pyx_v_trans_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1); __Pyx_XDECREF(__pyx_v_fwd1); __Pyx_XDECREF(__pyx_v_bwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__31 = PyTuple_Pack(20, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_fwd, __pyx_n_s_bwd, __pyx_n_s_t, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_post, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_t_mat0, __pyx_n_s_e_mat0, __pyx_n_s_tot_ll, __pyx_n_s_fwd1, __pyx_n_s_bwd1); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__31); __Pyx_GIVEREF(__pyx_tuple__31); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_3fwd_bkwd, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd, __pyx_t_2) < 0) __PYX_ERR(0, 53, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(7, 0, 20, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd, 53, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 53, __pyx_L1_error)
054: double[:, :] fwd, double[:, :] bwd, double[:,:,:] t,
+055: full=False, output=True):
values[5] = ((PyObject *)Py_False); values[6] = ((PyObject *)Py_True); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 1); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_fwd)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 2); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_bwd)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 3); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, 4); __PYX_ERR(0, 53, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full); if (value) { values[5] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output); if (value) { values[6] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd") < 0)) __PYX_ERR(0, 53, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); CYTHON_FALLTHROUGH; case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); CYTHON_FALLTHROUGH; case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 53, __pyx_L3_error) __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 53, __pyx_L3_error) __pyx_v_fwd = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_fwd.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_bwd = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[3], PyBUF_WRITABLE); if (unlikely(!__pyx_v_bwd.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_t = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[4], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t.memview)) __PYX_ERR(0, 54, __pyx_L3_error) __pyx_v_full = values[5]; __pyx_v_output = values[6]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd", 0, 5, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 53, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_2fwd_bkwd(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_fwd, __pyx_v_bwd, __pyx_v_t, __pyx_v_full, __pyx_v_output);
056: """Takes emission and transition probabilities, and calculates posteriors.
057: Input: kxl matrices of emission, transition
058: and initialized fwd and bwd probabilities. Given in normal space
059: full: Boolean whether to return everything.
060: output: Whether to print output useful for monitoring"""
+061: cdef int n_states = e_mat.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+062: cdef int n_loci = e_mat.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
063: cdef Py_ssize_t i, j, k # The Array Indices
064:
065: # Initialize Posterior and Transition Probabilities
+066: post = np.empty([n_states, n_loci], dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_post = __pyx_t_1; __pyx_t_1 = 0;
067:
+068: trans_ll = np.empty(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 68, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_trans_ll = __pyx_t_2; __pyx_t_2 = 0;
+069: cdef double[:] trans_ll_view = trans_ll
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 69, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
070:
071: ### Transform to Log space
+072: cdef double[:, :] t_mat0 = np.log(np.eye(n_states) + t_mat[:,:]) # Do log of (relevant) transition Matrix
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_eye); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_7 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); if (likely(__pyx_t_7)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); __Pyx_INCREF(__pyx_t_7); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_6, function); } } __pyx_t_1 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_7, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_4); __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_4 = PyNumber_Add(__pyx_t_1, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_6, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 72, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_t_mat0 = __pyx_t_8; __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
+073: cdef double[:, :] e_mat0 = np.log(e_mat)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_2 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 73, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_e_mat0 = __pyx_t_8; __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
074:
075:
+076: for i in range(1, n_loci): # Do the forward recursion
__pyx_t_9 = __pyx_v_n_loci; __pyx_t_10 = __pyx_t_9; for (__pyx_t_11 = 1; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { __pyx_v_i = __pyx_t_11;
+077: for j in range(n_states):
__pyx_t_12 = __pyx_v_n_states; __pyx_t_13 = __pyx_t_12; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_13; __pyx_t_14+=1) { __pyx_v_j = __pyx_t_14;
+078: for k in range(n_states):
__pyx_t_15 = __pyx_v_n_states; __pyx_t_16 = __pyx_t_15; for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_16; __pyx_t_17+=1) { __pyx_v_k = __pyx_t_17;
+079: trans_ll_view[k] = fwd[k, i - 1] + t_mat0[k, j]
__pyx_t_18 = __pyx_v_k; __pyx_t_19 = (__pyx_v_i - 1); __pyx_t_20 = -1; if (__pyx_t_18 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_19 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_19 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 79, __pyx_L1_error) } __pyx_t_21 = __pyx_v_k; __pyx_t_22 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_21 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[0])) __pyx_t_20 = 0; if (__pyx_t_22 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 79, __pyx_L1_error) } __pyx_t_23 = __pyx_v_k; __pyx_t_20 = -1; if (__pyx_t_23 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_23 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 79, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_23 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_18 * __pyx_v_fwd.strides[0]) ) + __pyx_t_19 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_21 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_22 * __pyx_v_t_mat0.strides[1]) )))); }
080:
+081: fwd[j, i] = e_mat0[j, i] + logsumexp(trans_ll_view)
__pyx_t_22 = __pyx_v_j; __pyx_t_21 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_22 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat0.shape[0])) __pyx_t_15 = 0; if (__pyx_t_21 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat0.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 81, __pyx_L1_error) } __pyx_t_19 = __pyx_v_j; __pyx_t_18 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_19 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_fwd.shape[0])) __pyx_t_15 = 0; if (__pyx_t_18 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_18 >= __pyx_v_fwd.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 81, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_19 * __pyx_v_fwd.strides[0]) ) + __pyx_t_18 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_22 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view)); } }
082:
+083: for i in range(n_loci-1, 0, -1): # Do the backward recursion
for (__pyx_t_11 = (__pyx_v_n_loci - 1); __pyx_t_11 > 0; __pyx_t_11-=1) { __pyx_v_i = __pyx_t_11;
+084: for j in range(n_states):
__pyx_t_9 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_9; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_10; __pyx_t_14+=1) { __pyx_v_j = __pyx_t_14;
+085: for k in range(n_states):
__pyx_t_12 = __pyx_v_n_states; __pyx_t_13 = __pyx_t_12; for (__pyx_t_17 = 0; __pyx_t_17 < __pyx_t_13; __pyx_t_17+=1) { __pyx_v_k = __pyx_t_17;
+086: trans_ll_view[k] = t_mat0[j, k] + e_mat0[k, i] + bwd[k, i]
__pyx_t_21 = __pyx_v_j; __pyx_t_22 = __pyx_v_k; __pyx_t_15 = -1; if (__pyx_t_21 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_t_mat0.shape[0])) __pyx_t_15 = 0; if (__pyx_t_22 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_t_mat0.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 86, __pyx_L1_error) } __pyx_t_18 = __pyx_v_k; __pyx_t_19 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_18 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_e_mat0.shape[0])) __pyx_t_15 = 0; if (__pyx_t_19 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_19 >= __pyx_v_e_mat0.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 86, __pyx_L1_error) } __pyx_t_23 = __pyx_v_k; __pyx_t_24 = __pyx_v_i; __pyx_t_15 = -1; if (__pyx_t_23 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_23 >= __pyx_v_bwd.shape[0])) __pyx_t_15 = 0; if (__pyx_t_24 < 0) { __pyx_t_15 = 1; } else if (unlikely(__pyx_t_24 >= __pyx_v_bwd.shape[1])) __pyx_t_15 = 1; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 86, __pyx_L1_error) } __pyx_t_25 = __pyx_v_k; __pyx_t_15 = -1; if (__pyx_t_25 < 0) { __pyx_t_15 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_15 = 0; if (unlikely(__pyx_t_15 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_15); __PYX_ERR(0, 86, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_25 * __pyx_v_trans_ll_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_21 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_22 * __pyx_v_t_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_18 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_19 * __pyx_v_e_mat0.strides[1]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_23 * __pyx_v_bwd.strides[0]) ) + __pyx_t_24 * __pyx_v_bwd.strides[1]) )))); }
+087: bwd[j, i - 1] = logsumexp(trans_ll_view)
__pyx_t_24 = __pyx_v_j; __pyx_t_23 = (__pyx_v_i - 1); __pyx_t_12 = -1; if (__pyx_t_24 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_24 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0; if (__pyx_t_23 < 0) { __pyx_t_12 = 1; } else if (unlikely(__pyx_t_23 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 87, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_24 * __pyx_v_bwd.strides[0]) ) + __pyx_t_23 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view); } }
088:
089: # Get total log likelihood
+090: for k in range(n_states): # Simply sum the two 1D arrays
__pyx_t_9 = __pyx_v_n_states; __pyx_t_10 = __pyx_t_9; for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_10; __pyx_t_11+=1) { __pyx_v_k = __pyx_t_11;
+091: trans_ll_view[k] = fwd[k, n_loci-1] + bwd[k, n_loci-1]
__pyx_t_23 = __pyx_v_k; __pyx_t_24 = (__pyx_v_n_loci - 1); __pyx_t_12 = -1; if (__pyx_t_23 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_23 >= __pyx_v_fwd.shape[0])) __pyx_t_12 = 0; if (__pyx_t_24 < 0) { __pyx_t_12 = 1; } else if (unlikely(__pyx_t_24 >= __pyx_v_fwd.shape[1])) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 91, __pyx_L1_error) } __pyx_t_19 = __pyx_v_k; __pyx_t_18 = (__pyx_v_n_loci - 1); __pyx_t_12 = -1; if (__pyx_t_19 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_bwd.shape[0])) __pyx_t_12 = 0; if (__pyx_t_18 < 0) { __pyx_t_12 = 1; } else if (unlikely(__pyx_t_18 >= __pyx_v_bwd.shape[1])) __pyx_t_12 = 1; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 91, __pyx_L1_error) } __pyx_t_22 = __pyx_v_k; __pyx_t_12 = -1; if (__pyx_t_22 < 0) { __pyx_t_12 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_12 = 0; if (unlikely(__pyx_t_12 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_12); __PYX_ERR(0, 91, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_22 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_23 * __pyx_v_fwd.strides[0]) ) + __pyx_t_24 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_19 * __pyx_v_bwd.strides[0]) ) + __pyx_t_18 * __pyx_v_bwd.strides[1]) )))); }
+092: tot_ll = logsumexp(trans_ll_view)
__pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
+093: if output:
__pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 93, __pyx_L1_error) if (__pyx_t_26) { /* … */ }
+094: print(f"Total Log likelihood: {tot_ll: .3f}")
__pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 94, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
095:
096: # Combine the forward and backward calculations
+097: fwd1 = np.asarray(fwd) # Transform
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 97, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_fwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 97, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_6, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 97, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_fwd1 = __pyx_t_4; __pyx_t_4 = 0;
+098: bwd1 = np.asarray(bwd)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_bwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 98, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_6)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_6); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_6, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 98, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_bwd1 = __pyx_t_4; __pyx_t_4 = 0;
+099: post = fwd1 + bwd1 - tot_ll
__pyx_t_4 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 99, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 99, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 99, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_3); __pyx_t_3 = 0;
+100: post = np.exp(post) ## Transform from log to normal space
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 100, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_exp); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 100, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_post); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 100, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_3); __pyx_t_3 = 0;
101:
+102: if full==False:
__pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 102, __pyx_L1_error) __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 102, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_26) { /* … */ }
+103: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
104:
+105: elif full==True: # Return everything
__pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) __pyx_t_26 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_26 < 0)) __PYX_ERR(0, 105, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_26) { /* … */ }
+106: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 106, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_post); __Pyx_GIVEREF(__pyx_v_post); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_post); __Pyx_INCREF(__pyx_v_fwd1); __Pyx_GIVEREF(__pyx_v_fwd1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_fwd1); __Pyx_INCREF(__pyx_v_bwd1); __Pyx_GIVEREF(__pyx_v_bwd1); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_bwd1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0;
107:
108:
+109: def fwd_bkwd_fast(double[:, :] e_mat, double[:, :, :] t_mat, double in_val = 1e-4,
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_4fwd_bkwd_fast[] = "Takes emission and transition probabilities, and calculates posteriors.\n Uses speed-up specific for Genotype data (pooling same transition rates)\n Input:\n e_mat: Emission probabilities [k x l] (normal space)\n t_mat: Transition Matrix: [l x 3 x 3] (normal space)\n in_val: Intitial probability of single symmetric state (normal space)\n full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n output: Whether to print output useful for monitoring\n Otherwise only posterior mat [kxl] of post is returned\n "; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_5fwd_bkwd_fast = {"fwd_bkwd_fast", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_4fwd_bkwd_fast}; static PyObject *__pyx_pw_6ancIBD_5cfunc_5fwd_bkwd_fast(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_v_output = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_fast (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_4fwd_bkwd_fast(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; double __pyx_v_stay; PyObject *__pyx_v_post = NULL; PyObject *__pyx_v_trans_ll = NULL; __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_trans_ll1 = NULL; __Pyx_memviewslice __pyx_v_trans_ll_view1 = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_three_v = NULL; __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_two_v = NULL; __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t0 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_fwd0 = NULL; __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_bwd0 = NULL; __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_f_l; double __pyx_v_tot_ll; PyObject *__pyx_v_fwd1 = NULL; PyObject *__pyx_v_bwd1 = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_fast", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_post); __Pyx_XDECREF(__pyx_v_trans_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1); __Pyx_XDECREF(__pyx_v_trans_ll1); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view1, 1); __Pyx_XDECREF(__pyx_v_three_v); __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1); __Pyx_XDECREF(__pyx_v_two_v); __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1); __Pyx_XDECREF(__pyx_v_fwd0); __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1); __Pyx_XDECREF(__pyx_v_bwd0); __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1); __Pyx_XDECREF(__pyx_v_fwd1); __Pyx_XDECREF(__pyx_v_bwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__33 = PyTuple_Pack(30, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_post, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_trans_ll1, __pyx_n_s_trans_ll_view1, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_t0, __pyx_n_s_e_mat0, __pyx_n_s_fwd0, __pyx_n_s_fwd, __pyx_n_s_bwd0, __pyx_n_s_bwd, __pyx_n_s_f_l, __pyx_n_s_tot_ll, __pyx_n_s_fwd1, __pyx_n_s_bwd1); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__33); __Pyx_GIVEREF(__pyx_tuple__33); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_5fwd_bkwd_fast, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_fast, __pyx_t_2) < 0) __PYX_ERR(0, 109, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(5, 0, 30, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_fast, 109, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 109, __pyx_L1_error)
+110: full=False, output=True):
values[3] = ((PyObject *)Py_False); values[4] = ((PyObject *)Py_True); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 2, 5, 1); __PYX_ERR(0, 109, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output); if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_fast") < 0)) __PYX_ERR(0, 109, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 109, __pyx_L3_error) __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 109, __pyx_L3_error) if (values[2]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 109, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[3]; __pyx_v_output = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_fast", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 109, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_4fwd_bkwd_fast(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
111: """Takes emission and transition probabilities, and calculates posteriors.
112: Uses speed-up specific for Genotype data (pooling same transition rates)
113: Input:
114: e_mat: Emission probabilities [k x l] (normal space)
115: t_mat: Transition Matrix: [l x 3 x 3] (normal space)
116: in_val: Intitial probability of single symmetric state (normal space)
117: full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
118: output: Whether to print output useful for monitoring
119: Otherwise only posterior mat [kxl] of post is returned
120: """
+121: cdef int n_states = e_mat.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+122: cdef int n_loci = e_mat.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
123: cdef Py_ssize_t i, j, k # The Array Indices
124: cdef double stay # The Probablility of Staying
125:
126: # Initialize Posterior and Transition Probabilities
+127: post = np.empty([n_states, n_loci], dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_post = __pyx_t_1; __pyx_t_1 = 0;
128:
+129: trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_trans_ll = __pyx_t_2; __pyx_t_2 = 0;
+130: cdef double[:] trans_ll_view = trans_ll
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 130, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
131:
+132: trans_ll1 = np.empty(n_states, dtype=DTYPE) # Array for calculations
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 132, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_trans_ll1 = __pyx_t_4; __pyx_t_4 = 0;
+133: cdef double[:] trans_ll_view1 = trans_ll1
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 133, __pyx_L1_error) __pyx_v_trans_ll_view1 = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
134:
+135: three_v = np.empty(3, dtype=DTYPE) # Array of size three
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_three_v = __pyx_t_3; __pyx_t_3 = 0; /* … */ __pyx_tuple_ = PyTuple_Pack(1, __pyx_int_3); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 135, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple_); __Pyx_GIVEREF(__pyx_tuple_);
+136: cdef double[:] three_v_view = three_v
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 136, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
137:
+138: two_v = np.empty(2, dtype=DTYPE) # Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__2, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_two_v = __pyx_t_2; __pyx_t_2 = 0; /* … */ __pyx_tuple__2 = PyTuple_Pack(1, __pyx_int_2); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2);
+139: cdef double[:] two_v_view = two_v
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 139, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
140:
141: # Do transform to Log Space:
+142: cdef double[:,:,:] t0 = np.log(t_mat) # Do log of recombination Map
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_t0 = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
+143: cdef double[:, :] e_mat0 = np.log(e_mat)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 143, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_e_mat0 = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
144:
145: ### Initialize FWD BWD matrices
+146: fwd0 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_4); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 146, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_fwd0 = __pyx_t_2; __pyx_t_2 = 0;
+147: fwd0[:, 0] = np.log(in_val) # Initial Probabilities
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* … */ __pyx_slice__3 = PySlice_New(Py_None, Py_None, Py_None); if (unlikely(!__pyx_slice__3)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_slice__3); __Pyx_GIVEREF(__pyx_slice__3); if (unlikely(PyObject_SetItem(__pyx_v_fwd0, __pyx_tuple__4, __pyx_t_2) < 0)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_tuple__4 = PyTuple_Pack(2, __pyx_slice__3, __pyx_int_0); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4);
+148: fwd0[0, 0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(PyObject_SetItem(__pyx_v_fwd0, __pyx_tuple__5, __pyx_t_2) < 0)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* … */ __pyx_tuple__5 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_0); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__5); __Pyx_GIVEREF(__pyx_tuple__5);
+149: cdef double[:,:] fwd = fwd0
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 149, __pyx_L1_error) __pyx_v_fwd = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
150:
+151: bwd0 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 151, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_bwd0 = __pyx_t_2; __pyx_t_2 = 0;
+152: bwd0[:, -1] = np.log(in_val)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(PyObject_SetItem(__pyx_v_bwd0, __pyx_tuple__6, __pyx_t_2) < 0)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* … */ __pyx_tuple__6 = PyTuple_Pack(2, __pyx_slice__3, __pyx_int_neg_1); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 152, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6);
+153: bwd0[0, -1] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(PyObject_SetItem(__pyx_v_bwd0, __pyx_tuple__7, __pyx_t_2) < 0)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* … */ __pyx_tuple__7 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_neg_1); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 153, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__7); __Pyx_GIVEREF(__pyx_tuple__7);
+154: cdef double[:,:] bwd = bwd0
__pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 154, __pyx_L1_error) __pyx_v_bwd = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
155:
156: #############################
157: ### Do the Forward Algorithm
+158: for i in range(1, n_loci): # Run forward recursion
__pyx_t_8 = __pyx_v_n_loci; __pyx_t_9 = __pyx_t_8; for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10;
+159: stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2]) # Do the log of the Stay term
__pyx_t_11 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_13 = 1; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1; if (__pyx_t_13 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 159, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_17 = 2; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 159, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_11 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) )))));
160:
+161: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_14 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_14; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+162: trans_ll_view[k-1] = fwd[k, i - 1]
__pyx_t_17 = __pyx_v_k; __pyx_t_16 = (__pyx_v_i - 1); __pyx_t_20 = -1; if (__pyx_t_17 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_16 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 162, __pyx_L1_error) } __pyx_t_15 = (__pyx_v_k - 1); __pyx_t_20 = -1; if (__pyx_t_15 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 162, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_15 * __pyx_v_trans_ll_view.strides[0]) )) = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) ))); }
+163: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
164:
165: # Do the 0 State:
+166: two_v_view[0] = fwd[0, i - 1] + t0[i, 0, 0] # Staying in 0 State
__pyx_t_16 = 0; __pyx_t_17 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_17 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 166, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_13 = 0; __pyx_t_12 = 0; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_12 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 166, __pyx_L1_error) } __pyx_t_11 = 0; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 166, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_11 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) ))));
+167: two_v_view[1] = f_l + t0[i, 1, 0] # Going into 0 State
__pyx_t_12 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_15 = 0; __pyx_t_14 = -1; if (__pyx_t_12 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_15 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 167, __pyx_L1_error) } __pyx_t_17 = 1; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 167, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_12 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+168: fwd[0, i] = e_mat0[0, i] + logsumexp(two_v_view)
__pyx_t_15 = 0; __pyx_t_13 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 168, __pyx_L1_error) } __pyx_t_12 = 0; __pyx_t_17 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_12 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_17 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 168, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_15 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view));
169:
170: ### Do the other states
171: # Preprocessing:
+172: three_v_view[0] = fwd[0, i - 1] + t0[i, 0, 1] # Coming from 0 State
__pyx_t_13 = 0; __pyx_t_15 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 172, __pyx_L1_error) } __pyx_t_17 = __pyx_v_i; __pyx_t_12 = 0; __pyx_t_16 = 1; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_16 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 172, __pyx_L1_error) } __pyx_t_11 = 0; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 172, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_11 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_17 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
+173: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_16 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_17 = 2; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_12 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 173, __pyx_L1_error) } __pyx_t_15 = 1; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 173, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_15 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_12 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
174:
+175: for j in range(1, n_states): # Do the final run over all states
__pyx_t_14 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_14; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+176: three_v_view[2] = fwd[j, i-1] + stay
__pyx_t_17 = __pyx_v_j; __pyx_t_12 = (__pyx_v_i - 1); __pyx_t_20 = -1; if (__pyx_t_17 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_12 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 176, __pyx_L1_error) } __pyx_t_16 = 2; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_three_v_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 176, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_16 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ) + __pyx_t_12 * __pyx_v_fwd.strides[1]) ))) + __pyx_v_stay);
+177: fwd[j, i] = e_mat0[j, i] + logsumexp(three_v_view)
__pyx_t_12 = __pyx_v_j; __pyx_t_17 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_12 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat0.shape[0])) __pyx_t_20 = 0; if (__pyx_t_17 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 177, __pyx_L1_error) } __pyx_t_16 = __pyx_v_j; __pyx_t_15 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_15 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 177, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_12 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view)); } }
178:
179: #############################
180: ### Do the Backward Algorithm
+181: for i in range(n_loci-1, 0, -1): # Run backward recursion
for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) { __pyx_v_i = __pyx_t_10;
+182: stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])
__pyx_t_17 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_15 = 1; __pyx_t_8 = -1; if (__pyx_t_17 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[0])) __pyx_t_8 = 0; if (__pyx_t_12 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t_mat.shape[1])) __pyx_t_8 = 1; if (__pyx_t_15 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 182, __pyx_L1_error) } __pyx_t_16 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_11 = 2; __pyx_t_8 = -1; if (__pyx_t_16 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[0])) __pyx_t_8 = 0; if (__pyx_t_13 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[1])) __pyx_t_8 = 1; if (__pyx_t_11 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t_mat.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 182, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_17 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_15 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_16 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_11 * __pyx_v_t_mat.strides[2]) )))));
183:
+184: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+185: trans_ll_view[k-1] = bwd[k, i] + e_mat0[k, i]
__pyx_t_11 = __pyx_v_k; __pyx_t_13 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 185, __pyx_L1_error) } __pyx_t_16 = __pyx_v_k; __pyx_t_15 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 185, __pyx_L1_error) } __pyx_t_12 = (__pyx_v_k - 1); __pyx_t_14 = -1; if (__pyx_t_12 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 185, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_12 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_11 * __pyx_v_bwd.strides[0]) ) + __pyx_t_13 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) )))); }
+186: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
187:
188: # Do the 0 State:
+189: two_v_view[0] = bwd[0, i] + t0[i, 0, 0] + e_mat0[0, i] # Staying in 0 State
__pyx_t_15 = 0; __pyx_t_16 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_15 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_16 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 189, __pyx_L1_error) } __pyx_t_13 = __pyx_v_i; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_8 = -1; if (__pyx_t_13 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_11 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_12 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 189, __pyx_L1_error) } __pyx_t_17 = 0; __pyx_t_21 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_17 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_21 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 189, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_two_v_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 189, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_22 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_16 * __pyx_v_bwd.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_11 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_21 * __pyx_v_e_mat0.strides[1]) ))));
+190: two_v_view[1] = f_l + t0[i, 0, 1] # Going into 0 State
__pyx_t_21 = __pyx_v_i; __pyx_t_17 = 0; __pyx_t_12 = 1; __pyx_t_8 = -1; if (__pyx_t_21 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_17 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_12 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_12 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 190, __pyx_L1_error) } __pyx_t_11 = 1; __pyx_t_8 = -1; if (__pyx_t_11 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_two_v_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 190, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_11 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_21 * __pyx_v_t0.strides[0]) ) + __pyx_t_17 * __pyx_v_t0.strides[1]) ) + __pyx_t_12 * __pyx_v_t0.strides[2]) ))));
+191: bwd[0, i - 1] = logsumexp(two_v_view)
__pyx_t_12 = 0; __pyx_t_17 = (__pyx_v_i - 1); __pyx_t_8 = -1; if (__pyx_t_12 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_17 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 191, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_12 * __pyx_v_bwd.strides[0]) ) + __pyx_t_17 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view);
192:
193: ### Do the other states
194: # Preprocessing:
+195: three_v_view[0] = e_mat0[0, i] + bwd[0, i] + t0[i, 1, 0]
__pyx_t_17 = 0; __pyx_t_12 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_17 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_12 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat0.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 195, __pyx_L1_error) } __pyx_t_21 = 0; __pyx_t_11 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_21 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_11 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 195, __pyx_L1_error) } __pyx_t_13 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_15 = 0; __pyx_t_8 = -1; if (__pyx_t_13 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_16 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_15 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 195, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_three_v_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 195, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_22 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_12 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_21 * __pyx_v_bwd.strides[0]) ) + __pyx_t_11 * __pyx_v_bwd.strides[1]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+196: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_15 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_13 = 2; __pyx_t_8 = -1; if (__pyx_t_15 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_8 = 0; if (__pyx_t_16 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_8 = 1; if (__pyx_t_13 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 196, __pyx_L1_error) } __pyx_t_11 = 1; __pyx_t_8 = -1; if (__pyx_t_11 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_three_v_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 196, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_11 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_13 * __pyx_v_t0.strides[2]) ))));
197:
+198: for j in range(1, n_states): # Do the final run over all states
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+199: three_v_view[2] = e_mat0[j, i] + bwd[j, i] + stay
__pyx_t_13 = __pyx_v_j; __pyx_t_16 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 199, __pyx_L1_error) } __pyx_t_15 = __pyx_v_j; __pyx_t_11 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_11 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 199, __pyx_L1_error) } __pyx_t_21 = 2; __pyx_t_14 = -1; if (__pyx_t_21 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 199, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_21 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_13 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_11 * __pyx_v_bwd.strides[1]) )))) + __pyx_v_stay);
+200: bwd[j, i - 1] = logsumexp(three_v_view) # Fill in the backward Probability
__pyx_t_11 = __pyx_v_j; __pyx_t_15 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_11 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 200, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_11 * __pyx_v_bwd.strides[0]) ) + __pyx_t_15 * __pyx_v_bwd.strides[1]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view); } }
201:
202: # Get total log likelihood
+203: for k in range(n_states): # Simply sum the two 1D arrays
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_k = __pyx_t_10;
+204: trans_ll_view1[k] = fwd[k, n_loci - 1] + bwd[k, n_loci - 1]
__pyx_t_15 = __pyx_v_k; __pyx_t_11 = (__pyx_v_n_loci - 1); __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_11 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 204, __pyx_L1_error) } __pyx_t_16 = __pyx_v_k; __pyx_t_13 = (__pyx_v_n_loci - 1); __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 204, __pyx_L1_error) } __pyx_t_21 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_21 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_trans_ll_view1.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 204, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_21 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ) + __pyx_t_11 * __pyx_v_fwd.strides[1]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_16 * __pyx_v_bwd.strides[0]) ) + __pyx_t_13 * __pyx_v_bwd.strides[1]) )))); }
+205: tot_ll = logsumexp(trans_ll_view1)
__pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
206:
207: # Combine the forward and backward calculations
+208: fwd1 = np.asarray(fwd, dtype=DTYPE) ## Transform
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_v_fwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_fwd1 = __pyx_t_1; __pyx_t_1 = 0;
+209: bwd1 = np.asarray(bwd, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_asarray); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_bwd, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 209, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_bwd1 = __pyx_t_3; __pyx_t_3 = 0;
+210: post = fwd1 + bwd1 - float(tot_ll) ## Posterior in log space
__pyx_t_3 = PyNumber_Add(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 210, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 210, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 210, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_4); __pyx_t_4 = 0;
+211: post = np.exp(post) ## To have posterior in normal space
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 211, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_exp); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 211, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_4 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_post); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 211, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_4); __pyx_t_4 = 0;
+212: if output:
__pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 212, __pyx_L1_error) if (__pyx_t_23) { /* … */ }
+213: print("Memory Usage Full:")
__pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 213, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; /* … */ __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_u_Memory_Usage_Full); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 213, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8);
+214: print_memory_usage() ## For MEMORY_BENCH
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 214, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_4 = (__pyx_t_1) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallNoArg(__pyx_t_3); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 214, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+215: print(f"Total Log likelihood: {tot_ll: .3f}")
__pyx_t_4 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_Format(__pyx_t_4, __pyx_kp_u_3f); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 215, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
216:
+217: if full==False:
__pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 217, __pyx_L1_error) __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 217, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_23) { /* … */ }
+218: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
219:
+220: elif full==True: # Return everything
__pyx_t_3 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 220, __pyx_L1_error) __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 220, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_23) { /* … */ }
+221: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 221, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(4); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 221, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_INCREF(__pyx_v_post); __Pyx_GIVEREF(__pyx_v_post); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_post); __Pyx_INCREF(__pyx_v_fwd1); __Pyx_GIVEREF(__pyx_v_fwd1); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_fwd1); __Pyx_INCREF(__pyx_v_bwd1); __Pyx_GIVEREF(__pyx_v_bwd1); PyTuple_SET_ITEM(__pyx_t_4, 2, __pyx_v_bwd1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 3, __pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0;
222:
223:
+224: def fwd_bkwd_lowmem(double[:, :] e_mat, double[:, :, :] t_mat, double in_val = 1e-4,
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_6fwd_bkwd_lowmem[] = "Takes emission and transition probabilities, and calculates posteriors.\n Uses speed-up specific for Genotype data (pooling same transition rates)\n Low-Mem: Do no save the full FWD BWD and Posterior. Use temporary\n Arrays for saving. Only return 0-posterior. useful for large symmetric state arrays.\n Input:\n e_mat0: Emission probabilities [k x l] (normal space)\n t_mat: Transition Matrix: [l x 3 x 3] (normal space)\n in_val: Intitial probability of single symmetric state (normal space)\n full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n Otherwise only posterior mat [kxl] of post is returned"; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_7fwd_bkwd_lowmem = {"fwd_bkwd_lowmem", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_6fwd_bkwd_lowmem}; static PyObject *__pyx_pw_6ancIBD_5cfunc_7fwd_bkwd_lowmem(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_v_output = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_lowmem (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_6fwd_bkwd_lowmem(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; double __pyx_v_stay; double __pyx_v_tot_ll; PyObject *__pyx_v_post = NULL; __Pyx_memviewslice __pyx_v_post_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_trans_ll = NULL; __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_trans_ll1 = NULL; __Pyx_memviewslice __pyx_v_trans_ll_view1 = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_three_v = NULL; __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_two_v = NULL; __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t0 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_fwd0 = NULL; __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_bwd0 = NULL; __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_tmp0 = NULL; __Pyx_memviewslice __pyx_v_tmp = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_f_l; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_lowmem", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_7, 1); __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_lowmem", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_post); __PYX_XDEC_MEMVIEW(&__pyx_v_post_view, 1); __Pyx_XDECREF(__pyx_v_trans_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1); __Pyx_XDECREF(__pyx_v_trans_ll1); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view1, 1); __Pyx_XDECREF(__pyx_v_three_v); __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1); __Pyx_XDECREF(__pyx_v_two_v); __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1); __Pyx_XDECREF(__pyx_v_fwd0); __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1); __Pyx_XDECREF(__pyx_v_bwd0); __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1); __Pyx_XDECREF(__pyx_v_tmp0); __PYX_XDEC_MEMVIEW(&__pyx_v_tmp, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__35 = PyTuple_Pack(31, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_tot_ll, __pyx_n_s_post, __pyx_n_s_post_view, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_trans_ll1, __pyx_n_s_trans_ll_view1, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_t0, __pyx_n_s_e_mat0, __pyx_n_s_fwd0, __pyx_n_s_fwd, __pyx_n_s_bwd0, __pyx_n_s_bwd, __pyx_n_s_tmp0, __pyx_n_s_tmp, __pyx_n_s_f_l); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 224, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__35); __Pyx_GIVEREF(__pyx_tuple__35); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_7fwd_bkwd_lowmem, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 224, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_lowmem, __pyx_t_2) < 0) __PYX_ERR(0, 224, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__36 = (PyObject*)__Pyx_PyCode_New(5, 0, 31, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__35, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_lowmem, 224, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__36)) __PYX_ERR(0, 224, __pyx_L1_error)
+225: full=False, output=True):
values[3] = ((PyObject *)Py_False); values[4] = ((PyObject *)Py_True); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 2, 5, 1); __PYX_ERR(0, 224, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output); if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_lowmem") < 0)) __PYX_ERR(0, 224, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 224, __pyx_L3_error) __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 224, __pyx_L3_error) if (values[2]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[3]; __pyx_v_output = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_lowmem", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 224, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_lowmem", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_6fwd_bkwd_lowmem(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
226: """Takes emission and transition probabilities, and calculates posteriors.
227: Uses speed-up specific for Genotype data (pooling same transition rates)
228: Low-Mem: Do no save the full FWD BWD and Posterior. Use temporary
229: Arrays for saving. Only return 0-posterior. useful for large symmetric state arrays.
230: Input:
231: e_mat0: Emission probabilities [k x l] (normal space)
232: t_mat: Transition Matrix: [l x 3 x 3] (normal space)
233: in_val: Intitial probability of single symmetric state (normal space)
234: full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
235: Otherwise only posterior mat [kxl] of post is returned"""
+236: cdef int n_states = e_mat.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+237: cdef int n_loci = e_mat.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
238: cdef Py_ssize_t i, j, k # The Array Indices
239: cdef double stay # The Probablility of Staying
240: cdef double tot_ll # The total Likelihood (need for Posterior)
241:
242: # Initialize Posterior and Transition Probabilities
+243: post = np.empty(n_loci, dtype=DTYPE) # Array of 0 State Posterior
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 243, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_post = __pyx_t_4; __pyx_t_4 = 0;
+244: cdef double[:] post_view = post
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_post, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 244, __pyx_L1_error) __pyx_v_post_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
245:
+246: trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 246, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_trans_ll = __pyx_t_2; __pyx_t_2 = 0;
+247: cdef double[:] trans_ll_view = trans_ll
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 247, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
248:
+249: trans_ll1 = np.empty(n_states, dtype=DTYPE) # Array for calculations
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 249, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_trans_ll1 = __pyx_t_1; __pyx_t_1 = 0;
+250: cdef double[:] trans_ll_view1 = trans_ll1
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 250, __pyx_L1_error) __pyx_v_trans_ll_view1 = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
251:
+252: three_v = np.empty(3, dtype=DTYPE) # Array of size three
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 252, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_three_v = __pyx_t_3; __pyx_t_3 = 0;
+253: cdef double[:] three_v_view = three_v
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 253, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
254:
+255: two_v = np.empty(2, dtype=DTYPE) # Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__2, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_two_v = __pyx_t_2; __pyx_t_2 = 0;
+256: cdef double[:] two_v_view = two_v
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 256, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
257:
258: # Do transform to Log Space:
+259: cdef double[:,:,:] t0 = np.log(t_mat)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_t_mat, 3, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 259, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 259, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_t0 = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
+260: cdef double[:, :] e_mat0 = np.log(e_mat)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_e_mat, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_7.memview)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_e_mat0 = __pyx_t_7; __pyx_t_7.memview = NULL; __pyx_t_7.data = NULL;
261:
262: ### Initialize FWD BWD Arrays
+263: fwd0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_1, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_fwd0 = __pyx_t_4; __pyx_t_4 = 0;
+264: fwd0[:] = np.log(in_val) # Initial Probabilities
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_4 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__Pyx_PyObject_SetSlice(__pyx_v_fwd0, __pyx_t_4, 0, 0, NULL, NULL, &__pyx_slice__3, 0, 0, 0) < 0) __PYX_ERR(0, 264, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+265: fwd0[0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_4 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_3, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(__Pyx_SetItemInt(__pyx_v_fwd0, 0, __pyx_t_4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 265, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+266: cdef double[:] fwd = fwd0
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_fwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 266, __pyx_L1_error) __pyx_v_fwd = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
267:
+268: bwd0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 268, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_bwd0 = __pyx_t_3; __pyx_t_3 = 0;
+269: bwd0[:] = np.log(in_val)
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 269, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 269, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 269, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_2, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 269, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__Pyx_PyObject_SetSlice(__pyx_v_bwd0, __pyx_t_3, 0, 0, NULL, NULL, &__pyx_slice__3, 0, 0, 0) < 0) __PYX_ERR(0, 269, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+270: bwd0[0] = np.log(1 - (n_states - 1) * in_val)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 270, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 270, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_3 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_2, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 270, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(__Pyx_SetItemInt(__pyx_v_bwd0, 0, __pyx_t_3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1) < 0)) __PYX_ERR(0, 270, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+271: cdef double[:] bwd = bwd0
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_bwd0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 271, __pyx_L1_error) __pyx_v_bwd = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
272:
+273: tmp0 = np.zeros(n_states, dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 273, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_tmp0 = __pyx_t_2; __pyx_t_2 = 0;
+274: cdef double[:] tmp = tmp0
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_tmp0, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 274, __pyx_L1_error) __pyx_v_tmp = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
275:
276: #############################
277: ### Do the Forward Algorithm
278:
+279: post_view[0] = fwd[0] # Add to first locus 0 Posterior
__pyx_t_8 = 0; __pyx_t_9 = -1; if (__pyx_t_8 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_fwd.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 279, __pyx_L1_error) } __pyx_t_10 = 0; __pyx_t_9 = -1; if (__pyx_t_10 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 279, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_10 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_8 * __pyx_v_fwd.strides[0]) )));
+280: for i in range(1, n_loci): # Run forward recursion
__pyx_t_9 = __pyx_v_n_loci; __pyx_t_11 = __pyx_t_9; for (__pyx_t_12 = 1; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_i = __pyx_t_12;
+281: stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2]) # Do the log of the Stay term
__pyx_t_8 = __pyx_v_i; __pyx_t_10 = 1; __pyx_t_13 = 1; __pyx_t_14 = -1; if (__pyx_t_8 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_10 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_10 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1; if (__pyx_t_13 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 281, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_17 = 2; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 281, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_8 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_10 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_13 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) )))));
282:
+283: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_14 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_14; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+284: trans_ll_view[k-1] = fwd[k]
__pyx_t_17 = __pyx_v_k; __pyx_t_20 = -1; if (__pyx_t_17 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 284, __pyx_L1_error) } __pyx_t_16 = (__pyx_v_k - 1); __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 284, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_16 * __pyx_v_trans_ll_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ))); }
+285: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
286:
287: # Do the 0 State:
+288: two_v_view[0] = fwd[0] + t0[i, 0, 0] # Staying in 0 State
__pyx_t_17 = 0; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 288, __pyx_L1_error) } __pyx_t_16 = __pyx_v_i; __pyx_t_15 = 0; __pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_13 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 288, __pyx_L1_error) } __pyx_t_10 = 0; __pyx_t_14 = -1; if (__pyx_t_10 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 288, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_10 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_17 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_15 * __pyx_v_t0.strides[1]) ) + __pyx_t_13 * __pyx_v_t0.strides[2]) ))));
+289: two_v_view[1] = f_l + t0[i, 1, 0] # Going into 0 State
__pyx_t_13 = __pyx_v_i; __pyx_t_15 = 1; __pyx_t_16 = 0; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_16 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 289, __pyx_L1_error) } __pyx_t_17 = 1; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 289, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_15 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
+290: tmp[0] = e_mat0[0, i] + logsumexp(two_v_view)
__pyx_t_16 = 0; __pyx_t_15 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 290, __pyx_L1_error) } __pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 290, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_13 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view));
291:
292: ### Do the other states
293: # Preprocessing:
+294: three_v_view[0] = fwd[0] + t0[i, 0, 1] # Coming from 0 State
__pyx_t_15 = 0; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 294, __pyx_L1_error) } __pyx_t_16 = __pyx_v_i; __pyx_t_13 = 0; __pyx_t_17 = 1; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_17 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 294, __pyx_L1_error) } __pyx_t_10 = 0; __pyx_t_14 = -1; if (__pyx_t_10 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 294, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_10 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_16 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
+295: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_17 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_16 = 2; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_16 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 295, __pyx_L1_error) } __pyx_t_15 = 1; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 295, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_15 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_17 * __pyx_v_t0.strides[0]) ) + __pyx_t_13 * __pyx_v_t0.strides[1]) ) + __pyx_t_16 * __pyx_v_t0.strides[2]) ))));
296:
+297: for j in range(1, n_states): # Do the final run over all states
__pyx_t_14 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_14; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+298: three_v_view[2] = fwd[j] + stay
__pyx_t_16 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 298, __pyx_L1_error) } __pyx_t_13 = 2; __pyx_t_20 = -1; if (__pyx_t_13 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 298, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ))) + __pyx_v_stay);
+299: tmp[j] = e_mat0[j, i] + logsumexp(three_v_view)
__pyx_t_16 = __pyx_v_j; __pyx_t_13 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_20 = 0; if (__pyx_t_13 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 299, __pyx_L1_error) } __pyx_t_17 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_17 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_tmp.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 299, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_17 * __pyx_v_tmp.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))) + __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view)); }
300:
301: ### Make tmp new fwd vec:
+302: for j in range(0, n_states):
__pyx_t_14 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_14; for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+303: fwd[j] = tmp[j]
__pyx_t_13 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_13 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_tmp.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 303, __pyx_L1_error) } __pyx_t_16 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 303, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_13 * __pyx_v_tmp.strides[0]) ))); }
+304: post_view[i] = fwd[0] # Add to 0-State Posterior
__pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 304, __pyx_L1_error) } __pyx_t_16 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_post_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 304, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_16 * __pyx_v_post_view.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ))); }
305:
306: ### Get total log likelihood
+307: for k in range(n_states): # Simply sum the two 1D arrays
__pyx_t_9 = __pyx_v_n_states; __pyx_t_11 = __pyx_t_9; for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_k = __pyx_t_12;
+308: trans_ll_view1[k] = fwd[k] + bwd[k]
__pyx_t_13 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_fwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 308, __pyx_L1_error) } __pyx_t_16 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 308, __pyx_L1_error) } __pyx_t_17 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_trans_ll_view1.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 308, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view1.data + __pyx_t_17 * __pyx_v_trans_ll_view1.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_13 * __pyx_v_fwd.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_16 * __pyx_v_bwd.strides[0]) )))); }
+309: tot_ll = logsumexp(trans_ll_view1)
__pyx_v_tot_ll = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view1);
310:
311: #############################
312: ### Do the Backward Algorithm
313: ## last0-State Posterior
+314: post_view[n_loci-1] = post_view[n_loci-1] + bwd[0] - tot_ll
__pyx_t_16 = (__pyx_v_n_loci - 1); __pyx_t_9 = -1; if (__pyx_t_16 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 314, __pyx_L1_error) } __pyx_t_13 = 0; __pyx_t_9 = -1; if (__pyx_t_13 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 314, __pyx_L1_error) } __pyx_t_17 = (__pyx_v_n_loci - 1); __pyx_t_9 = -1; if (__pyx_t_17 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 314, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_17 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_16 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_13 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll);
315:
+316: for i in range(n_loci-1, 0, -1): # Run backward recursion
for (__pyx_t_12 = (__pyx_v_n_loci - 1); __pyx_t_12 > 0; __pyx_t_12-=1) { __pyx_v_i = __pyx_t_12;
+317: stay = log(t_mat[i, 1, 1] - t_mat[i, 1, 2])
__pyx_t_13 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_17 = 1; __pyx_t_9 = -1; if (__pyx_t_13 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat.shape[0])) __pyx_t_9 = 0; if (__pyx_t_16 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat.shape[1])) __pyx_t_9 = 1; if (__pyx_t_17 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 317, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_10 = 1; __pyx_t_8 = 2; __pyx_t_9 = -1; if (__pyx_t_15 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat.shape[0])) __pyx_t_9 = 0; if (__pyx_t_10 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_10 >= __pyx_v_t_mat.shape[1])) __pyx_t_9 = 1; if (__pyx_t_8 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_8 >= __pyx_v_t_mat.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 317, __pyx_L1_error) } __pyx_v_stay = log(((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_13 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat.data + __pyx_t_15 * __pyx_v_t_mat.strides[0]) ) + __pyx_t_10 * __pyx_v_t_mat.strides[1]) ) + __pyx_t_8 * __pyx_v_t_mat.strides[2]) )))));
318:
+319: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_9 = __pyx_v_n_states; __pyx_t_11 = __pyx_t_9; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+320: trans_ll_view[k-1] = bwd[k] + e_mat0[k, i]
__pyx_t_8 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_8 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 320, __pyx_L1_error) } __pyx_t_10 = __pyx_v_k; __pyx_t_15 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_10 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 320, __pyx_L1_error) } __pyx_t_17 = (__pyx_v_k - 1); __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_trans_ll_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 320, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_trans_ll_view.data + __pyx_t_17 * __pyx_v_trans_ll_view.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_8 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_10 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat0.strides[1]) )))); }
+321: f_l = logsumexp(trans_ll_view) # Logsum of ROH States
__pyx_v_f_l = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_trans_ll_view);
322:
323: # Do the 0 State:
+324: two_v_view[0] = bwd[0] + t0[i, 0, 0] + e_mat0[0, i] # Staying in 0 State
__pyx_t_15 = 0; __pyx_t_9 = -1; if (__pyx_t_15 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 324, __pyx_L1_error) } __pyx_t_10 = __pyx_v_i; __pyx_t_8 = 0; __pyx_t_17 = 0; __pyx_t_9 = -1; if (__pyx_t_10 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_8 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1; if (__pyx_t_17 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 324, __pyx_L1_error) } __pyx_t_16 = 0; __pyx_t_13 = __pyx_v_i; __pyx_t_9 = -1; if (__pyx_t_16 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_13 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_9 = 1; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 324, __pyx_L1_error) } __pyx_t_21 = 0; __pyx_t_9 = -1; if (__pyx_t_21 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_two_v_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 324, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_21 * __pyx_v_two_v_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_10 * __pyx_v_t0.strides[0]) ) + __pyx_t_8 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) )))) + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_16 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))));
+325: two_v_view[1] = f_l + t0[i, 0, 1] # Going into 0 State
__pyx_t_13 = __pyx_v_i; __pyx_t_16 = 0; __pyx_t_17 = 1; __pyx_t_9 = -1; if (__pyx_t_13 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_16 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1; if (__pyx_t_17 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 325, __pyx_L1_error) } __pyx_t_8 = 1; __pyx_t_9 = -1; if (__pyx_t_8 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_two_v_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 325, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_8 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_13 * __pyx_v_t0.strides[0]) ) + __pyx_t_16 * __pyx_v_t0.strides[1]) ) + __pyx_t_17 * __pyx_v_t0.strides[2]) ))));
+326: tmp[0] = logsumexp(two_v_view)
__pyx_t_17 = 0; __pyx_t_9 = -1; if (__pyx_t_17 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_tmp.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 326, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_17 * __pyx_v_tmp.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_two_v_view);
327:
328: ### Do the other states
329: # Preprocessing:
+330: three_v_view[0] = e_mat0[0, i] + bwd[0] + t0[i, 1, 0]
__pyx_t_17 = 0; __pyx_t_16 = __pyx_v_i; __pyx_t_9 = -1; if (__pyx_t_17 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_16 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat0.shape[1])) __pyx_t_9 = 1; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 330, __pyx_L1_error) } __pyx_t_13 = 0; __pyx_t_9 = -1; if (__pyx_t_13 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 330, __pyx_L1_error) } __pyx_t_8 = __pyx_v_i; __pyx_t_10 = 1; __pyx_t_15 = 0; __pyx_t_9 = -1; if (__pyx_t_8 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_10 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1; if (__pyx_t_15 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 330, __pyx_L1_error) } __pyx_t_21 = 0; __pyx_t_9 = -1; if (__pyx_t_21 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_three_v_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 330, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_21 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_13 * __pyx_v_bwd.strides[0]) )))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_8 * __pyx_v_t0.strides[0]) ) + __pyx_t_10 * __pyx_v_t0.strides[1]) ) + __pyx_t_15 * __pyx_v_t0.strides[2]) ))));
+331: three_v_view[1] = f_l + t0[i, 1, 2] # Coming from other ROH State
__pyx_t_15 = __pyx_v_i; __pyx_t_10 = 1; __pyx_t_8 = 2; __pyx_t_9 = -1; if (__pyx_t_15 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t0.shape[0])) __pyx_t_9 = 0; if (__pyx_t_10 < 0) { __pyx_t_9 = 1; } else if (unlikely(__pyx_t_10 >= __pyx_v_t0.shape[1])) __pyx_t_9 = 1; if (__pyx_t_8 < 0) { __pyx_t_9 = 2; } else if (unlikely(__pyx_t_8 >= __pyx_v_t0.shape[2])) __pyx_t_9 = 2; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 331, __pyx_L1_error) } __pyx_t_13 = 1; __pyx_t_9 = -1; if (__pyx_t_13 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 331, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_f_l + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t0.data + __pyx_t_15 * __pyx_v_t0.strides[0]) ) + __pyx_t_10 * __pyx_v_t0.strides[1]) ) + __pyx_t_8 * __pyx_v_t0.strides[2]) ))));
332:
+333: for j in range(1, n_states): # Do the final run over all states
__pyx_t_9 = __pyx_v_n_states; __pyx_t_11 = __pyx_t_9; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+334: three_v_view[2] = e_mat0[j, i] + bwd[j] + stay
__pyx_t_8 = __pyx_v_j; __pyx_t_10 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_8 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_10 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_10 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 334, __pyx_L1_error) } __pyx_t_15 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 334, __pyx_L1_error) } __pyx_t_13 = 2; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 334, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_13 * __pyx_v_three_v_view.strides[0]) )) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_8 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_10 * __pyx_v_e_mat0.strides[1]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) )))) + __pyx_v_stay);
+335: tmp[j] = logsumexp(three_v_view) # Fill in the backward Probability
__pyx_t_15 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 335, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_15 * __pyx_v_tmp.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_logsumexp(__pyx_v_three_v_view); }
336:
337: ### Make tmp new bwd vec:
+338: for j in range(0, n_states):
__pyx_t_9 = __pyx_v_n_states; __pyx_t_11 = __pyx_t_9; for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_11; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+339: bwd[j] = tmp[j]
__pyx_t_15 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_tmp.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 339, __pyx_L1_error) } __pyx_t_10 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_10 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 339, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_10 * __pyx_v_bwd.strides[0]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_tmp.data + __pyx_t_15 * __pyx_v_tmp.strides[0]) ))); }
340:
341: ### Finalize the 0 Posterior
+342: post_view[i-1] = post_view[i-1] + bwd[0] - tot_ll
__pyx_t_15 = (__pyx_v_i - 1); __pyx_t_9 = -1; if (__pyx_t_15 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 342, __pyx_L1_error) } __pyx_t_10 = 0; __pyx_t_9 = -1; if (__pyx_t_10 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_10 >= __pyx_v_bwd.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 342, __pyx_L1_error) } __pyx_t_8 = (__pyx_v_i - 1); __pyx_t_9 = -1; if (__pyx_t_8 < 0) { __pyx_t_9 = 0; } else if (unlikely(__pyx_t_8 >= __pyx_v_post_view.shape[0])) __pyx_t_9 = 0; if (unlikely(__pyx_t_9 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_9); __PYX_ERR(0, 342, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_8 * __pyx_v_post_view.strides[0]) )) = (((*((double *) ( /* dim=0 */ (__pyx_v_post_view.data + __pyx_t_15 * __pyx_v_post_view.strides[0]) ))) + (*((double *) ( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_10 * __pyx_v_bwd.strides[0]) )))) - __pyx_v_tot_ll); }
343:
+344: post = np.exp(post) # To transform to normal space
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_exp); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_3, __pyx_v_post) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_v_post); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 344, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_2); __pyx_t_2 = 0;
+345: if output:
__pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 345, __pyx_L1_error) if (__pyx_t_22) { /* … */ }
+346: print(f"Total Log likelihood: {tot_ll: .3f}")
__pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_Format(__pyx_t_2, __pyx_kp_u_3f); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+347: print_memory_usage() ## For MEMORY_BENCH
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 347, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 347, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
348:
+349: if full==False:
__pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 349, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_22) { /* … */ }
+350: return post[None,:] # For "fake" axis
__Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_post, __pyx_tuple__9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* … */ __pyx_tuple__9 = PyTuple_Pack(2, Py_None, __pyx_slice__3); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 350, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__9); __Pyx_GIVEREF(__pyx_tuple__9);
351:
+352: elif full==True: # Return everything
__pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) __pyx_t_22 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_22 < 0)) __PYX_ERR(0, 352, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_22) { /* … */ }
+353: return post[None,:], fwd0, bwd0, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_1 = __Pyx_PyObject_GetItem(__pyx_v_post, __pyx_tuple__9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 353, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_tot_ll); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 353, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 353, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __Pyx_INCREF(__pyx_v_fwd0); __Pyx_GIVEREF(__pyx_v_fwd0); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_fwd0); __Pyx_INCREF(__pyx_v_bwd0); __Pyx_GIVEREF(__pyx_v_bwd0); PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_bwd0); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 3, __pyx_t_2); __pyx_t_1 = 0; __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0;
354:
355: ###############################################################################
356:
+357: def fwd_bkwd_scaled(double[:, :] e_mat, double[:, :, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_8fwd_bkwd_scaled[] = "Takes emission and transition probabilities, and calculates posteriors.\n Uses speed-up specific for Genotype data (pooling same transition rates)\n Uses rescaling of fwd and bwd matrices\n e_mat: Emission probabilities [k x l] (normal space)\n t_mat: Transition Matrix: [l x 3 x 3] (normal space)\n in_val: Intitial probability of single symmetric state (normal space)\n full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n output: Whether to print output useful for monitoring\n Otherwise only posterior mat [kxl] of post is returned\n "; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_9fwd_bkwd_scaled = {"fwd_bkwd_scaled", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_8fwd_bkwd_scaled}; static PyObject *__pyx_pw_6ancIBD_5cfunc_9fwd_bkwd_scaled(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_v_output = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_scaled (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_8fwd_bkwd_scaled(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; double __pyx_v_stay; double __pyx_v_x1; double __pyx_v_x2; double __pyx_v_x3; PyObject *__pyx_v_post = NULL; PyObject *__pyx_v_c = NULL; __Pyx_memviewslice __pyx_v_c_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_temp = NULL; __Pyx_memviewslice __pyx_v_temp_v = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_temp1 = NULL; __Pyx_memviewslice __pyx_v_temp1_v = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_fwd1 = NULL; __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_bwd1 = NULL; __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_f_l = NULL; PyObject *__pyx_v_tot_ll = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_scaled", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __Pyx_XDECREF(__pyx_t_24); __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_post); __Pyx_XDECREF(__pyx_v_c); __PYX_XDEC_MEMVIEW(&__pyx_v_c_view, 1); __Pyx_XDECREF(__pyx_v_temp); __PYX_XDEC_MEMVIEW(&__pyx_v_temp_v, 1); __Pyx_XDECREF(__pyx_v_temp1); __PYX_XDEC_MEMVIEW(&__pyx_v_temp1_v, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); __Pyx_XDECREF(__pyx_v_fwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1); __Pyx_XDECREF(__pyx_v_bwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1); __Pyx_XDECREF(__pyx_v_f_l); __Pyx_XDECREF(__pyx_v_tot_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__37 = PyTuple_Pack(28, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_x3, __pyx_n_s_post, __pyx_n_s_c, __pyx_n_s_c_view, __pyx_n_s_temp, __pyx_n_s_temp_v, __pyx_n_s_temp1, __pyx_n_s_temp1_v, __pyx_n_s_t, __pyx_n_s_fwd1, __pyx_n_s_fwd, __pyx_n_s_bwd1, __pyx_n_s_bwd, __pyx_n_s_f_l, __pyx_n_s_tot_ll); if (unlikely(!__pyx_tuple__37)) __PYX_ERR(0, 357, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__37); __Pyx_GIVEREF(__pyx_tuple__37); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_9fwd_bkwd_scaled, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 357, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_scaled, __pyx_t_2) < 0) __PYX_ERR(0, 357, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__38 = (PyObject*)__Pyx_PyCode_New(5, 0, 28, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__37, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_scaled, 357, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__38)) __PYX_ERR(0, 357, __pyx_L1_error)
+358: double in_val = 1e-4, full=False, output=True):
values[3] = ((PyObject *)Py_False); values[4] = ((PyObject *)Py_True); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled", 0, 2, 5, 1); __PYX_ERR(0, 357, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output); if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_scaled") < 0)) __PYX_ERR(0, 357, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 357, __pyx_L3_error) __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 357, __pyx_L3_error) if (values[2]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 358, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[3]; __pyx_v_output = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 357, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_8fwd_bkwd_scaled(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
359: """Takes emission and transition probabilities, and calculates posteriors.
360: Uses speed-up specific for Genotype data (pooling same transition rates)
361: Uses rescaling of fwd and bwd matrices
362: e_mat: Emission probabilities [k x l] (normal space)
363: t_mat: Transition Matrix: [l x 3 x 3] (normal space)
364: in_val: Intitial probability of single symmetric state (normal space)
365: full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
366: output: Whether to print output useful for monitoring
367: Otherwise only posterior mat [kxl] of post is returned
368: """
+369: cdef int n_states = e_mat.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+370: cdef int n_loci = e_mat.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
371: cdef Py_ssize_t i, j, k # The Array and Iteration Indices
372: cdef double stay # The Probablility of Staying
373: cdef double x1, x2, x3 # Place holder variables [make code readable]
374:
375: # Initialize Posterior and Transition Probabilities
+376: post = np.empty([n_states, n_loci], dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 376, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_post = __pyx_t_1; __pyx_t_1 = 0;
377:
+378: c = np.empty(n_loci, dtype=DTYPE) # Array of normalization constants
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 378, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_c = __pyx_t_2; __pyx_t_2 = 0;
+379: cdef double[:] c_view = c
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_c, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 379, __pyx_L1_error) __pyx_v_c_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
380:
+381: temp = np.empty(n_states, dtype=DTYPE) # l Array for calculations
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 381, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_temp = __pyx_t_4; __pyx_t_4 = 0;
+382: cdef double[:] temp_v = temp
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 382, __pyx_L1_error) __pyx_v_temp_v = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
383:
+384: temp1 = np.empty(n_states-1, dtype=DTYPE) # l-1 Array for calculatons
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_temp1 = __pyx_t_1; __pyx_t_1 = 0;
+385: cdef double[:] temp1_v = temp1
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 385, __pyx_L1_error) __pyx_v_temp1_v = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
386:
+387: cdef double[:,:,:] t = t_mat # C View of transition matrix
__PYX_INC_MEMVIEW(&__pyx_v_t_mat, 0); __pyx_v_t = __pyx_v_t_mat;
388:
389: ### Initialize FWD BWD matrices with first and last entries filled
+390: fwd1 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 390, __pyx_L1_error) __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 390, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_fwd1 = __pyx_t_1; __pyx_t_1 = 0;
+391: fwd1[:, 0] = in_val # Initial Probabilities
__pyx_t_1 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 391, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__4, __pyx_t_1) < 0)) __PYX_ERR(0, 391, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+392: fwd1[0, 0] = 1 - (n_states - 1) * in_val
__pyx_t_1 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 392, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__5, __pyx_t_1) < 0)) __PYX_ERR(0, 392, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+393: cdef double[:,:] fwd = fwd1
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 393, __pyx_L1_error) __pyx_v_fwd = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
394:
+395: c_view[0] = 1 # Set the first normalization constant
__pyx_t_7 = 0; __pyx_t_8 = -1; if (__pyx_t_7 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 395, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) )) = 1.0;
396:
+397: bwd1 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_zeros); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 397, __pyx_L1_error) __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 397, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_bwd1 = __pyx_t_1; __pyx_t_1 = 0;
+398: bwd1[:, -1] = 1 # The initial values for the backward pass
if (unlikely(PyObject_SetItem(__pyx_v_bwd1, __pyx_tuple__6, __pyx_int_1) < 0)) __PYX_ERR(0, 398, __pyx_L1_error)
399: #bwd1[0, -1] = 1 - (n_states - 1) * in_val
+400: cdef double[:,:] bwd = bwd1
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 400, __pyx_L1_error) __pyx_v_bwd = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
401:
402: #############################
403: ### Do the Forward Algorithm
+404: for i in range(1, n_loci): # Run forward recursion
__pyx_t_8 = __pyx_v_n_loci; __pyx_t_9 = __pyx_t_8; for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10;
+405: stay = t[i, 1, 1] - t[i, 1, 2] # Do the log of the Stay term
__pyx_t_7 = __pyx_v_i; __pyx_t_11 = 1; __pyx_t_12 = 1; __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_11 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_12 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 405, __pyx_L1_error) } __pyx_t_14 = __pyx_v_i; __pyx_t_15 = 1; __pyx_t_16 = 2; __pyx_t_13 = -1; if (__pyx_t_14 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_15 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_16 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 405, __pyx_L1_error) } __pyx_v_stay = ((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_7 * __pyx_v_t.strides[0]) ) + __pyx_t_11 * __pyx_v_t.strides[1]) ) + __pyx_t_12 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_15 * __pyx_v_t.strides[1]) ) + __pyx_t_16 * __pyx_v_t.strides[2]) ))));
406:
407: #for k in range(1, n_states): # Calculate Sum of ROH states.
+408: f_l = 1 - fwd[0, i-1] ### Assume they are normalized!!!
__pyx_t_16 = 0; __pyx_t_15 = (__pyx_v_i - 1); __pyx_t_13 = -1; if (__pyx_t_16 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_15 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 408, __pyx_L1_error) } __pyx_t_1 = PyFloat_FromDouble((1.0 - (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_16 * __pyx_v_fwd.strides[0]) ) + __pyx_t_15 * __pyx_v_fwd.strides[1]) ))))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 408, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_f_l, __pyx_t_1); __pyx_t_1 = 0;
409:
410: ### Do the 0 State:
+411: x1 = fwd[0, i - 1] * t[i, 0, 0] # Staying in 0 State
__pyx_t_15 = 0; __pyx_t_16 = (__pyx_v_i - 1); __pyx_t_13 = -1; if (__pyx_t_15 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_16 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 411, __pyx_L1_error) } __pyx_t_14 = __pyx_v_i; __pyx_t_12 = 0; __pyx_t_11 = 0; __pyx_t_13 = -1; if (__pyx_t_14 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_12 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_11 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 411, __pyx_L1_error) } __pyx_v_x1 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_15 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) ))));
+412: x2 = f_l * t[i, 1, 0] # Going into 0 State from any other
__pyx_t_11 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_14 = 0; __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_12 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_14 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 412, __pyx_L1_error) } __pyx_t_1 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_11 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_14 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 412, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 412, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_17 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 412, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_x2 = __pyx_t_17;
+413: temp_v[0] = e_mat[0, i] * (x1 + x2) # Set the unnorm. 0 forward variable
__pyx_t_14 = 0; __pyx_t_12 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_14 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0; if (__pyx_t_12 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 413, __pyx_L1_error) } __pyx_t_11 = 0; __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 413, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_14 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_12 * __pyx_v_e_mat.strides[1]) ))) * (__pyx_v_x1 + __pyx_v_x2));
414:
415: ### Do the other states
416: # Preprocessing:
+417: x1 = fwd[0, i - 1] * t[i, 0, 1] # Coming from 0 State
__pyx_t_12 = 0; __pyx_t_14 = (__pyx_v_i - 1); __pyx_t_13 = -1; if (__pyx_t_12 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_fwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_14 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_v_fwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 417, __pyx_L1_error) } __pyx_t_11 = __pyx_v_i; __pyx_t_16 = 0; __pyx_t_15 = 1; __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_16 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_15 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 417, __pyx_L1_error) } __pyx_v_x1 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_12 * __pyx_v_fwd.strides[0]) ) + __pyx_t_14 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_11 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))));
+418: x2 = f_l * t[i, 1, 2] # Coming from other ROH State
__pyx_t_15 = __pyx_v_i; __pyx_t_16 = 1; __pyx_t_11 = 2; __pyx_t_13 = -1; if (__pyx_t_15 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[0])) __pyx_t_13 = 0; if (__pyx_t_16 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_13 = 1; if (__pyx_t_11 < 0) { __pyx_t_13 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_13 = 2; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 418, __pyx_L1_error) } __pyx_t_4 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_15 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_17 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_17 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 418, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_x2 = __pyx_t_17;
419:
+420: for j in range(1, n_states): # Do the final run over all states
__pyx_t_13 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_13; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+421: x3 = fwd[j, i-1] * stay # Staying in state
__pyx_t_11 = __pyx_v_j; __pyx_t_16 = (__pyx_v_i - 1); __pyx_t_20 = -1; if (__pyx_t_11 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_16 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 421, __pyx_L1_error) } __pyx_v_x3 = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_11 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) ))) * __pyx_v_stay);
+422: temp_v[j] = e_mat[j, i] * (x1 + x2 + x3)
__pyx_t_16 = __pyx_v_j; __pyx_t_11 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_16 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[0])) __pyx_t_20 = 0; if (__pyx_t_11 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_e_mat.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 422, __pyx_L1_error) } __pyx_t_15 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_15 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_temp_v.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 422, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_15 * __pyx_v_temp_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_16 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_11 * __pyx_v_e_mat.strides[1]) ))) * ((__pyx_v_x1 + __pyx_v_x2) + __pyx_v_x3)); }
423:
424: ### Do the normalization
+425: c_view[i] = sum_array(temp_v, n_states)
__pyx_t_11 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_c_view.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 425, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_11 * __pyx_v_c_view.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp_v, __pyx_v_n_states);
+426: for j in range(n_states):
__pyx_t_13 = __pyx_v_n_states; __pyx_t_18 = __pyx_t_13; for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_18; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+427: fwd[j,i] = temp_v[j] / c_view[i] # Rescale to prob. distribution
__pyx_t_11 = __pyx_v_j; __pyx_t_20 = -1; if (__pyx_t_11 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 427, __pyx_L1_error) } __pyx_t_17 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) ))); __pyx_t_11 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_11 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_c_view.shape[0])) __pyx_t_20 = 0; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 427, __pyx_L1_error) } __pyx_t_21 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_11 * __pyx_v_c_view.strides[0]) ))); if (unlikely(__pyx_t_21 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 427, __pyx_L1_error) } __pyx_t_11 = __pyx_v_j; __pyx_t_16 = __pyx_v_i; __pyx_t_20 = -1; if (__pyx_t_11 < 0) { __pyx_t_20 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_fwd.shape[0])) __pyx_t_20 = 0; if (__pyx_t_16 < 0) { __pyx_t_20 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_fwd.shape[1])) __pyx_t_20 = 1; if (unlikely(__pyx_t_20 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_20); __PYX_ERR(0, 427, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_11 * __pyx_v_fwd.strides[0]) ) + __pyx_t_16 * __pyx_v_fwd.strides[1]) )) = (__pyx_t_17 / __pyx_t_21); } }
428:
429: #############################
430: ### Do the Backward Algorithm
+431: for i in range(n_loci-1, 0, -1): # Run backward recursion
for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) { __pyx_v_i = __pyx_t_10;
+432: stay = t[i, 1, 1] - t[i, 1, 2]
__pyx_t_16 = __pyx_v_i; __pyx_t_11 = 1; __pyx_t_15 = 1; __pyx_t_8 = -1; if (__pyx_t_16 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_11 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_15 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 432, __pyx_L1_error) } __pyx_t_14 = __pyx_v_i; __pyx_t_12 = 1; __pyx_t_7 = 2; __pyx_t_8 = -1; if (__pyx_t_14 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_12 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_7 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 432, __pyx_L1_error) } __pyx_v_stay = ((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_16 * __pyx_v_t.strides[0]) ) + __pyx_t_11 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))) - (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_14 * __pyx_v_t.strides[0]) ) + __pyx_t_12 * __pyx_v_t.strides[1]) ) + __pyx_t_7 * __pyx_v_t.strides[2]) ))));
433:
+434: for k in range(1, n_states): # Calculate logsum of ROH states:
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) { __pyx_v_k = __pyx_t_19;
+435: temp1_v[k-1] = bwd[k, i] * e_mat[k, i]
__pyx_t_7 = __pyx_v_k; __pyx_t_12 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_12 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_12 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 435, __pyx_L1_error) } __pyx_t_14 = __pyx_v_k; __pyx_t_15 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_14 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0; if (__pyx_t_15 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 435, __pyx_L1_error) } __pyx_t_11 = (__pyx_v_k - 1); __pyx_t_13 = -1; if (__pyx_t_11 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_temp1_v.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 435, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp1_v.data + __pyx_t_11 * __pyx_v_temp1_v.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_7 * __pyx_v_bwd.strides[0]) ) + __pyx_t_12 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_14 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_15 * __pyx_v_e_mat.strides[1]) )))); }
+436: f_l = sum_array(temp1_v, n_states-1) # Logsum of ROH States
__pyx_t_1 = PyFloat_FromDouble(__pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp1_v, (__pyx_v_n_states - 1))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 436, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_XDECREF_SET(__pyx_v_f_l, __pyx_t_1); __pyx_t_1 = 0;
437:
438: # Do the 0 State:
+439: x1 = bwd[0, i] * t[i, 0, 0] * e_mat[0, i] # Staying in 0 State
__pyx_t_15 = 0; __pyx_t_14 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_15 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_14 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 439, __pyx_L1_error) } __pyx_t_12 = __pyx_v_i; __pyx_t_7 = 0; __pyx_t_11 = 0; __pyx_t_8 = -1; if (__pyx_t_12 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_7 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_11 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 439, __pyx_L1_error) } __pyx_t_16 = 0; __pyx_t_22 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_16 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[0])) __pyx_t_8 = 0; if (__pyx_t_22 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 439, __pyx_L1_error) } __pyx_v_x1 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_14 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_12 * __pyx_v_t.strides[0]) ) + __pyx_t_7 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_16 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_22 * __pyx_v_e_mat.strides[1]) ))));
+440: x2 = f_l * t[i, 0, 1] # Going into 0 State
__pyx_t_22 = __pyx_v_i; __pyx_t_16 = 0; __pyx_t_11 = 1; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_16 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_11 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_11 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 440, __pyx_L1_error) } __pyx_t_1 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_22 * __pyx_v_t.strides[0]) ) + __pyx_t_16 * __pyx_v_t.strides[1]) ) + __pyx_t_11 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 440, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 440, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_21 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 440, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_x2 = __pyx_t_21;
+441: temp_v[0] = x1 + x2
__pyx_t_11 = 0; __pyx_t_8 = -1; if (__pyx_t_11 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_temp_v.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 441, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_11 * __pyx_v_temp_v.strides[0]) )) = (__pyx_v_x1 + __pyx_v_x2);
442:
443: ### Do the other states
444: # Preprocessing:
+445: x1 = e_mat[0, i] * bwd[0, i] * t[i, 1, 0]
__pyx_t_11 = 0; __pyx_t_16 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_11 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_11 >= __pyx_v_e_mat.shape[0])) __pyx_t_8 = 0; if (__pyx_t_16 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_e_mat.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 445, __pyx_L1_error) } __pyx_t_22 = 0; __pyx_t_7 = __pyx_v_i; __pyx_t_8 = -1; if (__pyx_t_22 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_bwd.shape[0])) __pyx_t_8 = 0; if (__pyx_t_7 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[1])) __pyx_t_8 = 1; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 445, __pyx_L1_error) } __pyx_t_12 = __pyx_v_i; __pyx_t_14 = 1; __pyx_t_15 = 0; __pyx_t_8 = -1; if (__pyx_t_12 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_14 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_15 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 445, __pyx_L1_error) } __pyx_v_x1 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_11 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_16 * __pyx_v_e_mat.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_22 * __pyx_v_bwd.strides[0]) ) + __pyx_t_7 * __pyx_v_bwd.strides[1]) )))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_12 * __pyx_v_t.strides[0]) ) + __pyx_t_14 * __pyx_v_t.strides[1]) ) + __pyx_t_15 * __pyx_v_t.strides[2]) ))));
+446: x2 = f_l * t[i, 1, 2] # Coming from other ROH State
__pyx_t_15 = __pyx_v_i; __pyx_t_14 = 1; __pyx_t_12 = 2; __pyx_t_8 = -1; if (__pyx_t_15 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t.shape[0])) __pyx_t_8 = 0; if (__pyx_t_14 < 0) { __pyx_t_8 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_v_t.shape[1])) __pyx_t_8 = 1; if (__pyx_t_12 < 0) { __pyx_t_8 = 2; } else if (unlikely(__pyx_t_12 >= __pyx_v_t.shape[2])) __pyx_t_8 = 2; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 446, __pyx_L1_error) } __pyx_t_4 = PyFloat_FromDouble((*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_15 * __pyx_v_t.strides[0]) ) + __pyx_t_14 * __pyx_v_t.strides[1]) ) + __pyx_t_12 * __pyx_v_t.strides[2]) )))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 446, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyNumber_Multiply(__pyx_v_f_l, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 446, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_21 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_21 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 446, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_x2 = __pyx_t_21;
447:
+448: for j in range(1, n_states): # Do the final run over all states
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_19 = 1; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+449: x3 = e_mat[j, i] * bwd[j, i] * stay
__pyx_t_12 = __pyx_v_j; __pyx_t_14 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_12 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_12 >= __pyx_v_e_mat.shape[0])) __pyx_t_13 = 0; if (__pyx_t_14 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_14 >= __pyx_v_e_mat.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 449, __pyx_L1_error) } __pyx_t_15 = __pyx_v_j; __pyx_t_7 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_15 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_7 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 449, __pyx_L1_error) } __pyx_v_x3 = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_12 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_14 * __pyx_v_e_mat.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_15 * __pyx_v_bwd.strides[0]) ) + __pyx_t_7 * __pyx_v_bwd.strides[1]) )))) * __pyx_v_stay);
+450: temp_v[j] = x1 + x2 + x3 # Fill in the backward Probability
__pyx_t_7 = __pyx_v_j; __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 450, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_7 * __pyx_v_temp_v.strides[0]) )) = ((__pyx_v_x1 + __pyx_v_x2) + __pyx_v_x3); }
451:
452: ### Do the normalization
+453: for j in range(n_states):
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_19 = 0; __pyx_t_19 < __pyx_t_9; __pyx_t_19+=1) { __pyx_v_j = __pyx_t_19;
+454: bwd[j, i - 1] = temp_v[j] / c_view[i] # Rescale to prob. distribution
__pyx_t_7 = __pyx_v_j; __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_temp_v.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 454, __pyx_L1_error) } __pyx_t_21 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_7 * __pyx_v_temp_v.strides[0]) ))); __pyx_t_7 = __pyx_v_i; __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_13 = 0; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 454, __pyx_L1_error) } __pyx_t_17 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) ))); if (unlikely(__pyx_t_17 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 454, __pyx_L1_error) } __pyx_t_7 = __pyx_v_j; __pyx_t_15 = (__pyx_v_i - 1); __pyx_t_13 = -1; if (__pyx_t_7 < 0) { __pyx_t_13 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_bwd.shape[0])) __pyx_t_13 = 0; if (__pyx_t_15 < 0) { __pyx_t_13 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_bwd.shape[1])) __pyx_t_13 = 1; if (unlikely(__pyx_t_13 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_13); __PYX_ERR(0, 454, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_7 * __pyx_v_bwd.strides[0]) ) + __pyx_t_15 * __pyx_v_bwd.strides[1]) )) = (__pyx_t_21 / __pyx_t_17); } }
455:
456: ### Combine the forward and backward calculations for posterior
+457: post = fwd1 * bwd1
__pyx_t_1 = PyNumber_Multiply(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 457, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_1); __pyx_t_1 = 0;
+458: if output:
__pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 458, __pyx_L1_error) if (__pyx_t_23) { /* … */ }
+459: print("Memory Usage at end of HMM:")
__pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 459, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* … */ __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_u_Memory_Usage_at_end_of_HMM); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 459, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10);
+460: print_memory_usage() ## For MEMORY_BENCH
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); } } __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 460, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
461:
+462: if full==False:
__pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 462, __pyx_L1_error) __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 462, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_23) { /* … */ }
+463: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
464:
+465: elif full==True: # Return everything
__pyx_t_1 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error) __pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_23) { /* … */ }
+466: tot_ll = np.sum(np.log(c)) # Tot Likelihood is product over all c.
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_sum); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_log); if (unlikely(!__pyx_t_24)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_24); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_24))) { __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_24); if (likely(__pyx_t_2)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_24); __Pyx_INCREF(__pyx_t_2); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_24, function); } } __pyx_t_4 = (__pyx_t_2) ? __Pyx_PyObject_Call2Args(__pyx_t_24, __pyx_t_2, __pyx_v_c) : __Pyx_PyObject_CallOneArg(__pyx_t_24, __pyx_v_c); __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_24); __pyx_t_24 = 0; __pyx_t_24 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_24 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_24)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_24); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_1 = (__pyx_t_24) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_24, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); __Pyx_XDECREF(__pyx_t_24); __pyx_t_24 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 466, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_tot_ll = __pyx_t_1; __pyx_t_1 = 0;
+467: if output:
__pyx_t_23 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_23 < 0)) __PYX_ERR(0, 467, __pyx_L1_error) if (__pyx_t_23) { /* … */ }
+468: print(f"Total Log likelihood: {tot_ll: .3f}")
__pyx_t_1 = __Pyx_PyObject_Format(__pyx_v_tot_ll, __pyx_kp_u_3f); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 468, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 468, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 468, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+469: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(__pyx_v_post); __Pyx_GIVEREF(__pyx_v_post); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_post); __Pyx_INCREF(__pyx_v_fwd1); __Pyx_GIVEREF(__pyx_v_fwd1); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_fwd1); __Pyx_INCREF(__pyx_v_bwd1); __Pyx_GIVEREF(__pyx_v_bwd1); PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_bwd1); __Pyx_INCREF(__pyx_v_tot_ll); __Pyx_GIVEREF(__pyx_v_tot_ll); PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_tot_ll); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0;
470:
471: ###############################################################################
472: ###############################################################################
473: ### Viterbi Path
474:
+475: def viterbi_path(double[:, :] e_mat0, double[:, :, :] t_mat0, double[:] end_p0):
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_11viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_10viterbi_path[] = "Implementation of a Viterbi Path.\n e_mat0 Matrices with Emission Probabilities, [k,l] (log space)\n t_mat: Transition Matrix: [l x 3 x 3] (normal space)\n end_p: probability to begin/end in states [k]"; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_11viterbi_path = {"viterbi_path", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_11viterbi_path, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_10viterbi_path}; static PyObject *__pyx_pw_6ancIBD_5cfunc_11viterbi_path(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat0 = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_end_p0 = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("viterbi_path (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat0,&__pyx_n_s_t_mat0,&__pyx_n_s_end_p0,0}; PyObject* values[3] = {0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat0)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, 1); __PYX_ERR(0, 475, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_end_p0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, 2); __PYX_ERR(0, 475, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "viterbi_path") < 0)) __PYX_ERR(0, 475, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); } __pyx_v_e_mat0 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat0.memview)) __PYX_ERR(0, 475, __pyx_L3_error) __pyx_v_t_mat0 = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat0.memview)) __PYX_ERR(0, 475, __pyx_L3_error) __pyx_v_end_p0 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(values[2], PyBUF_WRITABLE); if (unlikely(!__pyx_v_end_p0.memview)) __PYX_ERR(0, 475, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("viterbi_path", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 475, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.viterbi_path", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_10viterbi_path(__pyx_self, __pyx_v_e_mat0, __pyx_v_t_mat0, __pyx_v_end_p0); int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_10viterbi_path(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat0, __Pyx_memviewslice __pyx_v_t_mat0, __Pyx_memviewslice __pyx_v_end_p0) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_k; int __pyx_v_m; double __pyx_v_v; __Pyx_memviewslice __pyx_v_mp = { 0, 0, { 0 }, { 0 }, { 0 } }; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_new_p = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_pt = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_trans_ll = NULL; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_trans_ll_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_three_v = NULL; __Pyx_memviewslice __pyx_v_three_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_three_vi = NULL; __Pyx_memviewslice __pyx_v_three_vi_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_two_v = NULL; __Pyx_memviewslice __pyx_v_two_v_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_two_vi = NULL; __Pyx_memviewslice __pyx_v_two_vi_view = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_path = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_x = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("viterbi_path", 0); /* … */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __Pyx_XDECREF(__pyx_t_7); __PYX_XDEC_MEMVIEW(&__pyx_t_8, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_9, 1); __Pyx_AddTraceback("ancIBD.cfunc.viterbi_path", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __PYX_XDEC_MEMVIEW(&__pyx_v_mp, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_new_p, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_pt, 1); __Pyx_XDECREF(__pyx_v_trans_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_trans_ll_view, 1); __Pyx_XDECREF(__pyx_v_three_v); __PYX_XDEC_MEMVIEW(&__pyx_v_three_v_view, 1); __Pyx_XDECREF(__pyx_v_three_vi); __PYX_XDEC_MEMVIEW(&__pyx_v_three_vi_view, 1); __Pyx_XDECREF(__pyx_v_two_v); __PYX_XDEC_MEMVIEW(&__pyx_v_two_v_view, 1); __Pyx_XDECREF(__pyx_v_two_vi); __PYX_XDEC_MEMVIEW(&__pyx_v_two_vi_view, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_path, 1); __Pyx_XDECREF(__pyx_v_x); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat0, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_end_p0, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__39 = PyTuple_Pack(25, __pyx_n_s_e_mat0, __pyx_n_s_t_mat0, __pyx_n_s_end_p0, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_m, __pyx_n_s_v, __pyx_n_s_mp, __pyx_n_s_new_p, __pyx_n_s_pt, __pyx_n_s_trans_ll, __pyx_n_s_trans_ll_view, __pyx_n_s_three_v, __pyx_n_s_three_v_view, __pyx_n_s_three_vi, __pyx_n_s_three_vi_view, __pyx_n_s_two_v, __pyx_n_s_two_v_view, __pyx_n_s_two_vi, __pyx_n_s_two_vi_view, __pyx_n_s_path, __pyx_n_s_x); if (unlikely(!__pyx_tuple__39)) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__39); __Pyx_GIVEREF(__pyx_tuple__39); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_11viterbi_path, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_viterbi_path, __pyx_t_2) < 0) __PYX_ERR(0, 475, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__40 = (PyObject*)__Pyx_PyCode_New(3, 0, 25, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__39, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_viterbi_path, 475, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__40)) __PYX_ERR(0, 475, __pyx_L1_error)
476: """Implementation of a Viterbi Path.
477: e_mat0 Matrices with Emission Probabilities, [k,l] (log space)
478: t_mat: Transition Matrix: [l x 3 x 3] (normal space)
479: end_p: probability to begin/end in states [k]"""
+480: cdef int n_states = e_mat0.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat0.shape[0]);
+481: cdef int n_loci = e_mat0.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat0.shape[1]);
482: cdef Py_ssize_t i, j, k # The Array Indices
483: cdef int m # Placeholder for Maximum
484: cdef double v # Value to set
485:
486: # Do the actual optimization (with back-tracking)
487: # Initialize Views:
+488: cdef double[:, :] mp = np.empty((n_states, n_loci), dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_t_1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 488, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_mp = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
+489: cdef double[:] new_p = np.empty(n_states, dtype = DTYPE) # Temporary Array
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_t_2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 489, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_new_p = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
+490: cdef long[:,:] pt = np.empty((n_states, n_loci), dtype = np.int16) # Previous State Pointer
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_int16); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_7) < 0) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_8 = __Pyx_PyObject_to_MemoryviewSlice_dsds_long(__pyx_t_7, PyBUF_WRITABLE); if (unlikely(!__pyx_t_8.memview)) __PYX_ERR(0, 490, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_pt = __pyx_t_8; __pyx_t_8.memview = NULL; __pyx_t_8.data = NULL;
491:
+492: trans_ll = np.empty(n_states-1, dtype=DTYPE) # Array for pre-calculations
__Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 492, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_trans_ll = __pyx_t_1; __pyx_t_1 = 0;
+493: cdef double[:] trans_ll_view = trans_ll
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_trans_ll, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 493, __pyx_L1_error) __pyx_v_trans_ll_view = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
494:
+495: three_v = np.empty(3, dtype=DTYPE) # Array of size three
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple_, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 495, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_three_v = __pyx_t_3; __pyx_t_3 = 0;
+496: cdef double[:] three_v_view = three_v
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_three_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 496, __pyx_L1_error) __pyx_v_three_v_view = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
497:
+498: three_vi = np.empty(3, dtype=int) # Int Array of size three
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, ((PyObject *)(&PyInt_Type))) < 0) __PYX_ERR(0, 498, __pyx_L1_error) __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple_, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 498, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_three_vi = __pyx_t_7; __pyx_t_7 = 0;
+499: cdef long[:] three_vi_view = three_vi
__pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_v_three_vi, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 499, __pyx_L1_error) __pyx_v_three_vi_view = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
500:
+501: two_v = np.empty(2, dtype=DTYPE) # Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_empty); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_7, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_tuple__2, __pyx_t_7); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 501, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_two_v = __pyx_t_1; __pyx_t_1 = 0;
+502: cdef double[:] two_v_view = two_v
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_two_v, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 502, __pyx_L1_error) __pyx_v_two_v_view = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
503:
+504: two_vi = np.empty(2, dtype=int) # Int Array of size two
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 504, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 504, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 504, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, ((PyObject *)(&PyInt_Type))) < 0) __PYX_ERR(0, 504, __pyx_L1_error) __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_tuple__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 504, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_two_vi = __pyx_t_3; __pyx_t_3 = 0;
+505: cdef long[:] two_vi_view = two_vi
__pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_v_two_vi, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 505, __pyx_L1_error) __pyx_v_two_vi_view = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
506:
+507: for k in range(n_states):
__pyx_t_10 = __pyx_v_n_states; __pyx_t_11 = __pyx_t_10; for (__pyx_t_12 = 0; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_k = __pyx_t_12;
+508: mp[k, 0] = end_p0[k] # Initialize with Ending Probabilities
__pyx_t_13 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_end_p0.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 508, __pyx_L1_error) } __pyx_t_15 = __pyx_v_k; __pyx_t_16 = 0; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 508, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_15 * __pyx_v_mp.strides[0]) ) + __pyx_t_16 * __pyx_v_mp.strides[1]) )) = (*((double *) ( /* dim=0 */ (__pyx_v_end_p0.data + __pyx_t_13 * __pyx_v_end_p0.strides[0]) )));
509:
+510: two_vi_view[0] = 0
__pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 510, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_13 * __pyx_v_two_vi_view.strides[0]) )) = 0;
+511: three_vi_view[0] = 0
__pyx_t_13 = 0; __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 511, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_13 * __pyx_v_three_vi_view.strides[0]) )) = 0; }
512:
+513: for i in range(1, n_loci): # Do the Viterbi-Iteration
__pyx_t_10 = __pyx_v_n_loci; __pyx_t_11 = __pyx_t_10; for (__pyx_t_12 = 1; __pyx_t_12 < __pyx_t_11; __pyx_t_12+=1) { __pyx_v_i = __pyx_t_12;
514: ### Precomputation:
515: # Do the maximal log probability of 1, ...k State:
+516: m = argmax(mp[1:, i - 1])
__pyx_t_6.data = __pyx_v_mp.data; __pyx_t_6.memview = __pyx_v_mp.memview; __PYX_INC_MEMVIEW(&__pyx_t_6, 0); __pyx_t_14 = -1; if (unlikely(__pyx_memoryview_slice_memviewslice( &__pyx_t_6, __pyx_v_mp.shape[0], __pyx_v_mp.strides[0], __pyx_v_mp.suboffsets[0], 0, 0, &__pyx_t_14, 1, 0, 0, 1, 0, 0, 1) < 0)) { __PYX_ERR(0, 516, __pyx_L1_error) } { Py_ssize_t __pyx_tmp_idx = (__pyx_v_i - 1); Py_ssize_t __pyx_tmp_shape = __pyx_v_mp.shape[1]; Py_ssize_t __pyx_tmp_stride = __pyx_v_mp.strides[1]; if (unlikely(!__Pyx_is_valid_index(__pyx_tmp_idx, __pyx_tmp_shape))) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 1)"); __PYX_ERR(0, 516, __pyx_L1_error) } __pyx_t_6.data += __pyx_tmp_idx * __pyx_tmp_stride; } __pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_t_6); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
+517: v = mp[m+1, i - 1]
__pyx_t_13 = (__pyx_v_m + 1); __pyx_t_16 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_13 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_16 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 517, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_13 * __pyx_v_mp.strides[0]) ) + __pyx_t_16 * __pyx_v_mp.strides[1]) )));
518:
519: # Do the States from collapsed states
+520: two_vi_view[1] = m+1 # Set the Pointers
__pyx_t_16 = 1; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 520, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_16 * __pyx_v_two_vi_view.strides[0]) )) = (__pyx_v_m + 1);
+521: three_vi_view[1] = m+1
__pyx_t_16 = 1; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 521, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_16 * __pyx_v_three_vi_view.strides[0]) )) = (__pyx_v_m + 1);
522:
+523: two_v_view[1] = v + t_mat0[i, 1, 0]
__pyx_t_16 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_15 = 0; __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_15 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 523, __pyx_L1_error) } __pyx_t_17 = 1; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 523, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_17 * __pyx_v_two_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_16 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_15 * __pyx_v_t_mat0.strides[2]) ))));
+524: three_v_view[1] = v + t_mat0[i, 1, 2] # Move in from other ROH
__pyx_t_15 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_16 = 2; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_16 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 524, __pyx_L1_error) } __pyx_t_17 = 1; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 524, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_17 * __pyx_v_three_v_view.strides[0]) )) = (__pyx_v_v + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_15 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_16 * __pyx_v_t_mat0.strides[2]) ))));
525:
526: ### Do the zero State
+527: two_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 0]
__pyx_t_16 = 0; __pyx_t_13 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_16 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 527, __pyx_L1_error) } __pyx_t_15 = __pyx_v_i; __pyx_t_17 = 0; __pyx_t_18 = 0; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_17 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_18 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 527, __pyx_L1_error) } __pyx_t_19 = 0; __pyx_t_14 = -1; if (__pyx_t_19 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 527, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_19 * __pyx_v_two_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_16 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_15 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_18 * __pyx_v_t_mat0.strides[2]) ))));
528:
+529: m = argmax(two_v_view) ### Do a Maximum
__pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_v_two_v_view);
+530: v = two_v_view[m]
__pyx_t_18 = __pyx_v_m; __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_two_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 530, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_two_v_view.data + __pyx_t_18 * __pyx_v_two_v_view.strides[0]) )));
+531: mp[0, i] = v + e_mat0[0, i] ### Set Max. Probability
__pyx_t_18 = 0; __pyx_t_17 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_e_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_17 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 531, __pyx_L1_error) } __pyx_t_15 = 0; __pyx_t_13 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_15 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 531, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_15 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_18 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_17 * __pyx_v_e_mat0.strides[1]) ))));
+532: pt[0, i] = two_vi_view[m] ### Set Pointer for Backtrace
__pyx_t_17 = __pyx_v_m; __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_two_vi_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 532, __pyx_L1_error) } __pyx_t_18 = 0; __pyx_t_13 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_pt.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_pt.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 532, __pyx_L1_error) } *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_18 * __pyx_v_pt.strides[0]) ) + __pyx_t_13 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_two_vi_view.data + __pyx_t_17 * __pyx_v_two_vi_view.strides[0]) )));
533:
534: ### Do the other States
+535: three_v_view[0] = mp[0, i - 1] + t_mat0[i, 0, 1] # Move from 0 State
__pyx_t_17 = 0; __pyx_t_13 = (__pyx_v_i - 1); __pyx_t_14 = -1; if (__pyx_t_17 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_mp.shape[0])) __pyx_t_14 = 0; if (__pyx_t_13 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 535, __pyx_L1_error) } __pyx_t_18 = __pyx_v_i; __pyx_t_15 = 0; __pyx_t_16 = 1; __pyx_t_14 = -1; if (__pyx_t_18 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[0])) __pyx_t_14 = 0; if (__pyx_t_15 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_t_mat0.shape[1])) __pyx_t_14 = 1; if (__pyx_t_16 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_16 >= __pyx_v_t_mat0.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 535, __pyx_L1_error) } __pyx_t_19 = 0; __pyx_t_14 = -1; if (__pyx_t_19 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_three_v_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 535, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_19 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_17 * __pyx_v_mp.strides[0]) ) + __pyx_t_13 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_18 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_15 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_16 * __pyx_v_t_mat0.strides[2]) ))));
536:
+537: for k in range(1, n_states): # Find Maximum
__pyx_t_14 = __pyx_v_n_states; __pyx_t_20 = __pyx_t_14; for (__pyx_t_21 = 1; __pyx_t_21 < __pyx_t_20; __pyx_t_21+=1) { __pyx_v_k = __pyx_t_21;
+538: three_v_view[2] = mp[k, i - 1] + t_mat0[i, 1, 1] # The Stay State
__pyx_t_16 = __pyx_v_k; __pyx_t_15 = (__pyx_v_i - 1); __pyx_t_22 = -1; if (__pyx_t_16 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_16 >= __pyx_v_mp.shape[0])) __pyx_t_22 = 0; if (__pyx_t_15 < 0) { __pyx_t_22 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[1])) __pyx_t_22 = 1; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 538, __pyx_L1_error) } __pyx_t_18 = __pyx_v_i; __pyx_t_13 = 1; __pyx_t_17 = 1; __pyx_t_22 = -1; if (__pyx_t_18 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_t_mat0.shape[0])) __pyx_t_22 = 0; if (__pyx_t_13 < 0) { __pyx_t_22 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_t_mat0.shape[1])) __pyx_t_22 = 1; if (__pyx_t_17 < 0) { __pyx_t_22 = 2; } else if (unlikely(__pyx_t_17 >= __pyx_v_t_mat0.shape[2])) __pyx_t_22 = 2; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 538, __pyx_L1_error) } __pyx_t_19 = 2; __pyx_t_22 = -1; if (__pyx_t_19 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_three_v_view.shape[0])) __pyx_t_22 = 0; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 538, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_19 * __pyx_v_three_v_view.strides[0]) )) = ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_16 * __pyx_v_mp.strides[0]) ) + __pyx_t_15 * __pyx_v_mp.strides[1]) ))) + (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t_mat0.data + __pyx_t_18 * __pyx_v_t_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_t_mat0.strides[1]) ) + __pyx_t_17 * __pyx_v_t_mat0.strides[2]) ))));
+539: three_vi_view[2] = k
__pyx_t_17 = 2; __pyx_t_22 = -1; if (__pyx_t_17 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_22 = 0; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 539, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_17 * __pyx_v_three_vi_view.strides[0]) )) = __pyx_v_k;
540:
+541: m = argmax(three_v_view) ### Do a Maximum
__pyx_v_m = __pyx_f_6ancIBD_5cfunc_argmax(__pyx_v_three_v_view);
+542: v = three_v_view[m]
__pyx_t_17 = __pyx_v_m; __pyx_t_22 = -1; if (__pyx_t_17 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_three_v_view.shape[0])) __pyx_t_22 = 0; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 542, __pyx_L1_error) } __pyx_v_v = (*((double *) ( /* dim=0 */ (__pyx_v_three_v_view.data + __pyx_t_17 * __pyx_v_three_v_view.strides[0]) )));
543:
+544: mp[k, i] = v + e_mat0[k, i] ### Set Max. Probability
__pyx_t_17 = __pyx_v_k; __pyx_t_13 = __pyx_v_i; __pyx_t_22 = -1; if (__pyx_t_17 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_e_mat0.shape[0])) __pyx_t_22 = 0; if (__pyx_t_13 < 0) { __pyx_t_22 = 1; } else if (unlikely(__pyx_t_13 >= __pyx_v_e_mat0.shape[1])) __pyx_t_22 = 1; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 544, __pyx_L1_error) } __pyx_t_18 = __pyx_v_k; __pyx_t_15 = __pyx_v_i; __pyx_t_22 = -1; if (__pyx_t_18 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_mp.shape[0])) __pyx_t_22 = 0; if (__pyx_t_15 < 0) { __pyx_t_22 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_mp.shape[1])) __pyx_t_22 = 1; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 544, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_18 * __pyx_v_mp.strides[0]) ) + __pyx_t_15 * __pyx_v_mp.strides[1]) )) = (__pyx_v_v + (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat0.data + __pyx_t_17 * __pyx_v_e_mat0.strides[0]) ) + __pyx_t_13 * __pyx_v_e_mat0.strides[1]) ))));
+545: pt[k, i] = three_vi_view[m] ### Set Pointer for Backtrace
__pyx_t_13 = __pyx_v_m; __pyx_t_22 = -1; if (__pyx_t_13 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_three_vi_view.shape[0])) __pyx_t_22 = 0; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 545, __pyx_L1_error) } __pyx_t_17 = __pyx_v_k; __pyx_t_15 = __pyx_v_i; __pyx_t_22 = -1; if (__pyx_t_17 < 0) { __pyx_t_22 = 0; } else if (unlikely(__pyx_t_17 >= __pyx_v_pt.shape[0])) __pyx_t_22 = 0; if (__pyx_t_15 < 0) { __pyx_t_22 = 1; } else if (unlikely(__pyx_t_15 >= __pyx_v_pt.shape[1])) __pyx_t_22 = 1; if (unlikely(__pyx_t_22 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_22); __PYX_ERR(0, 545, __pyx_L1_error) } *((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_17 * __pyx_v_pt.strides[0]) ) + __pyx_t_15 * __pyx_v_pt.strides[1]) )) = (*((long *) ( /* dim=0 */ (__pyx_v_three_vi_view.data + __pyx_t_13 * __pyx_v_three_vi_view.strides[0]) ))); } }
546:
547: ### Do the trace back
+548: cdef long[:] path = -np.ones(n_loci, dtype=np.int16) # Initialize
__Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_ones); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_int16); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_7, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Negative(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_9 = __Pyx_PyObject_to_MemoryviewSlice_ds_long(__pyx_t_3, PyBUF_WRITABLE); if (unlikely(!__pyx_t_9.memview)) __PYX_ERR(0, 548, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_path = __pyx_t_9; __pyx_t_9.memview = NULL; __pyx_t_9.data = NULL;
549:
+550: x = np.argmax(mp[:, n_loci-1]) # The highest probability
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 550, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_argmax); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 550, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_6.data = __pyx_v_mp.data; __pyx_t_6.memview = __pyx_v_mp.memview; __PYX_INC_MEMVIEW(&__pyx_t_6, 0); __pyx_t_6.shape[0] = __pyx_v_mp.shape[0]; __pyx_t_6.strides[0] = __pyx_v_mp.strides[0]; __pyx_t_6.suboffsets[0] = -1; { Py_ssize_t __pyx_tmp_idx = (__pyx_v_n_loci - 1); Py_ssize_t __pyx_tmp_shape = __pyx_v_mp.shape[1]; Py_ssize_t __pyx_tmp_stride = __pyx_v_mp.strides[1]; if (unlikely(!__Pyx_is_valid_index(__pyx_tmp_idx, __pyx_tmp_shape))) { PyErr_SetString(PyExc_IndexError, "Index out of bounds (axis 1)"); __PYX_ERR(0, 550, __pyx_L1_error) } __pyx_t_6.data += __pyx_tmp_idx * __pyx_tmp_stride; } __pyx_t_2 = __pyx_memoryview_fromslice(__pyx_t_6, 1, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 550, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL; __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_7); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_7, function); } } __pyx_t_3 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_1, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_2); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 550, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_v_x = __pyx_t_3; __pyx_t_3 = 0;
+551: path[n_loci-1] = x
__pyx_t_23 = __Pyx_PyInt_As_long(__pyx_v_x); if (unlikely((__pyx_t_23 == (long)-1) && PyErr_Occurred())) __PYX_ERR(0, 551, __pyx_L1_error) __pyx_t_13 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_13 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 551, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) )) = __pyx_t_23;
552:
+553: for i in range(n_loci - 1, 0, -1):
for (__pyx_t_12 = (__pyx_v_n_loci - 1); __pyx_t_12 > 0; __pyx_t_12-=1) { __pyx_v_i = __pyx_t_12;
554: # Always th pointer to the previous path
+555: path[i - 1] = pt[path[i], i]
__pyx_t_13 = __pyx_v_i; __pyx_t_10 = -1; if (__pyx_t_13 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 555, __pyx_L1_error) } __pyx_t_15 = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) ))); __pyx_t_17 = __pyx_v_i; __pyx_t_10 = -1; if (__pyx_t_15 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_15 >= __pyx_v_pt.shape[0])) __pyx_t_10 = 0; if (__pyx_t_17 < 0) { __pyx_t_10 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_pt.shape[1])) __pyx_t_10 = 1; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 555, __pyx_L1_error) } __pyx_t_18 = (__pyx_v_i - 1); __pyx_t_10 = -1; if (__pyx_t_18 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_18 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 555, __pyx_L1_error) } *((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_18 * __pyx_v_path.strides[0]) )) = (*((long *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_pt.data + __pyx_t_15 * __pyx_v_pt.strides[0]) ) + __pyx_t_17 * __pyx_v_pt.strides[1]) ))); }
556:
+557: m = path[n_loci-1]
__pyx_t_13 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_13 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_path.shape[0])) __pyx_t_10 = 0; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 557, __pyx_L1_error) } __pyx_v_m = (*((long *) ( /* dim=0 */ (__pyx_v_path.data + __pyx_t_13 * __pyx_v_path.strides[0]) )));
+558: print(f"Log likelihood Path: {mp[m,n_loci-1]:.3f}")
__pyx_t_13 = __pyx_v_m; __pyx_t_17 = (__pyx_v_n_loci - 1); __pyx_t_10 = -1; if (__pyx_t_13 < 0) { __pyx_t_10 = 0; } else if (unlikely(__pyx_t_13 >= __pyx_v_mp.shape[0])) __pyx_t_10 = 0; if (__pyx_t_17 < 0) { __pyx_t_10 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_mp.shape[1])) __pyx_t_10 = 1; if (unlikely(__pyx_t_10 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_10); __PYX_ERR(0, 558, __pyx_L1_error) } __pyx_t_3 = PyFloat_FromDouble((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_mp.data + __pyx_t_13 * __pyx_v_mp.strides[0]) ) + __pyx_t_17 * __pyx_v_mp.strides[1]) )))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 558, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = __Pyx_PyObject_Format(__pyx_t_3, __pyx_kp_u_3f_2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 558, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Log_likelihood_Path, __pyx_t_7); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 558, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 558, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+559: assert(np.min(path)>=0) #Sanity check if everything was filled up
#ifndef CYTHON_WITHOUT_ASSERTIONS if (unlikely(!Py_OptimizeFlag)) { __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_np); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_min); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = __pyx_memoryview_fromslice(__pyx_v_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); } } __pyx_t_7 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_RichCompare(__pyx_t_7, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_24 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_24 < 0)) __PYX_ERR(0, 559, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (unlikely(!__pyx_t_24)) { PyErr_SetNone(PyExc_AssertionError); __PYX_ERR(0, 559, __pyx_L1_error) } } #endif
+560: return np.asarray(path)
__Pyx_XDECREF(__pyx_r); __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_np); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_asarray); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = __pyx_memoryview_fromslice(__pyx_v_path, 1, (PyObject *(*)(char *)) __pyx_memview_get_long, (int (*)(char *, PyObject *)) __pyx_memview_set_long, 0);; if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_1 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_1)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_1); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_1) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_1, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_7); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 560, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0;
561:
562:
563: ################################################### code for IBD2 states ###########################################
564:
+565: cdef inline void elementwise_multiple(double[:] vec1, double[:] vec2, double[:] dest, int n):
static CYTHON_INLINE void __pyx_f_6ancIBD_5cfunc_elementwise_multiple(__Pyx_memviewslice __pyx_v_vec1, __Pyx_memviewslice __pyx_v_vec2, __Pyx_memviewslice __pyx_v_dest, int __pyx_v_n) { int __pyx_v_i; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("elementwise_multiple", 0); /* … */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("ancIBD.cfunc.elementwise_multiple", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); }
+566: for i in range(n):
__pyx_t_1 = __pyx_v_n; __pyx_t_2 = __pyx_t_1; for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3;
+567: dest[i] = vec1[i]*vec2[i]
__pyx_t_4 = __pyx_v_i; __pyx_t_5 = -1; if (__pyx_t_4 < 0) { __pyx_t_5 = 0; } else if (unlikely(__pyx_t_4 >= __pyx_v_vec1.shape[0])) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); __PYX_ERR(0, 567, __pyx_L1_error) } __pyx_t_6 = __pyx_v_i; __pyx_t_5 = -1; if (__pyx_t_6 < 0) { __pyx_t_5 = 0; } else if (unlikely(__pyx_t_6 >= __pyx_v_vec2.shape[0])) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); __PYX_ERR(0, 567, __pyx_L1_error) } __pyx_t_7 = __pyx_v_i; __pyx_t_5 = -1; if (__pyx_t_7 < 0) { __pyx_t_5 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_dest.shape[0])) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); __PYX_ERR(0, 567, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_dest.data + __pyx_t_7 * __pyx_v_dest.strides[0]) )) = ((*((double *) ( /* dim=0 */ (__pyx_v_vec1.data + __pyx_t_4 * __pyx_v_vec1.strides[0]) ))) * (*((double *) ( /* dim=0 */ (__pyx_v_vec2.data + __pyx_t_6 * __pyx_v_vec2.strides[0]) )))); }
568:
+569: cdef inline void set2zero(double[:] vec, int n):
static CYTHON_INLINE void __pyx_f_6ancIBD_5cfunc_set2zero(__Pyx_memviewslice __pyx_v_vec, int __pyx_v_n) { int __pyx_v_i; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("set2zero", 0); /* … */ /* function exit code */ goto __pyx_L0; __pyx_L1_error:; __Pyx_WriteUnraisable("ancIBD.cfunc.set2zero", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); __pyx_L0:; __Pyx_RefNannyFinishContext(); }
+570: for i in range(n):
__pyx_t_1 = __pyx_v_n; __pyx_t_2 = __pyx_t_1; for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_2; __pyx_t_3+=1) { __pyx_v_i = __pyx_t_3;
+571: vec[i] = 0.0
__pyx_t_4 = __pyx_v_i; __pyx_t_5 = -1; if (__pyx_t_4 < 0) { __pyx_t_5 = 0; } else if (unlikely(__pyx_t_4 >= __pyx_v_vec.shape[0])) __pyx_t_5 = 0; if (unlikely(__pyx_t_5 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_5); __PYX_ERR(0, 571, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_vec.data + __pyx_t_4 * __pyx_v_vec.strides[0]) )) = 0.0; }
572:
573:
+574: def fwd_bkwd_scaled_asymmetricTransition(double[:, :] e_mat, double[:, :, :] t_mat,
/* Python wrapper */ static PyObject *__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition[] = "Takes emission and transition probabilities, and calculates posteriors.\n Uses speed-up specific for Genotype data (pooling same transition rates)\n Uses rescaling of fwd and bwd matrices\n e_mat: Emission probabilities [k x l] (normal space)\n t_mat: Transition Matrix: [l x 7 x 7] (normal space)\n in_val: Intitial probability of single symmetric state (normal space)\n full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)\n output: Whether to print output useful for monitoring\n Otherwise only posterior mat [kxl] of post is returned\n "; static PyMethodDef __pyx_mdef_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition = {"fwd_bkwd_scaled_asymmetricTransition", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition, METH_VARARGS|METH_KEYWORDS, __pyx_doc_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition}; static PyObject *__pyx_pw_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { __Pyx_memviewslice __pyx_v_e_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t_mat = { 0, 0, { 0 }, { 0 }, { 0 } }; double __pyx_v_in_val; PyObject *__pyx_v_full = 0; PyObject *__pyx_v_output = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_scaled_asymmetricTransition (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_e_mat,&__pyx_n_s_t_mat,&__pyx_n_s_in_val,&__pyx_n_s_full,&__pyx_n_s_output,0}; PyObject* values[5] = {0,0,0,0,0}; /* … */ /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition(CYTHON_UNUSED PyObject *__pyx_self, __Pyx_memviewslice __pyx_v_e_mat, __Pyx_memviewslice __pyx_v_t_mat, double __pyx_v_in_val, PyObject *__pyx_v_full, PyObject *__pyx_v_output) { int __pyx_v_n_states; int __pyx_v_n_loci; Py_ssize_t __pyx_v_i; Py_ssize_t __pyx_v_j; Py_ssize_t __pyx_v_k; PyObject *__pyx_v_post = NULL; PyObject *__pyx_v_c = NULL; __Pyx_memviewslice __pyx_v_c_view = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_temp = NULL; __Pyx_memviewslice __pyx_v_temp_v = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_temp1 = NULL; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_temp1_v = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_temp2 = NULL; CYTHON_UNUSED __Pyx_memviewslice __pyx_v_temp2_v = { 0, 0, { 0 }, { 0 }, { 0 } }; __Pyx_memviewslice __pyx_v_t = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_fwd1 = NULL; __Pyx_memviewslice __pyx_v_fwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_bwd1 = NULL; __Pyx_memviewslice __pyx_v_bwd = { 0, 0, { 0 }, { 0 }, { 0 } }; PyObject *__pyx_v_tot_ll = NULL; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("fwd_bkwd_scaled_asymmetricTransition", 0); /* … */ /* function exit code */ __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1); __PYX_XDEC_MEMVIEW(&__pyx_t_6, 1); __Pyx_XDECREF(__pyx_t_28); __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled_asymmetricTransition", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF(__pyx_v_post); __Pyx_XDECREF(__pyx_v_c); __PYX_XDEC_MEMVIEW(&__pyx_v_c_view, 1); __Pyx_XDECREF(__pyx_v_temp); __PYX_XDEC_MEMVIEW(&__pyx_v_temp_v, 1); __Pyx_XDECREF(__pyx_v_temp1); __PYX_XDEC_MEMVIEW(&__pyx_v_temp1_v, 1); __Pyx_XDECREF(__pyx_v_temp2); __PYX_XDEC_MEMVIEW(&__pyx_v_temp2_v, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t, 1); __Pyx_XDECREF(__pyx_v_fwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_fwd, 1); __Pyx_XDECREF(__pyx_v_bwd1); __PYX_XDEC_MEMVIEW(&__pyx_v_bwd, 1); __Pyx_XDECREF(__pyx_v_tot_ll); __PYX_XDEC_MEMVIEW(&__pyx_v_e_mat, 1); __PYX_XDEC_MEMVIEW(&__pyx_v_t_mat, 1); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* … */ __pyx_tuple__41 = PyTuple_Pack(29, __pyx_n_s_e_mat, __pyx_n_s_t_mat, __pyx_n_s_in_val, __pyx_n_s_full, __pyx_n_s_output, __pyx_n_s_n_states, __pyx_n_s_n_loci, __pyx_n_s_i, __pyx_n_s_j, __pyx_n_s_k, __pyx_n_s_stay, __pyx_n_s_x1, __pyx_n_s_x2, __pyx_n_s_x3, __pyx_n_s_post, __pyx_n_s_c, __pyx_n_s_c_view, __pyx_n_s_temp, __pyx_n_s_temp_v, __pyx_n_s_temp1, __pyx_n_s_temp1_v, __pyx_n_s_temp2, __pyx_n_s_temp2_v, __pyx_n_s_t, __pyx_n_s_fwd1, __pyx_n_s_fwd, __pyx_n_s_bwd1, __pyx_n_s_bwd, __pyx_n_s_tot_ll); if (unlikely(!__pyx_tuple__41)) __PYX_ERR(0, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__41); __Pyx_GIVEREF(__pyx_tuple__41); /* … */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_6ancIBD_5cfunc_13fwd_bkwd_scaled_asymmetricTransition, NULL, __pyx_n_s_ancIBD_cfunc); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 574, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_d, __pyx_n_s_fwd_bkwd_scaled_asymmetricTransi, __pyx_t_2) < 0) __PYX_ERR(0, 574, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_codeobj__42 = (PyObject*)__Pyx_PyCode_New(5, 0, 29, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__41, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_cfunc_pyx, __pyx_n_s_fwd_bkwd_scaled_asymmetricTransi, 574, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__42)) __PYX_ERR(0, 574, __pyx_L1_error)
+575: double in_val = 1e-4, full=False, output=True):
values[3] = ((PyObject *)Py_False); values[4] = ((PyObject *)Py_True); if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); CYTHON_FALLTHROUGH; case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); CYTHON_FALLTHROUGH; case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_e_mat)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_t_mat)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled_asymmetricTransition", 0, 2, 5, 1); __PYX_ERR(0, 574, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_in_val); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_full); if (value) { values[3] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_output); if (value) { values[4] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "fwd_bkwd_scaled_asymmetricTransition") < 0)) __PYX_ERR(0, 574, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); CYTHON_FALLTHROUGH; case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); CYTHON_FALLTHROUGH; case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); CYTHON_FALLTHROUGH; case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_e_mat = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(values[0], PyBUF_WRITABLE); if (unlikely(!__pyx_v_e_mat.memview)) __PYX_ERR(0, 574, __pyx_L3_error) __pyx_v_t_mat = __Pyx_PyObject_to_MemoryviewSlice_dsdsds_double(values[1], PyBUF_WRITABLE); if (unlikely(!__pyx_v_t_mat.memview)) __PYX_ERR(0, 574, __pyx_L3_error) if (values[2]) { __pyx_v_in_val = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_in_val == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L3_error) } else { __pyx_v_in_val = ((double)1e-4); } __pyx_v_full = values[3]; __pyx_v_output = values[4]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("fwd_bkwd_scaled_asymmetricTransition", 0, 2, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 574, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("ancIBD.cfunc.fwd_bkwd_scaled_asymmetricTransition", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_6ancIBD_5cfunc_12fwd_bkwd_scaled_asymmetricTransition(__pyx_self, __pyx_v_e_mat, __pyx_v_t_mat, __pyx_v_in_val, __pyx_v_full, __pyx_v_output);
576: """Takes emission and transition probabilities, and calculates posteriors.
577: Uses speed-up specific for Genotype data (pooling same transition rates)
578: Uses rescaling of fwd and bwd matrices
579: e_mat: Emission probabilities [k x l] (normal space)
580: t_mat: Transition Matrix: [l x 7 x 7] (normal space)
581: in_val: Intitial probability of single symmetric state (normal space)
582: full: Boolean whether to return everything (post, fwd1, bwd1, tot_ll)
583: output: Whether to print output useful for monitoring
584: Otherwise only posterior mat [kxl] of post is returned
585: """
+586: cdef int n_states = e_mat.shape[0]
__pyx_v_n_states = (__pyx_v_e_mat.shape[0]);
+587: cdef int n_loci = e_mat.shape[1]
__pyx_v_n_loci = (__pyx_v_e_mat.shape[1]);
588: cdef Py_ssize_t i, j, k # The Array and Iteration Indices
589: cdef double stay # The Probablility of Staying
590: cdef double x1, x2, x3 # Place holder variables [make code readable]
591:
592: # Initialize Posterior and Transition Probabilities
+593: post = np.empty([n_states, n_loci], dtype=DTYPE)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyList_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_1); PyList_SET_ITEM(__pyx_t_4, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_3); PyList_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_1 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 593, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_post = __pyx_t_1; __pyx_t_1 = 0;
594:
+595: c = np.empty(n_loci, dtype=DTYPE) # Array of normalization constants
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 595, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_c = __pyx_t_2; __pyx_t_2 = 0;
+596: cdef double[:] c_view = c
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_c, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 596, __pyx_L1_error) __pyx_v_c_view = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
597:
+598: temp = np.empty(n_states, dtype=DTYPE) # l Array for calculations
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_empty); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_2, __pyx_n_s_dtype, __pyx_t_4) < 0) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 598, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_v_temp = __pyx_t_4; __pyx_t_4 = 0;
+599: cdef double[:] temp_v = temp
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 599, __pyx_L1_error) __pyx_v_temp_v = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
600:
+601: temp1 = np.empty(n_states-1, dtype=DTYPE) # l-1 Array for calculatons
__Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_empty); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyInt_From_long((__pyx_v_n_states - 1)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_t_1) < 0) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 601, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_temp1 = __pyx_t_1; __pyx_t_1 = 0;
+602: cdef double[:] temp1_v = temp1
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 602, __pyx_L1_error) __pyx_v_temp1_v = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
603:
+604: temp2 = np.empty(n_states, dtype=DTYPE) # l Array for temporary storage (added by Yilei)
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_empty); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_DTYPE); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_2) < 0) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 604, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_temp2 = __pyx_t_2; __pyx_t_2 = 0;
+605: cdef double[:] temp2_v = temp2
__pyx_t_5 = __Pyx_PyObject_to_MemoryviewSlice_ds_double(__pyx_v_temp2, PyBUF_WRITABLE); if (unlikely(!__pyx_t_5.memview)) __PYX_ERR(0, 605, __pyx_L1_error) __pyx_v_temp2_v = __pyx_t_5; __pyx_t_5.memview = NULL; __pyx_t_5.data = NULL;
606:
+607: cdef double[:,:,:] t = t_mat # C View of transition matrix
__PYX_INC_MEMVIEW(&__pyx_v_t_mat, 0); __pyx_v_t = __pyx_v_t_mat;
608:
609: ### Initialize FWD BWD matrices with first and last entries filled
+610: fwd1 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 610, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 610, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_fwd1 = __pyx_t_2; __pyx_t_2 = 0;
+611: fwd1[:, 0] = in_val # Initial Probabilities
__pyx_t_2 = PyFloat_FromDouble(__pyx_v_in_val); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 611, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__4, __pyx_t_2) < 0)) __PYX_ERR(0, 611, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+612: fwd1[0, 0] = 1 - (n_states - 1) * in_val
__pyx_t_2 = PyFloat_FromDouble((1.0 - ((__pyx_v_n_states - 1) * __pyx_v_in_val))); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 612, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); if (unlikely(PyObject_SetItem(__pyx_v_fwd1, __pyx_tuple__5, __pyx_t_2) < 0)) __PYX_ERR(0, 612, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+613: cdef double[:,:] fwd = fwd1
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_fwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 613, __pyx_L1_error) __pyx_v_fwd = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
614:
+615: c_view[0] = 1 # Set the first normalization constant
__pyx_t_7 = 0; __pyx_t_8 = -1; if (__pyx_t_7 < 0) { __pyx_t_8 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_c_view.shape[0])) __pyx_t_8 = 0; if (unlikely(__pyx_t_8 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_8); __PYX_ERR(0, 615, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_7 * __pyx_v_c_view.strides[0]) )) = 1.0;
616:
+617: bwd1 = np.zeros((n_states, n_loci), dtype="float")
__Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_np); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_zeros); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_n_states); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_n_loci); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_n_s_dtype, __pyx_n_u_float) < 0) __PYX_ERR(0, 617, __pyx_L1_error) __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 617, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_v_bwd1 = __pyx_t_2; __pyx_t_2 = 0;
+618: bwd1[:, -1] = 1 # The initial values for the backward pass
if (unlikely(PyObject_SetItem(__pyx_v_bwd1, __pyx_tuple__6, __pyx_int_1) < 0)) __PYX_ERR(0, 618, __pyx_L1_error)
+619: cdef double[:,:] bwd = bwd1
__pyx_t_6 = __Pyx_PyObject_to_MemoryviewSlice_dsds_double(__pyx_v_bwd1, PyBUF_WRITABLE); if (unlikely(!__pyx_t_6.memview)) __PYX_ERR(0, 619, __pyx_L1_error) __pyx_v_bwd = __pyx_t_6; __pyx_t_6.memview = NULL; __pyx_t_6.data = NULL;
620:
621: #############################
622: ### Do the Forward Algorithm
+623: for i in range(1, n_loci): # Run forward recursion
__pyx_t_8 = __pyx_v_n_loci; __pyx_t_9 = __pyx_t_8; for (__pyx_t_10 = 1; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { __pyx_v_i = __pyx_t_10;
+624: set2zero(temp_v, n_states)
__pyx_f_6ancIBD_5cfunc_set2zero(__pyx_v_temp_v, __pyx_v_n_states);
+625: for j in range(n_states):
__pyx_t_11 = __pyx_v_n_states; __pyx_t_12 = __pyx_t_11; for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_12; __pyx_t_13+=1) { __pyx_v_j = __pyx_t_13;
+626: for k in range(n_states):
__pyx_t_14 = __pyx_v_n_states; __pyx_t_15 = __pyx_t_14; for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { __pyx_v_k = __pyx_t_16;
+627: temp_v[j] += fwd[k, i-1]*t[i, k, j]
__pyx_t_7 = __pyx_v_k; __pyx_t_17 = (__pyx_v_i - 1); __pyx_t_18 = -1; if (__pyx_t_7 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_7 >= __pyx_v_fwd.shape[0])) __pyx_t_18 = 0; if (__pyx_t_17 < 0) { __pyx_t_18 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_fwd.shape[1])) __pyx_t_18 = 1; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 627, __pyx_L1_error) } __pyx_t_19 = __pyx_v_i; __pyx_t_20 = __pyx_v_k; __pyx_t_21 = __pyx_v_j; __pyx_t_18 = -1; if (__pyx_t_19 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_t.shape[0])) __pyx_t_18 = 0; if (__pyx_t_20 < 0) { __pyx_t_18 = 1; } else if (unlikely(__pyx_t_20 >= __pyx_v_t.shape[1])) __pyx_t_18 = 1; if (__pyx_t_21 < 0) { __pyx_t_18 = 2; } else if (unlikely(__pyx_t_21 >= __pyx_v_t.shape[2])) __pyx_t_18 = 2; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 627, __pyx_L1_error) } __pyx_t_22 = __pyx_v_j; __pyx_t_18 = -1; if (__pyx_t_22 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_temp_v.shape[0])) __pyx_t_18 = 0; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 627, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_22 * __pyx_v_temp_v.strides[0]) )) += ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_7 * __pyx_v_fwd.strides[0]) ) + __pyx_t_17 * __pyx_v_fwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_19 * __pyx_v_t.strides[0]) ) + __pyx_t_20 * __pyx_v_t.strides[1]) ) + __pyx_t_21 * __pyx_v_t.strides[2]) )))); }
+628: temp_v[j] *= e_mat[j, i]
__pyx_t_21 = __pyx_v_j; __pyx_t_20 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_21 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_e_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_20 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_20 >= __pyx_v_e_mat.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 628, __pyx_L1_error) } __pyx_t_19 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_19 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_temp_v.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 628, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_19 * __pyx_v_temp_v.strides[0]) )) *= (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_21 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_20 * __pyx_v_e_mat.strides[1]) )));
629:
630: ### Do the normalization
+631: c_view[i] = sum_array(temp_v, n_states)
__pyx_t_20 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_20 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_c_view.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 631, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_20 * __pyx_v_c_view.strides[0]) )) = __pyx_f_6ancIBD_5cfunc_sum_array(__pyx_v_temp_v, __pyx_v_n_states);
+632: for j in range(n_states):
__pyx_t_14 = __pyx_v_n_states; __pyx_t_15 = __pyx_t_14; for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_15; __pyx_t_16+=1) { __pyx_v_j = __pyx_t_16;
+633: fwd[j,i] = temp_v[j] / c_view[i] # Rescale to prob. distribution
__pyx_t_20 = __pyx_v_j; __pyx_t_18 = -1; if (__pyx_t_20 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_temp_v.shape[0])) __pyx_t_18 = 0; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 633, __pyx_L1_error) } __pyx_t_23 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_20 * __pyx_v_temp_v.strides[0]) ))); __pyx_t_20 = __pyx_v_i; __pyx_t_18 = -1; if (__pyx_t_20 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_c_view.shape[0])) __pyx_t_18 = 0; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 633, __pyx_L1_error) } __pyx_t_24 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_20 * __pyx_v_c_view.strides[0]) ))); if (unlikely(__pyx_t_24 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 633, __pyx_L1_error) } __pyx_t_20 = __pyx_v_j; __pyx_t_21 = __pyx_v_i; __pyx_t_18 = -1; if (__pyx_t_20 < 0) { __pyx_t_18 = 0; } else if (unlikely(__pyx_t_20 >= __pyx_v_fwd.shape[0])) __pyx_t_18 = 0; if (__pyx_t_21 < 0) { __pyx_t_18 = 1; } else if (unlikely(__pyx_t_21 >= __pyx_v_fwd.shape[1])) __pyx_t_18 = 1; if (unlikely(__pyx_t_18 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_18); __PYX_ERR(0, 633, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_fwd.data + __pyx_t_20 * __pyx_v_fwd.strides[0]) ) + __pyx_t_21 * __pyx_v_fwd.strides[1]) )) = (__pyx_t_23 / __pyx_t_24); } } }
634:
635: #############################
636: ### Do the Backward Algorithm
+637: for i in range(n_loci-1, 0, -1): # Run backward recursion
for (__pyx_t_10 = (__pyx_v_n_loci - 1); __pyx_t_10 > 0; __pyx_t_10-=1) { __pyx_v_i = __pyx_t_10;
+638: set2zero(temp_v, n_states)
__pyx_f_6ancIBD_5cfunc_set2zero(__pyx_v_temp_v, __pyx_v_n_states);
+639: for j in range(n_states):
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) { __pyx_v_j = __pyx_t_13;
+640: for k in range(n_states):
__pyx_t_11 = __pyx_v_n_states; __pyx_t_12 = __pyx_t_11; for (__pyx_t_16 = 0; __pyx_t_16 < __pyx_t_12; __pyx_t_16+=1) { __pyx_v_k = __pyx_t_16;
+641: temp_v[j] += bwd[k, i]*t[i, j, k]*e_mat[k, i]
__pyx_t_21 = __pyx_v_k; __pyx_t_20 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_21 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_21 >= __pyx_v_bwd.shape[0])) __pyx_t_14 = 0; if (__pyx_t_20 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_20 >= __pyx_v_bwd.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 641, __pyx_L1_error) } __pyx_t_19 = __pyx_v_i; __pyx_t_17 = __pyx_v_j; __pyx_t_7 = __pyx_v_k; __pyx_t_14 = -1; if (__pyx_t_19 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_19 >= __pyx_v_t.shape[0])) __pyx_t_14 = 0; if (__pyx_t_17 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_17 >= __pyx_v_t.shape[1])) __pyx_t_14 = 1; if (__pyx_t_7 < 0) { __pyx_t_14 = 2; } else if (unlikely(__pyx_t_7 >= __pyx_v_t.shape[2])) __pyx_t_14 = 2; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 641, __pyx_L1_error) } __pyx_t_22 = __pyx_v_k; __pyx_t_25 = __pyx_v_i; __pyx_t_14 = -1; if (__pyx_t_22 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_22 >= __pyx_v_e_mat.shape[0])) __pyx_t_14 = 0; if (__pyx_t_25 < 0) { __pyx_t_14 = 1; } else if (unlikely(__pyx_t_25 >= __pyx_v_e_mat.shape[1])) __pyx_t_14 = 1; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 641, __pyx_L1_error) } __pyx_t_26 = __pyx_v_j; __pyx_t_14 = -1; if (__pyx_t_26 < 0) { __pyx_t_14 = 0; } else if (unlikely(__pyx_t_26 >= __pyx_v_temp_v.shape[0])) __pyx_t_14 = 0; if (unlikely(__pyx_t_14 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_14); __PYX_ERR(0, 641, __pyx_L1_error) } *((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_26 * __pyx_v_temp_v.strides[0]) )) += (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_21 * __pyx_v_bwd.strides[0]) ) + __pyx_t_20 * __pyx_v_bwd.strides[1]) ))) * (*((double *) ( /* dim=2 */ (( /* dim=1 */ (( /* dim=0 */ (__pyx_v_t.data + __pyx_t_19 * __pyx_v_t.strides[0]) ) + __pyx_t_17 * __pyx_v_t.strides[1]) ) + __pyx_t_7 * __pyx_v_t.strides[2]) )))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_e_mat.data + __pyx_t_22 * __pyx_v_e_mat.strides[0]) ) + __pyx_t_25 * __pyx_v_e_mat.strides[1]) )))); } }
642:
643: ### Do the normalization
+644: for j in range(n_states):
__pyx_t_8 = __pyx_v_n_states; __pyx_t_9 = __pyx_t_8; for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) { __pyx_v_j = __pyx_t_13;
+645: bwd[j, i - 1] = temp_v[j] / c_view[i] # Rescale to prob. distribution
__pyx_t_25 = __pyx_v_j; __pyx_t_11 = -1; if (__pyx_t_25 < 0) { __pyx_t_11 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_temp_v.shape[0])) __pyx_t_11 = 0; if (unlikely(__pyx_t_11 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_11); __PYX_ERR(0, 645, __pyx_L1_error) } __pyx_t_24 = (*((double *) ( /* dim=0 */ (__pyx_v_temp_v.data + __pyx_t_25 * __pyx_v_temp_v.strides[0]) ))); __pyx_t_25 = __pyx_v_i; __pyx_t_11 = -1; if (__pyx_t_25 < 0) { __pyx_t_11 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_c_view.shape[0])) __pyx_t_11 = 0; if (unlikely(__pyx_t_11 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_11); __PYX_ERR(0, 645, __pyx_L1_error) } __pyx_t_23 = (*((double *) ( /* dim=0 */ (__pyx_v_c_view.data + __pyx_t_25 * __pyx_v_c_view.strides[0]) ))); if (unlikely(__pyx_t_23 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 645, __pyx_L1_error) } __pyx_t_25 = __pyx_v_j; __pyx_t_22 = (__pyx_v_i - 1); __pyx_t_11 = -1; if (__pyx_t_25 < 0) { __pyx_t_11 = 0; } else if (unlikely(__pyx_t_25 >= __pyx_v_bwd.shape[0])) __pyx_t_11 = 0; if (__pyx_t_22 < 0) { __pyx_t_11 = 1; } else if (unlikely(__pyx_t_22 >= __pyx_v_bwd.shape[1])) __pyx_t_11 = 1; if (unlikely(__pyx_t_11 != -1)) { __Pyx_RaiseBufferIndexError(__pyx_t_11); __PYX_ERR(0, 645, __pyx_L1_error) } *((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_bwd.data + __pyx_t_25 * __pyx_v_bwd.strides[0]) ) + __pyx_t_22 * __pyx_v_bwd.strides[1]) )) = (__pyx_t_24 / __pyx_t_23); } }
646:
647: ### Combine the forward and backward calculations for posterior
+648: post = fwd1 * bwd1
__pyx_t_2 = PyNumber_Multiply(__pyx_v_fwd1, __pyx_v_bwd1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 648, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF_SET(__pyx_v_post, __pyx_t_2); __pyx_t_2 = 0;
+649: if output:
__pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 649, __pyx_L1_error) if (__pyx_t_27) { /* … */ }
+650: print("Memory Usage at end of HMM:")
__pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_print, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 650, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+651: print_memory_usage() ## For MEMORY_BENCH
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_print_memory_usage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 651, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) { __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1); if (likely(__pyx_t_3)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_1, function); } } __pyx_t_2 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 651, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
652:
+653: if full==False:
__pyx_t_2 = PyObject_RichCompare(__pyx_v_full, Py_False, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 653, __pyx_L1_error) __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 653, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_27) { /* … */ }
+654: return post
__Pyx_XDECREF(__pyx_r); __Pyx_INCREF(__pyx_v_post); __pyx_r = __pyx_v_post; goto __pyx_L0;
655:
+656: elif full==True: # Return everything
__pyx_t_2 = PyObject_RichCompare(__pyx_v_full, Py_True, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 656, __pyx_L1_error) __pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 656, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (__pyx_t_27) { /* … */ }
+657: tot_ll = np.sum(np.log(c)) # Tot Likelihood is product over all c.
__Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_np); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_sum); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_np); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_log); if (unlikely(!__pyx_t_28)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_28); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_28))) { __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_28); if (likely(__pyx_t_4)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_28); __Pyx_INCREF(__pyx_t_4); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_28, function); } } __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_28, __pyx_t_4, __pyx_v_c) : __Pyx_PyObject_CallOneArg(__pyx_t_28, __pyx_v_c); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_28); __pyx_t_28 = 0; __pyx_t_28 = NULL; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { __pyx_t_28 = PyMethod_GET_SELF(__pyx_t_3); if (likely(__pyx_t_28)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); __Pyx_INCREF(__pyx_t_28); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_3, function); } } __pyx_t_2 = (__pyx_t_28) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_28, __pyx_t_1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); __Pyx_XDECREF(__pyx_t_28); __pyx_t_28 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 657, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_tot_ll = __pyx_t_2; __pyx_t_2 = 0;
+658: if output:
__pyx_t_27 = __Pyx_PyObject_IsTrue(__pyx_v_output); if (unlikely(__pyx_t_27 < 0)) __PYX_ERR(0, 658, __pyx_L1_error) if (__pyx_t_27) { /* … */ }
+659: print(f"Total Log likelihood: {tot_ll: .3f}")
__pyx_t_2 = __Pyx_PyObject_Format(__pyx_v_tot_ll, __pyx_kp_u_3f); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_kp_u_Total_Log_likelihood, __pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 659, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_builtin_print, __pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 659, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+660: return post, fwd1, bwd1, tot_ll
__Pyx_XDECREF(__pyx_r); __pyx_t_2 = PyTuple_New(4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 660, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(__pyx_v_post); __Pyx_GIVEREF(__pyx_v_post); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_post); __Pyx_INCREF(__pyx_v_fwd1); __Pyx_GIVEREF(__pyx_v_fwd1); PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_fwd1); __Pyx_INCREF(__pyx_v_bwd1); __Pyx_GIVEREF(__pyx_v_bwd1); PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_bwd1); __Pyx_INCREF(__pyx_v_tot_ll); __Pyx_GIVEREF(__pyx_v_tot_ll); PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_tot_ll); __pyx_r = __pyx_t_2; __pyx_t_2 = 0; goto __pyx_L0;