/* Generated by Cython 0.27.2 */ /* BEGIN: Cython Metadata { "distutils": { "depends": [], "name": "src.kullback_leibler_cython", "sources": [ "kullback_leibler_cython.pyx" ] }, "module_name": "src.kullback_leibler_cython" } END: Cython Metadata */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) #error Cython requires Python 2.6+ or Python 3.3+. #else #define CYTHON_ABI "0_27_2" #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #define __PYX_COMMA , #ifndef HAVE_LONG_LONG #if PY_VERSION_HEX >= 0x02070000 #define HAVE_LONG_LONG #endif #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 0 #undef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 0 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #if PY_VERSION_HEX < 0x03050000 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #undef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #undef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 1 #undef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 0 #undef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 0 #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #elif defined(PYSTON_VERSION) #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #undef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 0 #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #undef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 0 #undef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 0 #undef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT 0 #undef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_PYSTON 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #ifndef CYTHON_USE_TYPE_SLOTS #define CYTHON_USE_TYPE_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYTYPE_LOOKUP #define CYTHON_USE_PYTYPE_LOOKUP 0 #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) #define CYTHON_USE_PYTYPE_LOOKUP 1 #endif #if PY_MAJOR_VERSION < 3 #undef CYTHON_USE_ASYNC_SLOTS #define CYTHON_USE_ASYNC_SLOTS 0 #elif !defined(CYTHON_USE_ASYNC_SLOTS) #define CYTHON_USE_ASYNC_SLOTS 1 #endif #if PY_VERSION_HEX < 0x02070000 #undef CYTHON_USE_PYLONG_INTERNALS #define CYTHON_USE_PYLONG_INTERNALS 0 #elif !defined(CYTHON_USE_PYLONG_INTERNALS) #define CYTHON_USE_PYLONG_INTERNALS 1 #endif #ifndef CYTHON_USE_PYLIST_INTERNALS #define CYTHON_USE_PYLIST_INTERNALS 1 #endif #ifndef CYTHON_USE_UNICODE_INTERNALS #define CYTHON_USE_UNICODE_INTERNALS 1 #endif #if PY_VERSION_HEX < 0x030300F0 #undef CYTHON_USE_UNICODE_WRITER #define CYTHON_USE_UNICODE_WRITER 0 #elif !defined(CYTHON_USE_UNICODE_WRITER) #define CYTHON_USE_UNICODE_WRITER 1 #endif #ifndef CYTHON_AVOID_BORROWED_REFS #define CYTHON_AVOID_BORROWED_REFS 0 #endif #ifndef CYTHON_ASSUME_SAFE_MACROS #define CYTHON_ASSUME_SAFE_MACROS 1 #endif #ifndef CYTHON_UNPACK_METHODS #define CYTHON_UNPACK_METHODS 1 #endif #ifndef CYTHON_FAST_THREAD_STATE #define CYTHON_FAST_THREAD_STATE 1 #endif #ifndef CYTHON_FAST_PYCALL #define CYTHON_FAST_PYCALL 1 #endif #ifndef CYTHON_PEP489_MULTI_PHASE_INIT #define CYTHON_PEP489_MULTI_PHASE_INIT (0 && PY_VERSION_HEX >= 0x03050000) #endif #ifndef CYTHON_USE_TP_FINALIZE #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) #endif #endif #if !defined(CYTHON_FAST_PYCCALL) #define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) #endif #if CYTHON_USE_PYLONG_INTERNALS #include "longintrepr.h" #undef SHIFT #undef BASE #undef MASK #endif #if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) #define Py_OptimizeFlag 0 #endif #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyClass_Type #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #define __Pyx_DefaultClassType PyType_Type #endif #ifndef Py_TPFLAGS_CHECKTYPES #define Py_TPFLAGS_CHECKTYPES 0 #endif #ifndef Py_TPFLAGS_HAVE_INDEX #define Py_TPFLAGS_HAVE_INDEX 0 #endif #ifndef Py_TPFLAGS_HAVE_NEWBUFFER #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #ifndef Py_TPFLAGS_HAVE_FINALIZE #define Py_TPFLAGS_HAVE_FINALIZE 0 #endif #if PY_VERSION_HEX < 0x030700A0 || !defined(METH_FASTCALL) #ifndef METH_FASTCALL #define METH_FASTCALL 0x80 #endif typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject **args, Py_ssize_t nargs); typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject **args, Py_ssize_t nargs, PyObject *kwnames); #else #define __Pyx_PyCFunctionFast _PyCFunctionFast #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords #endif #if CYTHON_FAST_PYCCALL #define __Pyx_PyFastCFunction_Check(func)\ ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))))) #else #define __Pyx_PyFastCFunction_Check(func) 0 #endif #if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #elif PY_VERSION_HEX >= 0x03060000 #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() #elif PY_VERSION_HEX >= 0x03000000 #define __Pyx_PyThreadState_Current PyThreadState_GET() #else #define __Pyx_PyThreadState_Current _PyThreadState_Current #endif #if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) #define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) #else #define __Pyx_PyDict_NewPresized(n) PyDict_New() #endif #if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) #else #define CYTHON_PEP393_ENABLED 0 #define PyUnicode_1BYTE_KIND 1 #define PyUnicode_2BYTE_KIND 2 #define PyUnicode_4BYTE_KIND 4 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) #endif #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) #else #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) #endif #if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) #define PyObject_Malloc(s) PyMem_Malloc(s) #define PyObject_Free(p) PyMem_Free(p) #define PyObject_Realloc(p) PyMem_Realloc(p) #endif #if CYTHON_COMPILING_IN_PYSTON #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) #else #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) #endif #define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) #define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) #else #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) #endif #if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) #define PyObject_ASCII(o) PyObject_Repr(o) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) #else #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #define PyNumber_Int PyNumber_Long #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY #ifndef PyUnicode_InternFromString #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) #endif #endif #if PY_VERSION_HEX < 0x030200A4 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #else #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) #endif #ifndef __has_attribute #define __has_attribute(x) 0 #endif #ifndef __has_cpp_attribute #define __has_cpp_attribute(x) 0 #endif #if CYTHON_USE_ASYNC_SLOTS #if PY_VERSION_HEX >= 0x030500B1 #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) #else #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) #endif #else #define __Pyx_PyType_AsAsync(obj) NULL #endif #ifndef __Pyx_PyAsyncMethodsStruct typedef struct { unaryfunc am_await; unaryfunc am_aiter; unaryfunc am_anext; } __Pyx_PyAsyncMethodsStruct; #endif #ifndef CYTHON_RESTRICT #if defined(__GNUC__) #define CYTHON_RESTRICT __restrict__ #elif defined(_MSC_VER) && _MSC_VER >= 1400 #define CYTHON_RESTRICT __restrict #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_RESTRICT restrict #else #define CYTHON_RESTRICT #endif #endif #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif #ifndef CYTHON_MAYBE_UNUSED_VAR # if defined(__cplusplus) template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } # else # define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) # endif #endif #ifndef CYTHON_NCP_UNUSED # if CYTHON_COMPILING_IN_CPYTHON # define CYTHON_NCP_UNUSED # else # define CYTHON_NCP_UNUSED CYTHON_UNUSED # endif #endif #define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) #ifdef _MSC_VER #ifndef _MSC_STDINT_H_ #if _MSC_VER < 1300 typedef unsigned char uint8_t; typedef unsigned int uint32_t; #else typedef unsigned __int8 uint8_t; typedef unsigned __int32 uint32_t; #endif #endif #else #include #endif #ifndef CYTHON_FALLTHROUGH #if defined(__cplusplus) && __cplusplus >= 201103L #if __has_cpp_attribute(fallthrough) #define CYTHON_FALLTHROUGH [[fallthrough]] #elif __has_cpp_attribute(clang::fallthrough) #define CYTHON_FALLTHROUGH [[clang::fallthrough]] #elif __has_cpp_attribute(gnu::fallthrough) #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] #endif #endif #ifndef CYTHON_FALLTHROUGH #if __has_attribute(fallthrough) #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) #else #define CYTHON_FALLTHROUGH #endif #endif #if defined(__clang__ ) && defined(__apple_build_version__) #if __apple_build_version__ < 7000000 #undef CYTHON_FALLTHROUGH #define CYTHON_FALLTHROUGH #endif #endif #endif #ifndef CYTHON_INLINE #if defined(__clang__) #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) #elif defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #ifdef NAN #define __PYX_NAN() ((float) NAN) #else static CYTHON_INLINE float __PYX_NAN() { float value; memset(&value, 0xFF, sizeof(value)); return value; } #endif #if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) #define __Pyx_truncl trunc #else #define __Pyx_truncl truncl #endif #define __PYX_ERR(f_index, lineno, Ln_error) \ { \ __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \ } #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #define __PYX_HAVE__kullback_leibler_cython #define __PYX_HAVE_API__kullback_leibler_cython #include #ifdef _OPENMP #include #endif /* _OPENMP */ #if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) #define CYTHON_WITHOUT_ASSERTIONS #endif typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0 #define __PYX_DEFAULT_STRING_ENCODING "" #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #define __Pyx_uchar_cast(c) ((unsigned char)c) #define __Pyx_long_cast(x) ((long)x) #define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ (sizeof(type) < sizeof(Py_ssize_t)) ||\ (sizeof(type) > sizeof(Py_ssize_t) &&\ likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX) &&\ (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ v == (type)PY_SSIZE_T_MIN))) ||\ (sizeof(type) == sizeof(Py_ssize_t) &&\ (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ v == (type)PY_SSIZE_T_MAX))) ) #if defined (__cplusplus) && __cplusplus >= 201103L #include #define __Pyx_sst_abs(value) std::abs(value) #elif SIZEOF_INT >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) abs(value) #elif SIZEOF_LONG >= SIZEOF_SIZE_T #define __Pyx_sst_abs(value) labs(value) #elif defined (_MSC_VER) #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define __Pyx_sst_abs(value) llabs(value) #elif defined (__GNUC__) #define __Pyx_sst_abs(value) __builtin_llabs(value) #else #define __Pyx_sst_abs(value) ((value<0) ? -value : value) #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); #define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) #define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) #define __Pyx_PyBytes_FromString PyBytes_FromString #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #if PY_MAJOR_VERSION < 3 #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize #else #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize #endif #define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) #define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) #define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) #define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) #define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { const Py_UNICODE *u_end = u; while (*u_end++) ; return (size_t)(u_end - u - 1); } #define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); #define __Pyx_PySequence_Tuple(obj)\ (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); #if CYTHON_ASSUME_SAFE_MACROS #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) #else #define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) #endif #define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII static int __Pyx_sys_getdefaultencoding_not_ascii; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; PyObject* ascii_chars_u = NULL; PyObject* ascii_chars_b = NULL; const char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; if (strcmp(default_encoding_c, "ascii") == 0) { __Pyx_sys_getdefaultencoding_not_ascii = 0; } else { char ascii_chars[128]; int c; for (c = 0; c < 128; c++) { ascii_chars[c] = c; } __Pyx_sys_getdefaultencoding_not_ascii = 1; ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); if (!ascii_chars_u) goto bad; ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { PyErr_Format( PyExc_ValueError, "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", default_encoding_c); goto bad; } Py_DECREF(ascii_chars_u); Py_DECREF(ascii_chars_b); } Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); Py_XDECREF(ascii_chars_u); Py_XDECREF(ascii_chars_b); return -1; } #endif #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) #else #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT static char* __PYX_DEFAULT_STRING_ENCODING; static int __Pyx_init_sys_getdefaultencoding_params(void) { PyObject* sys; PyObject* default_encoding = NULL; char* default_encoding_c; sys = PyImport_ImportModule("sys"); if (!sys) goto bad; default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); Py_DECREF(sys); if (!default_encoding) goto bad; default_encoding_c = PyBytes_AsString(default_encoding); if (!default_encoding_c) goto bad; __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c)); if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); Py_DECREF(default_encoding); return 0; bad: Py_XDECREF(default_encoding); return -1; } #endif #endif /* Test for GCC > 2.95 */ #if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* !__GNUC__ or GCC < 2.95 */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } static PyObject *__pyx_m = NULL; static PyObject *__pyx_d; static PyObject *__pyx_b; static PyObject *__pyx_cython_runtime; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static PyObject *__pyx_empty_unicode; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "kullback_leibler_cython.pyx", }; /*--- Type declarations ---*/ /* --- Runtime support code (head) --- */ /* Refnanny.proto */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil)\ if (acquire_gil) {\ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ PyGILState_Release(__pyx_gilstate_save);\ } else {\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil)\ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext()\ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif #define __Pyx_XDECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_XDECREF(tmp);\ } while (0) #define __Pyx_DECREF_SET(r, v) do {\ PyObject *tmp = (PyObject *) r;\ r = v; __Pyx_DECREF(tmp);\ } while (0) #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) /* RaiseArgTupleInvalid.proto */ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /* RaiseDoubleKeywords.proto */ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /* ParseKeywords.proto */ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ const char* function_name); /* PyFunctionFastCall.proto */ #if CYTHON_FAST_PYCALL #define __Pyx_PyFunction_FastCall(func, args, nargs)\ __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs); #else #define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) #endif #endif /* PyCFunctionFastCall.proto */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); #else #define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) #endif /* PyObjectCall.proto */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); #else #define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) #endif /* PyObjectGetAttrStr.proto */ #if CYTHON_USE_TYPE_SLOTS static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { PyTypeObject* tp = Py_TYPE(obj); if (likely(tp->tp_getattro)) return tp->tp_getattro(obj, attr_name); #if PY_MAJOR_VERSION < 3 if (likely(tp->tp_getattr)) return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); #endif return PyObject_GetAttr(obj, attr_name); } #else #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) #endif /* GetBuiltinName.proto */ static PyObject *__Pyx_GetBuiltinName(PyObject *name); /* GetModuleGlobalName.proto */ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); /* pyobject_as_double.proto */ static double __Pyx__PyObject_AsDouble(PyObject* obj); #if CYTHON_COMPILING_IN_PYPY #define __Pyx_PyObject_AsDouble(obj)\ (likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) :\ likely(PyInt_CheckExact(obj)) ?\ PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj)) #else #define __Pyx_PyObject_AsDouble(obj)\ ((likely(PyFloat_CheckExact(obj))) ?\ PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj)) #endif /* PyThreadStateGet.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; #define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; #define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type #else #define __Pyx_PyThreadState_declare #define __Pyx_PyThreadState_assign #define __Pyx_PyErr_Occurred() PyErr_Occurred() #endif /* PyErrFetchRestore.proto */ #if CYTHON_FAST_THREAD_STATE #define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) #define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) #define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) #define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) #else #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #endif #else #define __Pyx_PyErr_Clear() PyErr_Clear() #define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) #define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) #define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) #define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) #endif /* CLineInTraceback.proto */ #ifdef CYTHON_CLINE_IN_TRACEBACK #define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) #else static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); #endif /* CodeObjectCache.proto */ typedef struct { PyCodeObject* code_object; int code_line; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); /* AddTraceback.proto */ static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /* CIntFromPy.proto */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); /* CIntToPy.proto */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); /* CIntFromPy.proto */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); /* FastTypeChecks.proto */ #if CYTHON_COMPILING_IN_CPYTHON #define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); #else #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) #define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) #endif /* CheckBinaryVersion.proto */ static int __Pyx_check_binary_version(void); /* InitStrings.proto */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /* Module declarations from 'libc.math' */ /* Module declarations from 'kullback_leibler_cython' */ static float __pyx_v_23kullback_leibler_cython_eps; #define __Pyx_MODULE_NAME "kullback_leibler_cython" int __pyx_module_is_main_kullback_leibler_cython = 0; /* Implementation of 'kullback_leibler_cython' */ static const char __pyx_k_a[] = "a"; static const char __pyx_k_d[] = "d"; static const char __pyx_k_m[] = "m"; static const char __pyx_k_n[] = "n"; static const char __pyx_k_r[] = "r"; static const char __pyx_k_u[] = "u"; static const char __pyx_k_x[] = "x"; static const char __pyx_k_y[] = "y"; static const char __pyx_k_kl[] = "kl"; static const char __pyx_k_0_9[] = "0.9"; static const char __pyx_k_inf[] = "+inf"; static const char __pyx_k_main[] = "__main__"; static const char __pyx_k_test[] = "__test__"; static const char __pyx_k_inf_2[] = "-inf"; static const char __pyx_k_klBin[] = "klBin"; static const char __pyx_k_klExp[] = "klExp"; static const char __pyx_k_klucb[] = "klucb"; static const char __pyx_k_sig2x[] = "sig2x"; static const char __pyx_k_sig2y[] = "sig2y"; static const char __pyx_k_value[] = "value"; static const char __pyx_k_author[] = "__author__"; static const char __pyx_k_klBern[] = "klBern"; static const char __pyx_k_klGamma[] = "klGamma"; static const char __pyx_k_klGauss[] = "klGauss"; static const char __pyx_k_version[] = "__version__"; static const char __pyx_k_klNegBin[] = "klNegBin"; static const char __pyx_k_klucbExp[] = "klucbExp"; static const char __pyx_k_klPoisson[] = "klPoisson"; static const char __pyx_k_klucbBern[] = "klucbBern"; static const char __pyx_k_precision[] = "precision"; static const char __pyx_k_klucbGamma[] = "klucbGamma"; static const char __pyx_k_klucbGauss[] = "klucbGauss"; static const char __pyx_k_lowerbound[] = "lowerbound"; static const char __pyx_k_upperbound[] = "upperbound"; static const char __pyx_k_klucbPoisson[] = "klucbPoisson"; static const char __pyx_k_klBern_line_95[] = "klBern (line 95)"; static const char __pyx_k_klBin_line_121[] = "klBin (line 121)"; static const char __pyx_k_klExp_line_179[] = "klExp (line 179)"; static const char __pyx_k_klucb_line_389[] = "klucb (line 389)"; static const char __pyx_k_max_iterations[] = "max_iterations"; static const char __pyx_k_count_iteration[] = "_count_iteration"; static const char __pyx_k_klGamma_line_219[] = "klGamma (line 219)"; static const char __pyx_k_klGauss_line_306[] = "klGauss (line 306)"; static const char __pyx_k_klNegBin_line_263[] = "klNegBin (line 263)"; static const char __pyx_k_klucbExp_line_541[] = "klucbExp (line 541)"; static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; static const char __pyx_k_klPoisson_line_151[] = "klPoisson (line 151)"; static const char __pyx_k_klucbBern_line_436[] = "klucbBern (line 436)"; static const char __pyx_k_klucbGamma_line_585[] = "klucbGamma (line 585)"; static const char __pyx_k_klucbGauss_line_470[] = "klucbGauss (line 470)"; static const char __pyx_k_klucbPoisson_line_508[] = "klucbPoisson (line 508)"; static const char __pyx_k_kullback_leibler_cython[] = "kullback_leibler_cython"; static const char __pyx_k_kullback_leibler_cython_pyx[] = "kullback_leibler_cython.pyx"; static const char __pyx_k_KL_UCB_index_computation_for_Be[] = " KL-UCB index computation for Bernoulli distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbBern(0.1, 0.2) # doctest: +ELLIPSIS\n 0.378391...\n >>> klucbBern(0.5, 0.2) # doctest: +ELLIPSIS\n 0.787088...\n >>> klucbBern(0.9, 0.2) # doctest: +ELLIPSIS\n 0.994489...\n\n - Influence of d:\n\n >>> klucbBern(0.1, 0.4) # doctest: +ELLIPSIS\n 0.519475...\n >>> klucbBern(0.1, 0.9) # doctest: +ELLIPSIS\n 0.734714...\n\n >>> klucbBern(0.5, 0.4) # doctest: +ELLIPSIS\n 0.871035...\n >>> klucbBern(0.5, 0.9) # doctest: +ELLIPSIS\n 0.956809...\n\n >>> klucbBern(0.9, 0.4) # doctest: +ELLIPSIS\n 0.999285...\n >>> klucbBern(0.9, 0.9) # doctest: +ELLIPSIS\n 0.999995...\n "; static const char __pyx_k_KL_UCB_index_computation_for_Ga[] = " KL-UCB index computation for Gaussian distributions.\n\n - Note that it does not require any search.\n\n .. warning:: it works only if the good variance constant is given.\n\n - Influence of x:\n\n >>> klucbGauss(0.1, 0.2) # doctest: +ELLIPSIS\n 0.416227...\n >>> klucbGauss(0.5, 0.2) # doctest: +ELLIPSIS\n 0.816227...\n >>> klucbGauss(0.9, 0.2) # doctest: +ELLIPSIS\n 1.216227...\n\n - Influence of d:\n\n >>> klucbGauss(0.1, 0.4) # doctest: +ELLIPSIS\n 0.547213...\n >>> klucbGauss(0.1, 0.9) # doctest: +ELLIPSIS\n 0.770820...\n\n >>> klucbGauss(0.5, 0.4) # doctest: +ELLIPSIS\n 0.947213...\n >>> klucbGauss(0.5, 0.9) # doctest: +ELLIPSIS\n 1.170820...\n\n >>> klucbGauss(0.9, 0.4) # doctest: +ELLIPSIS\n 1.347213...\n >>> klucbGauss(0.9, 0.9) # doctest: +ELLIPSIS\n 1.570820...\n\n .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klucbGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version.\n "; static const char __pyx_k_KL_UCB_index_computation_for_Po[] = " KL-UCB index computation for Poisson distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbPoisson(0.1, 0.2) # doctest: +ELLIPSIS\n 0.450523...\n >>> klucbPoisson(0.5, 0.2) # doctest: +ELLIPSIS\n 1.089376...\n >>> klucbPoisson(0.9, 0.2) # doctest: +ELLIPSIS\n 1.640112...\n\n - Influence of d:\n\n >>> klucbPoisson(0.1, 0.4) # doctest: +ELLIPSIS\n 0.693684...\n >>> klucbPoisson(0.1, 0.9) # doctest: +ELLIPSIS\n 1.252796...\n\n >>> klucbPoisson(0.5, 0.4) # doctest: +ELLIPSIS\n 1.422933...\n >>> klucbPoisson(0.5, 0.9) # doctest: +ELLIPSIS\n 2.122985...\n\n >>> klucbPoisson(0.9, 0.4) # doctest: +ELLIPSIS\n 2.033691...\n >>> klucbPoisson(0.9, 0.9) # doctest: +ELLIPSIS\n 2.831573...\n "; static const char __pyx_k_KL_UCB_index_computation_for_ex[] = " KL-UCB index computation for exponential distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbExp(0.1, 0.2) # doctest: +ELLIPSIS\n 0.202741...\n >>> klucbExp(0.5, 0.2) # doctest: +ELLIPSIS\n 1.013706...\n >>> klucbExp(0.9, 0.2) # doctest: +ELLIPSIS\n 1.824671...\n\n - Influence of d:\n\n >>> klucbExp(0.1, 0.4) # doctest: +ELLIPSIS\n 0.285792...\n >>> klucbExp(0.1, 0.9) # doctest: +ELLIPSIS\n 0.559088...\n\n >>> klucbExp(0.5, 0.4) # doctest: +ELLIPSIS\n 1.428962...\n >>> klucbExp(0.5, 0.9) # doctest: +ELLIPSIS\n 2.795442...\n\n >>> klucbExp(0.9, 0.4) # doctest: +ELLIPSIS\n 2.572132...\n >>> klucbExp(0.9, 0.9) # doctest: +ELLIPSIS\n 5.031795...\n "; static const char __pyx_k_Kullback_Leibler_divergence_for[] = " Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math:: \\mathrm{KL}(\\mathcal{B}(x), \\mathcal{B}(y)) = x \\log(\\frac{x}{y}) + (1-x) \\log(\\frac{1-x}{1-y}).\n\n >>> klBern(0.5, 0.5)\n 0.0\n >>> klBern(0.1, 0.9) # doctest: +ELLIPSIS\n 1.757779...\n >>> klBern(0.9, 0.1) # And this KL is symmetric # doctest: +ELLIPSIS\n 1.757779...\n >>> klBern(0.4, 0.5) # doctest: +ELLIPSIS\n 0.020135...\n >>> klBern(0.01, 0.99) # doctest: +ELLIPSIS\n 4.503217...\n\n - Special values:\n\n >>> klBern(0, 1) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 34.539575...\n "; static const char __pyx_k_Kullback_Leibler_divergence_fun[] = " Kullback-Leibler divergence functions and klUCB utilities. Optimized version that should be compiled using Cython (http://docs.cython.org/).\n\n- Faster implementation can be found in a C file, in ``Policies/C``, and should be compiled to speedup computations.\n- However, the version here have examples, doctests.\n- Cf. https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence\n- Reference: [Filippi, Capp\303\251 & Garivier - Allerton, 2011](https://arxiv.org/pdf/1004.5229.pdf) and [Garivier & Capp\303\251, 2011](https://arxiv.org/pdf/1102.2490.pdf)\n\n\n.. note::\n\n The C version is still faster, but not so much. The Cython version has the advantage of providing docstrings, and optional arguments, and is only 2 to 3 times slower than the optimal performance!\n Here are some comparisons of the two, when computing KL-UCB indexes:\n\n >>> r = np.random.random\n >>> import kullback_c; import kullback_cython # fake, just for illustration\n\n >>> %timeit kullback_c.klucbBern(r(), r(), 1e-6)\n 2.26 \302\265s \302\261 21.5 ns per loop (mean \302\261 std. dev. of 7 runs, 100000 loops each)\n >>> %timeit kullback_cython.klucbBern(r(), r())\n 6.04 \302\265s \302\261 46.7 ns per loop (mean \302\261 std. dev. of 7 runs, 10000 loops each)\n\n >>> %timeit kullback_c.klucbGamma(r(), r(), 1e-6)\n 2.56 \302\265s \302\261 225 ns per loop (mean \302\261 std. dev. of 7 runs, 100000 loops each)\n >>> %timeit kullback_cython.klucbGamma(r(), r())\n 6.47 \302\265s \302\261 513 ns per loop (mean \302\261 std. dev. of 7 runs, 10000 loops each)\n\n >>> %timeit kullback_c.klucbExp(r(), r(), 1e-6)\n 2.03 \302\265s \302\261 92.2 ns per loop (mean \302\261 std. dev. of 7 runs, 100000 loops each)\n >>> %timeit kullback_cython.klucbExp(r(), r())\n 4.75 \302\265s \302\261 444 ns per loop (mean \302\261 std. dev. of 7 runs, 10000 loops each)\n\n >>> %timeit kullback_c.klucbGauss(r(), r(), 1e-6) # so easy computation: no difference!\n 8""00 ns \302\261 14.3 ns per loop (mean \302\261 std. dev. of 7 runs, 100000 loops each)\n >>> %timeit kullback_cython.klucbGauss(r(), r())\n 732 ns \302\261 71.5 ns per loop (mean \302\261 std. dev. of 7 runs, 10000 loops each)\n\n >>> %timeit kullback_c.klucbPoisson(r(), r(), 1e-6)\n 2.33 \302\265s \302\261 167 ns per loop (mean \302\261 std. dev. of 7 runs, 100000 loops each)\n >>> %timeit kullback_cython.klucbPoisson(r(), r())\n 5.13 \302\265s \302\261 521 ns per loop (mean \302\261 std. dev. of 7 runs, 10000 loops each)\n\n\n.. warning::\n\n This extension should be used with the ``setup.py`` script, by running::\n\n $ python setup.py build_ext --inplace\n\n You can also use [pyximport](http://docs.cython.org/en/latest/src/tutorial/cython_tutorial.html#pyximport-cython-compilation-for-developers) to import the ``kullback_cython`` module transparently:\n\n >>> import pyximport; pyximport.install() # instantaneous # doctest: +ELLIPSIS\n (None, )\n >>> import kullback_cython as kullback # takes about two seconds\n >>> # then use kullback.klucbBern or others, as if they came from the pure Python version!\n\n\n.. warning::\n\n All functions are *not* vectorized, and assume only one value for each argument.\n If you want vectorized function, use the wrapper :py:class:`numpy.vectorize`:\n\n >>> import numpy as np\n >>> klBern_vect = np.vectorize(klBern)\n >>> klBern_vect([0.1, 0.5, 0.9], 0.2) # doctest: +ELLIPSIS\n array([0.036..., 0.223..., 1.145...])\n >>> klBern_vect(0.4, [0.2, 0.3, 0.4]) # doctest: +ELLIPSIS\n array([0.104..., 0.022..., 0...])\n >>> klBern_vect([0.1, 0.5, 0.9], [0.2, 0.3, 0.4]) # doctest: +ELLIPSIS\n array([0.036..., 0.087..., 0.550...])\n\n For some functions, you would be better off writing a vectorized version manually, for instance if you want to fix a value of some optional parameters:\n\n >>> # WARNING using np.vect""orize gave weird result on klGauss\n >>> # klGauss_vect = np.vectorize(klGauss, excluded=\"y\")\n >>> def klGauss_vect(xs, y, sig2x=0.25) -> float: # vectorized for first input only\n ... return np.array([klGauss(x, y, sig2x) for x in xs])\n >>> klGauss_vect([-1, 0, 1], 0.1) # doctest: +ELLIPSIS\n array([2.42, 0.02, 1.62])\n"; static const char __pyx_k_The_generic_KL_UCB_index_comput[] = " The generic KL-UCB index computation.\n\n - x: value of the cum reward,\n - d: upper bound on the divergence,\n - kl: the KL divergence to be used (:func:`klBern`, :func:`klGauss`, etc),\n - upperbound, lowerbound=float('-inf') -> float: the known bound of the values x,\n - precision=1e-6: the threshold from where to stop the research,\n - max_iterations: max number of iterations of the loop (safer to bound it to reduce time complexity).\n\n .. note:: It uses a **bisection search**, and one call to ``kl`` for each step of the bisection search.\n\n For example, for :func:`klucbBern`, the two steps are to first compute an upperbound (as precise as possible) and the compute the kl-UCB index:\n\n >>> x, d = 0.9, 0.2 # mean x, exploration term d\n >>> upperbound = min(1., klucbGauss(x, d, sig2x=0.25)) # variance 1/4 for [0,1] bounded distributions\n >>> upperbound # doctest: +ELLIPSIS\n 1.0\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-3, max_iterations=10) # doctest: +ELLIPSIS\n 0.9941...\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-6, max_iterations=10) # doctest: +ELLIPSIS\n 0.994482... # doctest: +ELLIPSIS\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-3, max_iterations=50) # doctest: +ELLIPSIS\n 0.9941...\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-6, max_iterations=100) # more and more precise! # doctest: +ELLIPSIS\n 0.994489...\n\n .. note:: See below for more examples for different KL divergence functions.\n "; static const char __pyx_k_Olivier_Capp_Aurlien_Garivier_Li[] = "Olivier Capp\303\251, Aur\303\251lien Garivier, Lilian Besson"; static const char __pyx_k_KL_UCB_index_computation_for_Ga_2[] = " KL-UCB index computation for Gamma distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbGamma(0.1, 0.2) # doctest: +ELLIPSIS\n 0.202...\n >>> klucbGamma(0.5, 0.2) # doctest: +ELLIPSIS\n 1.013...\n >>> klucbGamma(0.9, 0.2) # doctest: +ELLIPSIS\n 1.824...\n\n - Influence of d:\n\n >>> klucbGamma(0.1, 0.4) # doctest: +ELLIPSIS\n 0.285...\n >>> klucbGamma(0.1, 0.9) # doctest: +ELLIPSIS\n 0.559...\n\n >>> klucbGamma(0.5, 0.4) # doctest: +ELLIPSIS\n 1.428...\n >>> klucbGamma(0.5, 0.9) # doctest: +ELLIPSIS\n 2.795...\n\n >>> klucbGamma(0.9, 0.4) # doctest: +ELLIPSIS\n 2.572...\n >>> klucbGamma(0.9, 0.9) # doctest: +ELLIPSIS\n 5.031...\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_2[] = " Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions\n\n - It is simply the n times :func:`klBern` on x and y.\n\n .. math:: \\mathrm{KL}(\\mathrm{Bin}(x, n), \\mathrm{Bin}(y, n)) = n \\times \\left(x \\log(\\frac{x}{y}) + (1-x) \\log(\\frac{1-x}{1-y}) \\right).\n\n .. warning:: The two distributions must have the same parameter n, and x, y are p, q in (0, 1).\n\n >>> klBin(0.5, 0.5, 10)\n 0.0\n >>> klBin(0.1, 0.9, 10) # doctest: +ELLIPSIS\n 17.57779...\n >>> klBin(0.9, 0.1, 10) # And this KL is symmetric # doctest: +ELLIPSIS\n 17.57779...\n >>> klBin(0.4, 0.5, 10) # doctest: +ELLIPSIS\n 0.20135...\n >>> klBin(0.01, 0.99, 10) # doctest: +ELLIPSIS\n 45.03217...\n\n - Special values:\n\n >>> klBin(0, 1, 10) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 345.39575...\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_3[] = " Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math:: \\mathrm{KL}(\\mathrm{Poisson}(x), \\mathrm{Poisson}(y)) = y - x + x \\times \\log(\\frac{x}{y}).\n\n >>> klPoisson(3, 3)\n 0.0\n >>> klPoisson(2, 1) # doctest: +ELLIPSIS\n 0.386294...\n >>> klPoisson(1, 2) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klPoisson(3, 6) # doctest: +ELLIPSIS\n 0.920558...\n >>> klPoisson(6, 8) # doctest: +ELLIPSIS\n 0.273907...\n\n - Special values:\n\n >>> klPoisson(1, 0) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 33.538776...\n >>> klPoisson(0, 0)\n 0.0\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_4[] = " Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math::\n\n \\mathrm{KL}(\\mathrm{Exp}(x), \\mathrm{Exp}(y)) = \\begin{cases}\n \\frac{x}{y} - 1 - \\log(\\frac{x}{y}) & \\text{if} x > 0, y > 0\\\\\n +\\infty & \\text{otherwise}\n \\end{cases}\n\n >>> klExp(3, 3)\n 0.0\n >>> klExp(3, 6) # doctest: +ELLIPSIS\n 0.193147...\n >>> klExp(1, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.193147...\n >>> klExp(2, 1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klExp(4, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.306852...\n >>> klExp(6, 8) # doctest: +ELLIPSIS\n 0.037682...\n\n - x, y have to be positive:\n\n >>> klExp(-3, 2)\n inf\n >>> klExp(3, -2)\n inf\n >>> klExp(-3, -2)\n inf\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_5[] = " Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence\n\n - It is simply the a times :func:`klExp` on x and y.\n\n .. math::\n\n \\mathrm{KL}(\\Gamma(x, a), \\Gamma(y, a)) = \\begin{cases}\n a \\times \\left( \\frac{x}{y} - 1 - \\log(\\frac{x}{y}) \\right) & \\text{if} x > 0, y > 0\\\\\n +\\infty & \\text{otherwise}\n \\end{cases}\n\n .. warning:: The two distributions must have the same parameter a.\n\n >>> klGamma(3, 3)\n 0.0\n >>> klGamma(3, 6) # doctest: +ELLIPSIS\n 0.193147...\n >>> klGamma(1, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.193147...\n >>> klGamma(2, 1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klGamma(4, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.306852...\n >>> klGamma(6, 8) # doctest: +ELLIPSIS\n 0.037682...\n\n - x, y have to be positive:\n\n >>> klGamma(-3, 2)\n inf\n >>> klGamma(3, -2)\n inf\n >>> klGamma(-3, -2)\n inf\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_6[] = " Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution\n\n .. math:: \\mathrm{KL}(\\mathrm{NegBin}(x, r), \\mathrm{NegBin}(y, r)) = r \\times \\log((r + x) / (r + y)) - x \\times \\log(y \\times (r + x) / (x \\times (r + y))).\n\n .. warning:: The two distributions must have the same parameter r.\n\n >>> klNegBin(0.5, 0.5)\n 0.0\n >>> klNegBin(0.1, 0.9) # doctest: +ELLIPSIS\n -0.711611...\n >>> klNegBin(0.9, 0.1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 2.0321564...\n >>> klNegBin(0.4, 0.5) # doctest: +ELLIPSIS\n -0.130653...\n >>> klNegBin(0.01, 0.99) # doctest: +ELLIPSIS\n -0.717353...\n\n - Special values:\n\n >>> klBern(0, 1) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 34.539575...\n\n - With other values for `r`:\n\n >>> klNegBin(0.5, 0.5, r=2)\n 0.0\n >>> klNegBin(0.1, 0.9, r=2) # doctest: +ELLIPSIS\n -0.832991...\n >>> klNegBin(0.1, 0.9, r=4) # doctest: +ELLIPSIS\n -0.914890...\n >>> klNegBin(0.9, 0.1, r=2) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 2.3325528...\n >>> klNegBin(0.4, 0.5, r=2) # doctest: +ELLIPSIS\n -0.154572...\n >>> klNegBin(0.01, 0.99, r=2) # doctest: +ELLIPSIS\n -0.836257...\n "; static const char __pyx_k_Kullback_Leibler_divergence_for_7[] = " Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\\nu_1 = \\mathcal{N}(x, \\sigma_x^2)` and :math:`\\nu_2 = \\mathcal{N}(y, \\sigma_x^2)`:\n\n .. math:: \\mathrm{KL}(\\nu_1, \\nu_2) = \\frac{(x - y)^2}{2 \\sigma_y^2} + \\frac{1}{2}\\left( \\frac{\\sigma_x^2}{\\sigma_y^2} - 1 \\log\\left(\\frac{\\sigma_x^2}{\\sigma_y^2}\\right) \\right).\n\n See https://en.wikipedia.org/wiki/Normal_distribution#Other_properties\n\n - By default, sig2y is assumed to be sig2x (same variance).\n\n .. warning:: The C version does not support different variances.\n\n >>> klGauss(3, 3)\n 0.0\n >>> klGauss(3, 6)\n 18.0\n >>> klGauss(1, 2)\n 2.0\n >>> klGauss(2, 1) # And this KL is symmetric\n 2.0\n >>> klGauss(4, 2)\n 8.0\n >>> klGauss(6, 8)\n 8.0\n\n - x, y can be negative:\n\n >>> klGauss(-3, 2)\n 50.0\n >>> klGauss(3, -2)\n 50.0\n >>> klGauss(-3, -2)\n 2.0\n >>> klGauss(3, 2)\n 2.0\n\n - With other values for `sig2x`:\n\n >>> klGauss(3, 3, sig2x=10)\n 0.0\n >>> klGauss(3, 6, sig2x=10)\n 0.45\n >>> klGauss(1, 2, sig2x=10)\n 0.05\n >>> klGauss(2, 1, sig2x=10) # And this KL is symmetric\n 0.05\n >>> klGauss(4, 2, sig2x=10)\n 0.2\n >>> klGauss(6, 8, sig2x=10)\n 0.2\n\n - With different values for `sig2x` and `sig2y`:\n\n >>> klGauss(0, 0, sig2x=0.25, sig2y=0.5) # doctest: +ELLIPSIS\n -0.0284...\n >>> klGauss(0, 0, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.2243...\n >>> klGauss(0, 0, sig2x=0.5, sig2y=0.25) # not symmetric here! # doctest: +ELLIPSIS\n 1.1534...\n\n >>> klGauss(0, 1, sig2x=0.25, sig2y=0.5) # doctest: +ELLIPSIS\n 0.9715...\n >>> klGauss(0, 1, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.7243...\n >>> klGauss(0, 1, sig2x=0.5, sig2y=0.25) # not symmetric here! # doctest: +ELLIPSIS\n 3.1534...\n\n >>> klGauss(1, 0, sig2x=0.25, sig2y=""0.5) # doctest: +ELLIPSIS\n 0.9715...\n >>> klGauss(1, 0, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.7243...\n >>> klGauss(1, 0, sig2x=0.5, sig2y=0.25) # not symmetric here! # doctest: +ELLIPSIS\n 3.1534...\n\n .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version.\n "; static PyObject *__pyx_kp_u_0_9; static PyObject *__pyx_kp_u_KL_UCB_index_computation_for_Be; static PyObject *__pyx_kp_u_KL_UCB_index_computation_for_Ga; static PyObject *__pyx_kp_u_KL_UCB_index_computation_for_Ga_2; static PyObject *__pyx_kp_u_KL_UCB_index_computation_for_Po; static PyObject *__pyx_kp_u_KL_UCB_index_computation_for_ex; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_2; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_3; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_4; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_5; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_6; static PyObject *__pyx_kp_u_Kullback_Leibler_divergence_for_7; static PyObject *__pyx_kp_u_Olivier_Capp_Aurlien_Garivier_Li; static PyObject *__pyx_kp_u_The_generic_KL_UCB_index_comput; static PyObject *__pyx_n_s_a; static PyObject *__pyx_n_s_author; static PyObject *__pyx_n_s_cline_in_traceback; static PyObject *__pyx_n_s_count_iteration; static PyObject *__pyx_n_s_d; static PyObject *__pyx_kp_u_inf; static PyObject *__pyx_kp_u_inf_2; static PyObject *__pyx_n_s_kl; static PyObject *__pyx_n_s_klBern; static PyObject *__pyx_kp_u_klBern_line_95; static PyObject *__pyx_n_s_klBin; static PyObject *__pyx_kp_u_klBin_line_121; static PyObject *__pyx_n_s_klExp; static PyObject *__pyx_kp_u_klExp_line_179; static PyObject *__pyx_n_s_klGamma; static PyObject *__pyx_kp_u_klGamma_line_219; static PyObject *__pyx_n_s_klGauss; static PyObject *__pyx_kp_u_klGauss_line_306; static PyObject *__pyx_n_s_klNegBin; static PyObject *__pyx_kp_u_klNegBin_line_263; static PyObject *__pyx_n_s_klPoisson; static PyObject *__pyx_kp_u_klPoisson_line_151; static PyObject *__pyx_n_s_klucb; static PyObject *__pyx_n_s_klucbBern; static PyObject *__pyx_kp_u_klucbBern_line_436; static PyObject *__pyx_n_s_klucbExp; static PyObject *__pyx_kp_u_klucbExp_line_541; static PyObject *__pyx_n_s_klucbGamma; static PyObject *__pyx_kp_u_klucbGamma_line_585; static PyObject *__pyx_n_s_klucbGauss; static PyObject *__pyx_kp_u_klucbGauss_line_470; static PyObject *__pyx_n_s_klucbPoisson; static PyObject *__pyx_kp_u_klucbPoisson_line_508; static PyObject *__pyx_kp_u_klucb_line_389; static PyObject *__pyx_n_s_kullback_leibler_cython; static PyObject *__pyx_kp_s_kullback_leibler_cython_pyx; static PyObject *__pyx_n_s_lowerbound; static PyObject *__pyx_n_s_m; static PyObject *__pyx_n_s_main; static PyObject *__pyx_n_s_max_iterations; static PyObject *__pyx_n_s_n; static PyObject *__pyx_n_s_precision; static PyObject *__pyx_n_s_r; static PyObject *__pyx_n_s_sig2x; static PyObject *__pyx_n_s_sig2y; static PyObject *__pyx_n_s_test; static PyObject *__pyx_n_s_u; static PyObject *__pyx_n_s_upperbound; static PyObject *__pyx_n_s_value; static PyObject *__pyx_n_s_version; static PyObject *__pyx_n_s_x; static PyObject *__pyx_n_s_y; static PyObject *__pyx_pf_23kullback_leibler_cython_klBern(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_2klBin(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, int __pyx_v_n); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_4klPoisson(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_6klExp(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_8klGamma(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, float __pyx_v_a); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_10klNegBin(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, PyObject *__pyx_v_r); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_12klGauss(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, float __pyx_v_sig2x, float __pyx_v_sig2y); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_14klucb(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, PyObject *__pyx_v_kl, float __pyx_v_upperbound, float __pyx_v_lowerbound, float __pyx_v_precision, int __pyx_v_max_iterations); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_16klucbBern(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_18klucbGauss(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_sig2x, CYTHON_UNUSED float __pyx_v_precision); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_20klucbPoisson(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_22klucbExp(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision); /* proto */ static PyObject *__pyx_pf_23kullback_leibler_cython_24klucbGamma(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision); /* proto */ static PyObject *__pyx_float_0_25; static PyObject *__pyx_int_1; static float __pyx_k_; static PyObject *__pyx_tuple__2; static PyObject *__pyx_tuple__4; static PyObject *__pyx_tuple__6; static PyObject *__pyx_tuple__8; static PyObject *__pyx_tuple__10; static PyObject *__pyx_tuple__12; static PyObject *__pyx_tuple__14; static PyObject *__pyx_tuple__16; static PyObject *__pyx_tuple__18; static PyObject *__pyx_tuple__20; static PyObject *__pyx_tuple__22; static PyObject *__pyx_tuple__24; static PyObject *__pyx_tuple__26; static PyObject *__pyx_codeobj__3; static PyObject *__pyx_codeobj__5; static PyObject *__pyx_codeobj__7; static PyObject *__pyx_codeobj__9; static PyObject *__pyx_codeobj__11; static PyObject *__pyx_codeobj__13; static PyObject *__pyx_codeobj__15; static PyObject *__pyx_codeobj__17; static PyObject *__pyx_codeobj__19; static PyObject *__pyx_codeobj__21; static PyObject *__pyx_codeobj__23; static PyObject *__pyx_codeobj__25; static PyObject *__pyx_codeobj__27; /* "kullback_leibler_cython.pyx":95 * * * def klBern(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_1klBern(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_klBern[] = "klBern(float x, float y) -> float\n Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math:: \\mathrm{KL}(\\mathcal{B}(x), \\mathcal{B}(y)) = x \\log(\\frac{x}{y}) + (1-x) \\log(\\frac{1-x}{1-y}).\n\n >>> klBern(0.5, 0.5)\n 0.0\n >>> klBern(0.1, 0.9) # doctest: +ELLIPSIS\n 1.757779...\n >>> klBern(0.9, 0.1) # And this KL is symmetric # doctest: +ELLIPSIS\n 1.757779...\n >>> klBern(0.4, 0.5) # doctest: +ELLIPSIS\n 0.020135...\n >>> klBern(0.01, 0.99) # doctest: +ELLIPSIS\n 4.503217...\n\n - Special values:\n\n >>> klBern(0, 1) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 34.539575...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_1klBern = {"klBern", (PyCFunction)__pyx_pw_23kullback_leibler_cython_1klBern, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_klBern}; static PyObject *__pyx_pw_23kullback_leibler_cython_1klBern(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klBern (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0}; PyObject* values[2] = {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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klBern", 1, 2, 2, 1); __PYX_ERR(0, 95, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klBern") < 0)) __PYX_ERR(0, 95, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 95, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 95, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klBern", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 95, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klBern", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_klBern(__pyx_self, __pyx_v_x, __pyx_v_y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_klBern(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; float __pyx_t_4; PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("klBern", 0); /* "kullback_leibler_cython.pyx":116 * 34.539575... * """ * x = min(max(x, eps), 1 - eps) # <<<<<<<<<<<<<< * y = min(max(y, eps), 1 - eps) * return x * log(x / y) + (1 - x) * log((1 - x) / (1 - y)) */ __pyx_t_1 = (1.0 - __pyx_v_23kullback_leibler_cython_eps); __pyx_t_2 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_3 = __pyx_v_x; if (((__pyx_t_2 > __pyx_t_3) != 0)) { __pyx_t_4 = __pyx_t_2; } else { __pyx_t_4 = __pyx_t_3; } __pyx_t_2 = __pyx_t_4; if (((__pyx_t_1 < __pyx_t_2) != 0)) { __pyx_t_4 = __pyx_t_1; } else { __pyx_t_4 = __pyx_t_2; } __pyx_v_x = __pyx_t_4; /* "kullback_leibler_cython.pyx":117 * """ * x = min(max(x, eps), 1 - eps) * y = min(max(y, eps), 1 - eps) # <<<<<<<<<<<<<< * return x * log(x / y) + (1 - x) * log((1 - x) / (1 - y)) * */ __pyx_t_4 = (1.0 - __pyx_v_23kullback_leibler_cython_eps); __pyx_t_1 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_2 = __pyx_v_y; if (((__pyx_t_1 > __pyx_t_2) != 0)) { __pyx_t_3 = __pyx_t_1; } else { __pyx_t_3 = __pyx_t_2; } __pyx_t_1 = __pyx_t_3; if (((__pyx_t_4 < __pyx_t_1) != 0)) { __pyx_t_3 = __pyx_t_4; } else { __pyx_t_3 = __pyx_t_1; } __pyx_v_y = __pyx_t_3; /* "kullback_leibler_cython.pyx":118 * x = min(max(x, eps), 1 - eps) * y = min(max(y, eps), 1 - eps) * return x * log(x / y) + (1 - x) * log((1 - x) / (1 - y)) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 118, __pyx_L1_error) } __pyx_t_3 = (1.0 - __pyx_v_x); __pyx_t_4 = (1.0 - __pyx_v_y); if (unlikely(__pyx_t_4 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 118, __pyx_L1_error) } __pyx_t_5 = PyFloat_FromDouble(((__pyx_v_x * log((__pyx_v_x / __pyx_v_y))) + ((1.0 - __pyx_v_x) * log((__pyx_t_3 / __pyx_t_4))))); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":95 * * * def klBern(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("kullback_leibler_cython.klBern", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":121 * * * def klBin(float x, float y, int n) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_3klBin(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_2klBin[] = "klBin(float x, float y, int n) -> float\n Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions\n\n - It is simply the n times :func:`klBern` on x and y.\n\n .. math:: \\mathrm{KL}(\\mathrm{Bin}(x, n), \\mathrm{Bin}(y, n)) = n \\times \\left(x \\log(\\frac{x}{y}) + (1-x) \\log(\\frac{1-x}{1-y}) \\right).\n\n .. warning:: The two distributions must have the same parameter n, and x, y are p, q in (0, 1).\n\n >>> klBin(0.5, 0.5, 10)\n 0.0\n >>> klBin(0.1, 0.9, 10) # doctest: +ELLIPSIS\n 17.57779...\n >>> klBin(0.9, 0.1, 10) # And this KL is symmetric # doctest: +ELLIPSIS\n 17.57779...\n >>> klBin(0.4, 0.5, 10) # doctest: +ELLIPSIS\n 0.20135...\n >>> klBin(0.01, 0.99, 10) # doctest: +ELLIPSIS\n 45.03217...\n\n - Special values:\n\n >>> klBin(0, 1, 10) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 345.39575...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_3klBin = {"klBin", (PyCFunction)__pyx_pw_23kullback_leibler_cython_3klBin, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_2klBin}; static PyObject *__pyx_pw_23kullback_leibler_cython_3klBin(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; int __pyx_v_n; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klBin (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_n,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klBin", 1, 3, 3, 1); __PYX_ERR(0, 121, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_n)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klBin", 1, 3, 3, 2); __PYX_ERR(0, 121, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klBin") < 0)) __PYX_ERR(0, 121, __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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L3_error) __pyx_v_n = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_n == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 121, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klBin", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 121, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klBin", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_2klBin(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_n); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_2klBin(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, int __pyx_v_n) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; float __pyx_t_4; PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("klBin", 0); /* "kullback_leibler_cython.pyx":146 * 345.39575... * """ * x = min(max(x, eps), 1 - eps) # <<<<<<<<<<<<<< * y = min(max(y, eps), 1 - eps) * return n * (x * log(x / y) + (1 - x) * log((1 - x) / (1 - y))) */ __pyx_t_1 = (1.0 - __pyx_v_23kullback_leibler_cython_eps); __pyx_t_2 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_3 = __pyx_v_x; if (((__pyx_t_2 > __pyx_t_3) != 0)) { __pyx_t_4 = __pyx_t_2; } else { __pyx_t_4 = __pyx_t_3; } __pyx_t_2 = __pyx_t_4; if (((__pyx_t_1 < __pyx_t_2) != 0)) { __pyx_t_4 = __pyx_t_1; } else { __pyx_t_4 = __pyx_t_2; } __pyx_v_x = __pyx_t_4; /* "kullback_leibler_cython.pyx":147 * """ * x = min(max(x, eps), 1 - eps) * y = min(max(y, eps), 1 - eps) # <<<<<<<<<<<<<< * return n * (x * log(x / y) + (1 - x) * log((1 - x) / (1 - y))) * */ __pyx_t_4 = (1.0 - __pyx_v_23kullback_leibler_cython_eps); __pyx_t_1 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_2 = __pyx_v_y; if (((__pyx_t_1 > __pyx_t_2) != 0)) { __pyx_t_3 = __pyx_t_1; } else { __pyx_t_3 = __pyx_t_2; } __pyx_t_1 = __pyx_t_3; if (((__pyx_t_4 < __pyx_t_1) != 0)) { __pyx_t_3 = __pyx_t_4; } else { __pyx_t_3 = __pyx_t_1; } __pyx_v_y = __pyx_t_3; /* "kullback_leibler_cython.pyx":148 * x = min(max(x, eps), 1 - eps) * y = min(max(y, eps), 1 - eps) * return n * (x * log(x / y) + (1 - x) * log((1 - x) / (1 - y))) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 148, __pyx_L1_error) } __pyx_t_3 = (1.0 - __pyx_v_x); __pyx_t_4 = (1.0 - __pyx_v_y); if (unlikely(__pyx_t_4 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 148, __pyx_L1_error) } __pyx_t_5 = PyFloat_FromDouble((__pyx_v_n * ((__pyx_v_x * log((__pyx_v_x / __pyx_v_y))) + ((1.0 - __pyx_v_x) * log((__pyx_t_3 / __pyx_t_4)))))); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 148, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":121 * * * def klBin(float x, float y, int n) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("kullback_leibler_cython.klBin", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":151 * * * def klPoisson(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_5klPoisson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_4klPoisson[] = "klPoisson(float x, float y) -> float\n Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math:: \\mathrm{KL}(\\mathrm{Poisson}(x), \\mathrm{Poisson}(y)) = y - x + x \\times \\log(\\frac{x}{y}).\n\n >>> klPoisson(3, 3)\n 0.0\n >>> klPoisson(2, 1) # doctest: +ELLIPSIS\n 0.386294...\n >>> klPoisson(1, 2) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klPoisson(3, 6) # doctest: +ELLIPSIS\n 0.920558...\n >>> klPoisson(6, 8) # doctest: +ELLIPSIS\n 0.273907...\n\n - Special values:\n\n >>> klPoisson(1, 0) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 33.538776...\n >>> klPoisson(0, 0)\n 0.0\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_5klPoisson = {"klPoisson", (PyCFunction)__pyx_pw_23kullback_leibler_cython_5klPoisson, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_4klPoisson}; static PyObject *__pyx_pw_23kullback_leibler_cython_5klPoisson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klPoisson (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0}; PyObject* values[2] = {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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klPoisson", 1, 2, 2, 1); __PYX_ERR(0, 151, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klPoisson") < 0)) __PYX_ERR(0, 151, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 151, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 151, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klPoisson", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 151, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klPoisson", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_4klPoisson(__pyx_self, __pyx_v_x, __pyx_v_y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_4klPoisson(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; PyObject *__pyx_t_4 = NULL; __Pyx_RefNannySetupContext("klPoisson", 0); /* "kullback_leibler_cython.pyx":174 * 0.0 * """ * x = max(x, eps) # <<<<<<<<<<<<<< * y = max(y, eps) * return y - x + x * log(x / y) */ __pyx_t_1 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_2 = __pyx_v_x; if (((__pyx_t_1 > __pyx_t_2) != 0)) { __pyx_t_3 = __pyx_t_1; } else { __pyx_t_3 = __pyx_t_2; } __pyx_v_x = __pyx_t_3; /* "kullback_leibler_cython.pyx":175 * """ * x = max(x, eps) * y = max(y, eps) # <<<<<<<<<<<<<< * return y - x + x * log(x / y) * */ __pyx_t_3 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_1 = __pyx_v_y; if (((__pyx_t_3 > __pyx_t_1) != 0)) { __pyx_t_2 = __pyx_t_3; } else { __pyx_t_2 = __pyx_t_1; } __pyx_v_y = __pyx_t_2; /* "kullback_leibler_cython.pyx":176 * x = max(x, eps) * y = max(y, eps) * return y - x + x * log(x / y) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 176, __pyx_L1_error) } __pyx_t_4 = PyFloat_FromDouble(((__pyx_v_y - __pyx_v_x) + (__pyx_v_x * log((__pyx_v_x / __pyx_v_y))))); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 176, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":151 * * * def klPoisson(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("kullback_leibler_cython.klPoisson", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":179 * * * def klExp(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_7klExp(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_6klExp[] = "klExp(float x, float y) -> float\n Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence\n\n .. math::\n\n \\mathrm{KL}(\\mathrm{Exp}(x), \\mathrm{Exp}(y)) = \\begin{cases}\n \\frac{x}{y} - 1 - \\log(\\frac{x}{y}) & \\text{if} x > 0, y > 0\\\\\n +\\infty & \\text{otherwise}\n \\end{cases}\n\n >>> klExp(3, 3)\n 0.0\n >>> klExp(3, 6) # doctest: +ELLIPSIS\n 0.193147...\n >>> klExp(1, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.193147...\n >>> klExp(2, 1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klExp(4, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.306852...\n >>> klExp(6, 8) # doctest: +ELLIPSIS\n 0.037682...\n\n - x, y have to be positive:\n\n >>> klExp(-3, 2)\n inf\n >>> klExp(3, -2)\n inf\n >>> klExp(-3, -2)\n inf\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_7klExp = {"klExp", (PyCFunction)__pyx_pw_23kullback_leibler_cython_7klExp, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_6klExp}; static PyObject *__pyx_pw_23kullback_leibler_cython_7klExp(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klExp (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0}; PyObject* values[2] = {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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klExp", 1, 2, 2, 1); __PYX_ERR(0, 179, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klExp") < 0)) __PYX_ERR(0, 179, __pyx_L3_error) } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 179, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 179, __pyx_L3_error) } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klExp", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 179, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klExp", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_6klExp(__pyx_self, __pyx_v_x, __pyx_v_y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_6klExp(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; float __pyx_t_4; float __pyx_t_5; float __pyx_t_6; __Pyx_RefNannySetupContext("klExp", 0); /* "kullback_leibler_cython.pyx":211 * inf * """ * if x <= 0 or y <= 0: # <<<<<<<<<<<<<< * return float('+inf') * else: */ __pyx_t_2 = ((__pyx_v_x <= 0.0) != 0); if (!__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = ((__pyx_v_y <= 0.0) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":212 * """ * if x <= 0 or y <= 0: * return float('+inf') # <<<<<<<<<<<<<< * else: * x = max(x, eps) */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyNumber_Float(__pyx_kp_u_inf); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 212, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":211 * inf * """ * if x <= 0 or y <= 0: # <<<<<<<<<<<<<< * return float('+inf') * else: */ } /* "kullback_leibler_cython.pyx":214 * return float('+inf') * else: * x = max(x, eps) # <<<<<<<<<<<<<< * y = max(y, eps) * return x / y - 1 - log(x / y) */ /*else*/ { __pyx_t_4 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_5 = __pyx_v_x; if (((__pyx_t_4 > __pyx_t_5) != 0)) { __pyx_t_6 = __pyx_t_4; } else { __pyx_t_6 = __pyx_t_5; } __pyx_v_x = __pyx_t_6; /* "kullback_leibler_cython.pyx":215 * else: * x = max(x, eps) * y = max(y, eps) # <<<<<<<<<<<<<< * return x / y - 1 - log(x / y) * */ __pyx_t_6 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_4 = __pyx_v_y; if (((__pyx_t_6 > __pyx_t_4) != 0)) { __pyx_t_5 = __pyx_t_6; } else { __pyx_t_5 = __pyx_t_4; } __pyx_v_y = __pyx_t_5; /* "kullback_leibler_cython.pyx":216 * x = max(x, eps) * y = max(y, eps) * return x / y - 1 - log(x / y) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 216, __pyx_L1_error) } if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 216, __pyx_L1_error) } __pyx_t_3 = PyFloat_FromDouble((((__pyx_v_x / __pyx_v_y) - 1.0) - log((__pyx_v_x / __pyx_v_y)))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 216, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } /* "kullback_leibler_cython.pyx":179 * * * def klExp(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("kullback_leibler_cython.klExp", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":219 * * * def klGamma(float x, float y, float a=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_9klGamma(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_8klGamma[] = "klGamma(float x, float y, float a=1) -> float\n Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence\n\n - It is simply the a times :func:`klExp` on x and y.\n\n .. math::\n\n \\mathrm{KL}(\\Gamma(x, a), \\Gamma(y, a)) = \\begin{cases}\n a \\times \\left( \\frac{x}{y} - 1 - \\log(\\frac{x}{y}) \\right) & \\text{if} x > 0, y > 0\\\\\n +\\infty & \\text{otherwise}\n \\end{cases}\n\n .. warning:: The two distributions must have the same parameter a.\n\n >>> klGamma(3, 3)\n 0.0\n >>> klGamma(3, 6) # doctest: +ELLIPSIS\n 0.193147...\n >>> klGamma(1, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.193147...\n >>> klGamma(2, 1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 0.306852...\n >>> klGamma(4, 2) # Only the proportion between x and y is used # doctest: +ELLIPSIS\n 0.306852...\n >>> klGamma(6, 8) # doctest: +ELLIPSIS\n 0.037682...\n\n - x, y have to be positive:\n\n >>> klGamma(-3, 2)\n inf\n >>> klGamma(3, -2)\n inf\n >>> klGamma(-3, -2)\n inf\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_9klGamma = {"klGamma", (PyCFunction)__pyx_pw_23kullback_leibler_cython_9klGamma, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_8klGamma}; static PyObject *__pyx_pw_23kullback_leibler_cython_9klGamma(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; float __pyx_v_a; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klGamma (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_a,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klGamma", 0, 2, 3, 1); __PYX_ERR(0, 219, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_a); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klGamma") < 0)) __PYX_ERR(0, 219, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L3_error) if (values[2]) { __pyx_v_a = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_a == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 219, __pyx_L3_error) } else { __pyx_v_a = ((float)1.0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klGamma", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 219, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klGamma", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_8klGamma(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_a); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_8klGamma(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, float __pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; PyObject *__pyx_t_3 = NULL; float __pyx_t_4; float __pyx_t_5; float __pyx_t_6; __Pyx_RefNannySetupContext("klGamma", 0); /* "kullback_leibler_cython.pyx":255 * inf * """ * if x <= 0 or y <= 0: # <<<<<<<<<<<<<< * return float('+inf') * else: */ __pyx_t_2 = ((__pyx_v_x <= 0.0) != 0); if (!__pyx_t_2) { } else { __pyx_t_1 = __pyx_t_2; goto __pyx_L4_bool_binop_done; } __pyx_t_2 = ((__pyx_v_y <= 0.0) != 0); __pyx_t_1 = __pyx_t_2; __pyx_L4_bool_binop_done:; if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":256 * """ * if x <= 0 or y <= 0: * return float('+inf') # <<<<<<<<<<<<<< * else: * x = max(x, eps) */ __Pyx_XDECREF(__pyx_r); __pyx_t_3 = __Pyx_PyNumber_Float(__pyx_kp_u_inf); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 256, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":255 * inf * """ * if x <= 0 or y <= 0: # <<<<<<<<<<<<<< * return float('+inf') * else: */ } /* "kullback_leibler_cython.pyx":258 * return float('+inf') * else: * x = max(x, eps) # <<<<<<<<<<<<<< * y = max(y, eps) * return a * (x / y - 1 - log(x / y)) */ /*else*/ { __pyx_t_4 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_5 = __pyx_v_x; if (((__pyx_t_4 > __pyx_t_5) != 0)) { __pyx_t_6 = __pyx_t_4; } else { __pyx_t_6 = __pyx_t_5; } __pyx_v_x = __pyx_t_6; /* "kullback_leibler_cython.pyx":259 * else: * x = max(x, eps) * y = max(y, eps) # <<<<<<<<<<<<<< * return a * (x / y - 1 - log(x / y)) * */ __pyx_t_6 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_4 = __pyx_v_y; if (((__pyx_t_6 > __pyx_t_4) != 0)) { __pyx_t_5 = __pyx_t_6; } else { __pyx_t_5 = __pyx_t_4; } __pyx_v_y = __pyx_t_5; /* "kullback_leibler_cython.pyx":260 * x = max(x, eps) * y = max(y, eps) * return a * (x / y - 1 - log(x / y)) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 260, __pyx_L1_error) } if (unlikely(__pyx_v_y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 260, __pyx_L1_error) } __pyx_t_3 = PyFloat_FromDouble((__pyx_v_a * (((__pyx_v_x / __pyx_v_y) - 1.0) - log((__pyx_v_x / __pyx_v_y))))); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 260, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; } /* "kullback_leibler_cython.pyx":219 * * * def klGamma(float x, float y, float a=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("kullback_leibler_cython.klGamma", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":263 * * * def klNegBin(float x, float y, r=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_11klNegBin(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_10klNegBin[] = "klNegBin(float x, float y, r=1) -> float\n Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution\n\n .. math:: \\mathrm{KL}(\\mathrm{NegBin}(x, r), \\mathrm{NegBin}(y, r)) = r \\times \\log((r + x) / (r + y)) - x \\times \\log(y \\times (r + x) / (x \\times (r + y))).\n\n .. warning:: The two distributions must have the same parameter r.\n\n >>> klNegBin(0.5, 0.5)\n 0.0\n >>> klNegBin(0.1, 0.9) # doctest: +ELLIPSIS\n -0.711611...\n >>> klNegBin(0.9, 0.1) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 2.0321564...\n >>> klNegBin(0.4, 0.5) # doctest: +ELLIPSIS\n -0.130653...\n >>> klNegBin(0.01, 0.99) # doctest: +ELLIPSIS\n -0.717353...\n\n - Special values:\n\n >>> klBern(0, 1) # Should be +inf, but 0 --> eps, 1 --> 1 - eps # doctest: +ELLIPSIS\n 34.539575...\n\n - With other values for `r`:\n\n >>> klNegBin(0.5, 0.5, r=2)\n 0.0\n >>> klNegBin(0.1, 0.9, r=2) # doctest: +ELLIPSIS\n -0.832991...\n >>> klNegBin(0.1, 0.9, r=4) # doctest: +ELLIPSIS\n -0.914890...\n >>> klNegBin(0.9, 0.1, r=2) # And this KL is non-symmetric # doctest: +ELLIPSIS\n 2.3325528...\n >>> klNegBin(0.4, 0.5, r=2) # doctest: +ELLIPSIS\n -0.154572...\n >>> klNegBin(0.01, 0.99, r=2) # doctest: +ELLIPSIS\n -0.836257...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_11klNegBin = {"klNegBin", (PyCFunction)__pyx_pw_23kullback_leibler_cython_11klNegBin, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_10klNegBin}; static PyObject *__pyx_pw_23kullback_leibler_cython_11klNegBin(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; PyObject *__pyx_v_r = 0; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klNegBin (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_r,0}; PyObject* values[3] = {0,0,0}; values[2] = ((PyObject *)__pyx_int_1); 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klNegBin", 0, 2, 3, 1); __PYX_ERR(0, 263, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_r); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klNegBin") < 0)) __PYX_ERR(0, 263, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 263, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 263, __pyx_L3_error) __pyx_v_r = values[2]; } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klNegBin", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 263, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klNegBin", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_10klNegBin(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_r); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_10klNegBin(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, PyObject *__pyx_v_r) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; double __pyx_t_7; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; __Pyx_RefNannySetupContext("klNegBin", 0); /* "kullback_leibler_cython.pyx":301 * -0.836257... * """ * x = max(x, eps) # <<<<<<<<<<<<<< * y = max(y, eps) * return r * log((r + x) / (r + y)) - x * log(y * (r + x) / (x * (r + y))) */ __pyx_t_1 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_2 = __pyx_v_x; if (((__pyx_t_1 > __pyx_t_2) != 0)) { __pyx_t_3 = __pyx_t_1; } else { __pyx_t_3 = __pyx_t_2; } __pyx_v_x = __pyx_t_3; /* "kullback_leibler_cython.pyx":302 * """ * x = max(x, eps) * y = max(y, eps) # <<<<<<<<<<<<<< * return r * log((r + x) / (r + y)) - x * log(y * (r + x) / (x * (r + y))) * */ __pyx_t_3 = __pyx_v_23kullback_leibler_cython_eps; __pyx_t_1 = __pyx_v_y; if (((__pyx_t_3 > __pyx_t_1) != 0)) { __pyx_t_2 = __pyx_t_3; } else { __pyx_t_2 = __pyx_t_1; } __pyx_v_y = __pyx_t_2; /* "kullback_leibler_cython.pyx":303 * x = max(x, eps) * y = max(y, eps) * return r * log((r + x) / (r + y)) - x * log(y * (r + x) / (x * (r + y))) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyNumber_Add(__pyx_v_r, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = PyNumber_Add(__pyx_v_r, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = __Pyx_PyNumber_Divide(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_7 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_7 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(log(__pyx_t_7)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_6 = PyNumber_Multiply(__pyx_v_r, __pyx_t_4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_8 = PyNumber_Add(__pyx_v_r, __pyx_t_5); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyNumber_Multiply(__pyx_t_4, __pyx_t_8); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_t_8 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_9 = PyNumber_Add(__pyx_v_r, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyNumber_Multiply(__pyx_t_8, __pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = __Pyx_PyNumber_Divide(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_7 = __pyx_PyFloat_AsDouble(__pyx_t_9); if (unlikely((__pyx_t_7 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyFloat_FromDouble((__pyx_v_x * log(__pyx_t_7))); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_4 = PyNumber_Subtract(__pyx_t_6, __pyx_t_9); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 303, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_r = __pyx_t_4; __pyx_t_4 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":263 * * * def klNegBin(float x, float y, r=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_AddTraceback("kullback_leibler_cython.klNegBin", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":306 * * * def klGauss(float x, float y, float sig2x=0.25, float sig2y=0.25) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\nu_1 = \mathcal{N}(x, \sigma_x^2)` and :math:`\nu_2 = \mathcal{N}(y, \sigma_x^2)`: * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_13klGauss(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_12klGauss[] = "klGauss(float x, float y, float sig2x=0.25, float sig2y=0.25) -> float\n Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\\nu_1 = \\mathcal{N}(x, \\sigma_x^2)` and :math:`\\nu_2 = \\mathcal{N}(y, \\sigma_x^2)`:\n\n .. math:: \\mathrm{KL}(\\nu_1, \\nu_2) = \\frac{(x - y)^2}{2 \\sigma_y^2} + \\frac{1}{2}\\left( \\frac{\\sigma_x^2}{\\sigma_y^2} - 1 \\log\\left(\\frac{\\sigma_x^2}{\\sigma_y^2}\\right) \\right).\n\n See https://en.wikipedia.org/wiki/Normal_distribution#Other_properties\n\n - By default, sig2y is assumed to be sig2x (same variance).\n\n .. warning:: The C version does not support different variances.\n\n >>> klGauss(3, 3)\n 0.0\n >>> klGauss(3, 6)\n 18.0\n >>> klGauss(1, 2)\n 2.0\n >>> klGauss(2, 1) # And this KL is symmetric\n 2.0\n >>> klGauss(4, 2)\n 8.0\n >>> klGauss(6, 8)\n 8.0\n\n - x, y can be negative:\n\n >>> klGauss(-3, 2)\n 50.0\n >>> klGauss(3, -2)\n 50.0\n >>> klGauss(-3, -2)\n 2.0\n >>> klGauss(3, 2)\n 2.0\n\n - With other values for `sig2x`:\n\n >>> klGauss(3, 3, sig2x=10)\n 0.0\n >>> klGauss(3, 6, sig2x=10)\n 0.45\n >>> klGauss(1, 2, sig2x=10)\n 0.05\n >>> klGauss(2, 1, sig2x=10) # And this KL is symmetric\n 0.05\n >>> klGauss(4, 2, sig2x=10)\n 0.2\n >>> klGauss(6, 8, sig2x=10)\n 0.2\n\n - With different values for `sig2x` and `sig2y`:\n\n >>> klGauss(0, 0, sig2x=0.25, sig2y=0.5) # doctest: +ELLIPSIS\n -0.0284...\n >>> klGauss(0, 0, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.2243...\n >>> klGauss(0, 0, sig2x=0.5, sig2y=0.25) # not symmetric here! # doctest: +ELLIPSIS\n 1.1534...\n\n >>> klGauss(0, 1, sig2x=0.25, sig2y=0.5) # doctest: +ELLIPSIS\n 0.9715...\n >>> klGauss(0, 1, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.7243...\n >>> klGauss(0, 1, sig2x=0.5, sig2y=0.25) # not symmetric here! # docte""st: +ELLIPSIS\n 3.1534...\n\n >>> klGauss(1, 0, sig2x=0.25, sig2y=0.5) # doctest: +ELLIPSIS\n 0.9715...\n >>> klGauss(1, 0, sig2x=0.25, sig2y=1.0) # doctest: +ELLIPSIS\n 0.7243...\n >>> klGauss(1, 0, sig2x=0.5, sig2y=0.25) # not symmetric here! # doctest: +ELLIPSIS\n 3.1534...\n\n .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version.\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_13klGauss = {"klGauss", (PyCFunction)__pyx_pw_23kullback_leibler_cython_13klGauss, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_12klGauss}; static PyObject *__pyx_pw_23kullback_leibler_cython_13klGauss(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_y; float __pyx_v_sig2x; float __pyx_v_sig2y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klGauss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_sig2x,&__pyx_n_s_sig2y,0}; PyObject* values[4] = {0,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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klGauss", 0, 2, 4, 1); __PYX_ERR(0, 306, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sig2x); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sig2y); if (value) { values[3] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klGauss") < 0)) __PYX_ERR(0, 306, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L3_error) __pyx_v_y = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L3_error) if (values[2]) { __pyx_v_sig2x = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_sig2x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L3_error) } else { __pyx_v_sig2x = ((float)0.25); } if (values[3]) { __pyx_v_sig2y = __pyx_PyFloat_AsFloat(values[3]); if (unlikely((__pyx_v_sig2y == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 306, __pyx_L3_error) } else { __pyx_v_sig2y = ((float)0.25); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klGauss", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 306, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klGauss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_12klGauss(__pyx_self, __pyx_v_x, __pyx_v_y, __pyx_v_sig2x, __pyx_v_sig2y); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_12klGauss(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_y, float __pyx_v_sig2x, float __pyx_v_sig2y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; int __pyx_t_2; int __pyx_t_3; double __pyx_t_4; PyObject *__pyx_t_5 = NULL; __Pyx_RefNannySetupContext("klGauss", 0); /* "kullback_leibler_cython.pyx":381 * .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version. * """ * if - eps < (sig2y - sig2x) < eps: # <<<<<<<<<<<<<< * return (x - y) ** 2 / (2. * sig2x) * else: */ __pyx_t_1 = (__pyx_v_sig2y - __pyx_v_sig2x); __pyx_t_2 = ((-__pyx_v_23kullback_leibler_cython_eps) < __pyx_t_1); if (__pyx_t_2) { __pyx_t_2 = (__pyx_t_1 < __pyx_v_23kullback_leibler_cython_eps); } __pyx_t_3 = (__pyx_t_2 != 0); if (__pyx_t_3) { /* "kullback_leibler_cython.pyx":382 * """ * if - eps < (sig2y - sig2x) < eps: * return (x - y) ** 2 / (2. * sig2x) # <<<<<<<<<<<<<< * else: * return (x - y) ** 2 / (2. * sig2y) + 0.5 * ((sig2x/sig2y)**2 - 1 - log(sig2x/sig2y)) */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = powf((__pyx_v_x - __pyx_v_y), 2.0); __pyx_t_4 = (2. * __pyx_v_sig2x); if (unlikely(__pyx_t_4 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 382, __pyx_L1_error) } __pyx_t_5 = PyFloat_FromDouble((((double)__pyx_t_1) / __pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 382, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":381 * .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version. * """ * if - eps < (sig2y - sig2x) < eps: # <<<<<<<<<<<<<< * return (x - y) ** 2 / (2. * sig2x) * else: */ } /* "kullback_leibler_cython.pyx":384 * return (x - y) ** 2 / (2. * sig2x) * else: * return (x - y) ** 2 / (2. * sig2y) + 0.5 * ((sig2x/sig2y)**2 - 1 - log(sig2x/sig2y)) # <<<<<<<<<<<<<< * * */ /*else*/ { __Pyx_XDECREF(__pyx_r); __pyx_t_1 = powf((__pyx_v_x - __pyx_v_y), 2.0); __pyx_t_4 = (2. * __pyx_v_sig2y); if (unlikely(__pyx_t_4 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 384, __pyx_L1_error) } if (unlikely(__pyx_v_sig2y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 384, __pyx_L1_error) } if (unlikely(__pyx_v_sig2y == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 384, __pyx_L1_error) } __pyx_t_5 = PyFloat_FromDouble(((((double)__pyx_t_1) / __pyx_t_4) + (0.5 * ((powf((__pyx_v_sig2x / __pyx_v_sig2y), 2.0) - 1.0) - log((__pyx_v_sig2x / __pyx_v_sig2y)))))); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 384, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_r = __pyx_t_5; __pyx_t_5 = 0; goto __pyx_L0; } /* "kullback_leibler_cython.pyx":306 * * * def klGauss(float x, float y, float sig2x=0.25, float sig2y=0.25) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\nu_1 = \mathcal{N}(x, \sigma_x^2)` and :math:`\nu_2 = \mathcal{N}(y, \sigma_x^2)`: * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("kullback_leibler_cython.klGauss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":389 * # --- KL functions, for the KL-UCB policy * * def klucb(float x, float d, kl, # <<<<<<<<<<<<<< * float upperbound, * float lowerbound=float('-inf'), */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_15klucb(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_14klucb[] = "klucb(float x, float d, kl, float upperbound, float lowerbound=float(u'-inf'), float precision=1e-6, int max_iterations=50) -> float\n The generic KL-UCB index computation.\n\n - x: value of the cum reward,\n - d: upper bound on the divergence,\n - kl: the KL divergence to be used (:func:`klBern`, :func:`klGauss`, etc),\n - upperbound, lowerbound=float('-inf') -> float: the known bound of the values x,\n - precision=1e-6: the threshold from where to stop the research,\n - max_iterations: max number of iterations of the loop (safer to bound it to reduce time complexity).\n\n .. note:: It uses a **bisection search**, and one call to ``kl`` for each step of the bisection search.\n\n For example, for :func:`klucbBern`, the two steps are to first compute an upperbound (as precise as possible) and the compute the kl-UCB index:\n\n >>> x, d = 0.9, 0.2 # mean x, exploration term d\n >>> upperbound = min(1., klucbGauss(x, d, sig2x=0.25)) # variance 1/4 for [0,1] bounded distributions\n >>> upperbound # doctest: +ELLIPSIS\n 1.0\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-3, max_iterations=10) # doctest: +ELLIPSIS\n 0.9941...\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-6, max_iterations=10) # doctest: +ELLIPSIS\n 0.994482... # doctest: +ELLIPSIS\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-3, max_iterations=50) # doctest: +ELLIPSIS\n 0.9941...\n >>> klucb(x, d, klBern, upperbound, lowerbound=0, precision=1e-6, max_iterations=100) # more and more precise! # doctest: +ELLIPSIS\n 0.994489...\n\n .. note:: See below for more examples for different KL divergence functions.\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_15klucb = {"klucb", (PyCFunction)__pyx_pw_23kullback_leibler_cython_15klucb, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_14klucb}; static PyObject *__pyx_pw_23kullback_leibler_cython_15klucb(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; PyObject *__pyx_v_kl = 0; float __pyx_v_upperbound; float __pyx_v_lowerbound; float __pyx_v_precision; int __pyx_v_max_iterations; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucb (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_kl,&__pyx_n_s_upperbound,&__pyx_n_s_lowerbound,&__pyx_n_s_precision,&__pyx_n_s_max_iterations,0}; PyObject* values[7] = {0,0,0,0,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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucb", 0, 4, 7, 1); __PYX_ERR(0, 389, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kl)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucb", 0, 4, 7, 2); __PYX_ERR(0, 389, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_upperbound)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucb", 0, 4, 7, 3); __PYX_ERR(0, 389, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 4: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lowerbound); if (value) { values[4] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 5: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[5] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 6: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_max_iterations); if (value) { values[6] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucb") < 0)) __PYX_ERR(0, 389, __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); CYTHON_FALLTHROUGH; case 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 389, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 389, __pyx_L3_error) __pyx_v_kl = values[2]; __pyx_v_upperbound = __pyx_PyFloat_AsFloat(values[3]); if (unlikely((__pyx_v_upperbound == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 390, __pyx_L3_error) if (values[4]) { __pyx_v_lowerbound = __pyx_PyFloat_AsFloat(values[4]); if (unlikely((__pyx_v_lowerbound == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 391, __pyx_L3_error) } else { __pyx_v_lowerbound = __pyx_k_; } if (values[5]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[5]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 392, __pyx_L3_error) } else { __pyx_v_precision = ((float)1e-6); } if (values[6]) { __pyx_v_max_iterations = __Pyx_PyInt_As_int(values[6]); if (unlikely((__pyx_v_max_iterations == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 393, __pyx_L3_error) } else { __pyx_v_max_iterations = ((int)50); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucb", 0, 4, 7, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 389, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucb", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_14klucb(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_kl, __pyx_v_upperbound, __pyx_v_lowerbound, __pyx_v_precision, __pyx_v_max_iterations); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_14klucb(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, PyObject *__pyx_v_kl, float __pyx_v_upperbound, float __pyx_v_lowerbound, float __pyx_v_precision, int __pyx_v_max_iterations) { float __pyx_v_value; float __pyx_v_u; int __pyx_v__count_iteration; double __pyx_v_m; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations float __pyx_t_1; float __pyx_t_2; float __pyx_t_3; int __pyx_t_4; int __pyx_t_5; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; int __pyx_t_11; PyObject *__pyx_t_12 = NULL; __Pyx_RefNannySetupContext("klucb", 0); /* "kullback_leibler_cython.pyx":423 * .. note:: See below for more examples for different KL divergence functions. * """ * cdef float value = max(x, lowerbound) # <<<<<<<<<<<<<< * cdef float u = upperbound * cdef int _count_iteration = 0 */ __pyx_t_1 = __pyx_v_lowerbound; __pyx_t_2 = __pyx_v_x; if (((__pyx_t_1 > __pyx_t_2) != 0)) { __pyx_t_3 = __pyx_t_1; } else { __pyx_t_3 = __pyx_t_2; } __pyx_v_value = __pyx_t_3; /* "kullback_leibler_cython.pyx":424 * """ * cdef float value = max(x, lowerbound) * cdef float u = upperbound # <<<<<<<<<<<<<< * cdef int _count_iteration = 0 * while _count_iteration < max_iterations and u - value > precision: */ __pyx_v_u = __pyx_v_upperbound; /* "kullback_leibler_cython.pyx":425 * cdef float value = max(x, lowerbound) * cdef float u = upperbound * cdef int _count_iteration = 0 # <<<<<<<<<<<<<< * while _count_iteration < max_iterations and u - value > precision: * _count_iteration += 1 */ __pyx_v__count_iteration = 0; /* "kullback_leibler_cython.pyx":426 * cdef float u = upperbound * cdef int _count_iteration = 0 * while _count_iteration < max_iterations and u - value > precision: # <<<<<<<<<<<<<< * _count_iteration += 1 * m = (value + u) / 2. */ while (1) { __pyx_t_5 = ((__pyx_v__count_iteration < __pyx_v_max_iterations) != 0); if (__pyx_t_5) { } else { __pyx_t_4 = __pyx_t_5; goto __pyx_L5_bool_binop_done; } __pyx_t_5 = (((__pyx_v_u - __pyx_v_value) > __pyx_v_precision) != 0); __pyx_t_4 = __pyx_t_5; __pyx_L5_bool_binop_done:; if (!__pyx_t_4) break; /* "kullback_leibler_cython.pyx":427 * cdef int _count_iteration = 0 * while _count_iteration < max_iterations and u - value > precision: * _count_iteration += 1 # <<<<<<<<<<<<<< * m = (value + u) / 2. * if kl(x, m) > d: */ __pyx_v__count_iteration = (__pyx_v__count_iteration + 1); /* "kullback_leibler_cython.pyx":428 * while _count_iteration < max_iterations and u - value > precision: * _count_iteration += 1 * m = (value + u) / 2. # <<<<<<<<<<<<<< * if kl(x, m) > d: * u = m */ __pyx_v_m = (((double)(__pyx_v_value + __pyx_v_u)) / 2.); /* "kullback_leibler_cython.pyx":429 * _count_iteration += 1 * m = (value + u) / 2. * if kl(x, m) > d: # <<<<<<<<<<<<<< * u = m * else: */ __pyx_t_7 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = PyFloat_FromDouble(__pyx_v_m); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __Pyx_INCREF(__pyx_v_kl); __pyx_t_9 = __pyx_v_kl; __pyx_t_10 = NULL; __pyx_t_11 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_9))) { __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_9); if (likely(__pyx_t_10)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9); __Pyx_INCREF(__pyx_t_10); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_9, function); __pyx_t_11 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_9)) { PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_t_7, __pyx_t_8}; __pyx_t_6 = __Pyx_PyFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_9)) { PyObject *__pyx_temp[3] = {__pyx_t_10, __pyx_t_7, __pyx_t_8}; __pyx_t_6 = __Pyx_PyCFunction_FastCall(__pyx_t_9, __pyx_temp+1-__pyx_t_11, 2+__pyx_t_11); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; } else #endif { __pyx_t_12 = PyTuple_New(2+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); if (__pyx_t_10) { __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; } __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_12, NULL); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_9 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_12 = PyObject_RichCompare(__pyx_t_6, __pyx_t_9, Py_GT); __Pyx_XGOTREF(__pyx_t_12); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_12); if (unlikely(__pyx_t_4 < 0)) __PYX_ERR(0, 429, __pyx_L1_error) __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; if (__pyx_t_4) { /* "kullback_leibler_cython.pyx":430 * m = (value + u) / 2. * if kl(x, m) > d: * u = m # <<<<<<<<<<<<<< * else: * value = m */ __pyx_v_u = __pyx_v_m; /* "kullback_leibler_cython.pyx":429 * _count_iteration += 1 * m = (value + u) / 2. * if kl(x, m) > d: # <<<<<<<<<<<<<< * u = m * else: */ goto __pyx_L7; } /* "kullback_leibler_cython.pyx":432 * u = m * else: * value = m # <<<<<<<<<<<<<< * return (value + u) / 2. * */ /*else*/ { __pyx_v_value = __pyx_v_m; } __pyx_L7:; } /* "kullback_leibler_cython.pyx":433 * else: * value = m * return (value + u) / 2. # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_12 = PyFloat_FromDouble((((double)(__pyx_v_value + __pyx_v_u)) / 2.)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 433, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_r = __pyx_t_12; __pyx_t_12 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":389 * # --- KL functions, for the KL-UCB policy * * def klucb(float x, float d, kl, # <<<<<<<<<<<<<< * float upperbound, * float lowerbound=float('-inf'), */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_12); __Pyx_AddTraceback("kullback_leibler_cython.klucb", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":436 * * * def klucbBern(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Bernoulli distributions, using :func:`klucb`. * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_17klucbBern(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_16klucbBern[] = "klucbBern(float x, float d, float precision=1e-6) -> float\n KL-UCB index computation for Bernoulli distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbBern(0.1, 0.2) # doctest: +ELLIPSIS\n 0.378391...\n >>> klucbBern(0.5, 0.2) # doctest: +ELLIPSIS\n 0.787088...\n >>> klucbBern(0.9, 0.2) # doctest: +ELLIPSIS\n 0.994489...\n\n - Influence of d:\n\n >>> klucbBern(0.1, 0.4) # doctest: +ELLIPSIS\n 0.519475...\n >>> klucbBern(0.1, 0.9) # doctest: +ELLIPSIS\n 0.734714...\n\n >>> klucbBern(0.5, 0.4) # doctest: +ELLIPSIS\n 0.871035...\n >>> klucbBern(0.5, 0.9) # doctest: +ELLIPSIS\n 0.956809...\n\n >>> klucbBern(0.9, 0.4) # doctest: +ELLIPSIS\n 0.999285...\n >>> klucbBern(0.9, 0.9) # doctest: +ELLIPSIS\n 0.999995...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_17klucbBern = {"klucbBern", (PyCFunction)__pyx_pw_23kullback_leibler_cython_17klucbBern, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_16klucbBern}; static PyObject *__pyx_pw_23kullback_leibler_cython_17klucbBern(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; float __pyx_v_precision; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucbBern (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_precision,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucbBern", 0, 2, 3, 1); __PYX_ERR(0, 436, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucbBern") < 0)) __PYX_ERR(0, 436, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 436, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 436, __pyx_L3_error) if (values[2]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 436, __pyx_L3_error) } else { __pyx_v_precision = ((float)1e-6); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucbBern", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 436, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucbBern", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_16klucbBern(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_precision); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_16klucbBern(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision) { float __pyx_v_upperbound; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; float __pyx_t_7; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; int __pyx_t_12; PyObject *__pyx_t_13 = NULL; __Pyx_RefNannySetupContext("klucbBern", 0); /* "kullback_leibler_cython.pyx":465 * 0.999995... * """ * cdef float upperbound = min(1., klucbGauss(x, d, sig2x=0.25)) # variance 1/4 for [0,1] bounded distributions # <<<<<<<<<<<<<< * # upperbound = min(1., klucbPoisson(x, d)) # also safe, and better ? * return klucb(x, d, klBern, upperbound, precision) */ __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_klucbGauss); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 465, __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 = __Pyx_PyDict_NewPresized(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); if (PyDict_SetItem(__pyx_t_3, __pyx_n_s_sig2x, __pyx_float_0_25) < 0) __PYX_ERR(0, 465, __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, 465, __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_t_5 = 1.; __pyx_t_4 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_t_4, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_6) { __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = __pyx_t_2; } else { __pyx_t_1 = PyFloat_FromDouble(__pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_3 = __pyx_t_1; __pyx_t_1 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_7 = __pyx_PyFloat_AsFloat(__pyx_t_3); if (unlikely((__pyx_t_7 == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 465, __pyx_L1_error) __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_upperbound = __pyx_t_7; /* "kullback_leibler_cython.pyx":467 * cdef float upperbound = min(1., klucbGauss(x, d, sig2x=0.25)) # variance 1/4 for [0,1] bounded distributions * # upperbound = min(1., klucbPoisson(x, d)) # also safe, and better ? * return klucb(x, d, klBern, upperbound, precision) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_klucb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_klBern); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyFloat_FromDouble(__pyx_v_upperbound); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = PyFloat_FromDouble(__pyx_v_precision); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __pyx_t_11 = NULL; __pyx_t_12 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_12 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[6] = {__pyx_t_11, __pyx_t_1, __pyx_t_4, __pyx_t_8, __pyx_t_9, __pyx_t_10}; __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_12, 5+__pyx_t_12); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[6] = {__pyx_t_11, __pyx_t_1, __pyx_t_4, __pyx_t_8, __pyx_t_9, __pyx_t_10}; __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_12, 5+__pyx_t_12); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else #endif { __pyx_t_13 = PyTuple_New(5+__pyx_t_12); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); if (__pyx_t_11) { __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; } __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_12, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_12, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_12, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_13, 3+__pyx_t_12, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 4+__pyx_t_12, __pyx_t_10); __pyx_t_1 = 0; __pyx_t_4 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_13, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 467, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":436 * * * def klucbBern(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Bernoulli distributions, using :func:`klucb`. * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_13); __Pyx_AddTraceback("kullback_leibler_cython.klucbBern", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":470 * * * def klucbGauss(float x, float d, float sig2x=0.25, float precision=0.) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gaussian distributions. * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_19klucbGauss(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_18klucbGauss[] = "klucbGauss(float x, float d, float sig2x=0.25, float precision=0.) -> float\n KL-UCB index computation for Gaussian distributions.\n\n - Note that it does not require any search.\n\n .. warning:: it works only if the good variance constant is given.\n\n - Influence of x:\n\n >>> klucbGauss(0.1, 0.2) # doctest: +ELLIPSIS\n 0.416227...\n >>> klucbGauss(0.5, 0.2) # doctest: +ELLIPSIS\n 0.816227...\n >>> klucbGauss(0.9, 0.2) # doctest: +ELLIPSIS\n 1.216227...\n\n - Influence of d:\n\n >>> klucbGauss(0.1, 0.4) # doctest: +ELLIPSIS\n 0.547213...\n >>> klucbGauss(0.1, 0.9) # doctest: +ELLIPSIS\n 0.770820...\n\n >>> klucbGauss(0.5, 0.4) # doctest: +ELLIPSIS\n 0.947213...\n >>> klucbGauss(0.5, 0.9) # doctest: +ELLIPSIS\n 1.170820...\n\n >>> klucbGauss(0.9, 0.4) # doctest: +ELLIPSIS\n 1.347213...\n >>> klucbGauss(0.9, 0.9) # doctest: +ELLIPSIS\n 1.570820...\n\n .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klucbGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version.\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_19klucbGauss = {"klucbGauss", (PyCFunction)__pyx_pw_23kullback_leibler_cython_19klucbGauss, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_18klucbGauss}; static PyObject *__pyx_pw_23kullback_leibler_cython_19klucbGauss(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; float __pyx_v_sig2x; CYTHON_UNUSED float __pyx_v_precision; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucbGauss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_sig2x,&__pyx_n_s_precision,0}; PyObject* values[4] = {0,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 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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucbGauss", 0, 2, 4, 1); __PYX_ERR(0, 470, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sig2x); if (value) { values[2] = value; kw_args--; } } CYTHON_FALLTHROUGH; case 3: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[3] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucbGauss") < 0)) __PYX_ERR(0, 470, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L3_error) if (values[2]) { __pyx_v_sig2x = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_sig2x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L3_error) } else { __pyx_v_sig2x = ((float)0.25); } if (values[3]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[3]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 470, __pyx_L3_error) } else { __pyx_v_precision = ((float)0.); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucbGauss", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 470, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucbGauss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_18klucbGauss(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_sig2x, __pyx_v_precision); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_18klucbGauss(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_sig2x, CYTHON_UNUSED float __pyx_v_precision) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("klucbGauss", 0); /* "kullback_leibler_cython.pyx":505 * .. warning:: Using :class:`Policies.klUCB` (and variants) with :func:`klucbGauss` is equivalent to use :class:`Policies.UCB`, so prefer the simpler version. * """ * return x + sqrt(2 * sig2x * d) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble((__pyx_v_x + sqrt(((2.0 * __pyx_v_sig2x) * __pyx_v_d)))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 505, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":470 * * * def klucbGauss(float x, float d, float sig2x=0.25, float precision=0.) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gaussian distributions. * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("kullback_leibler_cython.klucbGauss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":508 * * * def klucbPoisson(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Poisson distributions, using :func:`klucb`. * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_21klucbPoisson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_20klucbPoisson[] = "klucbPoisson(float x, float d, float precision=1e-6) -> float\n KL-UCB index computation for Poisson distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbPoisson(0.1, 0.2) # doctest: +ELLIPSIS\n 0.450523...\n >>> klucbPoisson(0.5, 0.2) # doctest: +ELLIPSIS\n 1.089376...\n >>> klucbPoisson(0.9, 0.2) # doctest: +ELLIPSIS\n 1.640112...\n\n - Influence of d:\n\n >>> klucbPoisson(0.1, 0.4) # doctest: +ELLIPSIS\n 0.693684...\n >>> klucbPoisson(0.1, 0.9) # doctest: +ELLIPSIS\n 1.252796...\n\n >>> klucbPoisson(0.5, 0.4) # doctest: +ELLIPSIS\n 1.422933...\n >>> klucbPoisson(0.5, 0.9) # doctest: +ELLIPSIS\n 2.122985...\n\n >>> klucbPoisson(0.9, 0.4) # doctest: +ELLIPSIS\n 2.033691...\n >>> klucbPoisson(0.9, 0.9) # doctest: +ELLIPSIS\n 2.831573...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_21klucbPoisson = {"klucbPoisson", (PyCFunction)__pyx_pw_23kullback_leibler_cython_21klucbPoisson, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_20klucbPoisson}; static PyObject *__pyx_pw_23kullback_leibler_cython_21klucbPoisson(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; float __pyx_v_precision; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucbPoisson (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_precision,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucbPoisson", 0, 2, 3, 1); __PYX_ERR(0, 508, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucbPoisson") < 0)) __PYX_ERR(0, 508, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 508, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 508, __pyx_L3_error) if (values[2]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 508, __pyx_L3_error) } else { __pyx_v_precision = ((float)1e-6); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucbPoisson", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 508, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucbPoisson", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_20klucbPoisson(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_precision); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_20klucbPoisson(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision) { float __pyx_v_upperbound; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; __Pyx_RefNannySetupContext("klucbPoisson", 0); /* "kullback_leibler_cython.pyx":537 * 2.831573... * """ * cdef float upperbound = x + d + sqrt(d * d + 2 * x * d) # looks safe, to check: left (Gaussian) tail of Poisson dev # <<<<<<<<<<<<<< * return klucb(x, d, klPoisson, upperbound, precision) * */ __pyx_v_upperbound = ((__pyx_v_x + __pyx_v_d) + sqrt(((__pyx_v_d * __pyx_v_d) + ((2.0 * __pyx_v_x) * __pyx_v_d)))); /* "kullback_leibler_cython.pyx":538 * """ * cdef float upperbound = x + d + sqrt(d * d + 2 * x * d) # looks safe, to check: left (Gaussian) tail of Poisson dev * return klucb(x, d, klPoisson, upperbound, precision) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_klucb); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_klPoisson); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyFloat_FromDouble(__pyx_v_upperbound); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = PyFloat_FromDouble(__pyx_v_precision); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = NULL; __pyx_t_9 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2); if (likely(__pyx_t_8)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); __Pyx_INCREF(__pyx_t_8); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_2, function); __pyx_t_9 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[6] = {__pyx_t_8, __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7}; __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_9, 5+__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __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_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_2)) { PyObject *__pyx_temp[6] = {__pyx_t_8, __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7}; __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_2, __pyx_temp+1-__pyx_t_9, 5+__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; __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_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; } else #endif { __pyx_t_10 = PyTuple_New(5+__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); if (__pyx_t_8) { __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_8); __pyx_t_8 = NULL; } __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_10, 0+__pyx_t_9, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_10, 1+__pyx_t_9, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_10, 2+__pyx_t_9, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_10, 3+__pyx_t_9, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_10, 4+__pyx_t_9, __pyx_t_7); __pyx_t_3 = 0; __pyx_t_4 = 0; __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 538, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":508 * * * def klucbPoisson(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Poisson distributions, using :func:`klucb`. * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_10); __Pyx_AddTraceback("kullback_leibler_cython.klucbPoisson", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":541 * * * def klucbExp(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for exponential distributions, using :func:`klucb`. * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_23klucbExp(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_22klucbExp[] = "klucbExp(float x, float d, float precision=1e-6) -> float\n KL-UCB index computation for exponential distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbExp(0.1, 0.2) # doctest: +ELLIPSIS\n 0.202741...\n >>> klucbExp(0.5, 0.2) # doctest: +ELLIPSIS\n 1.013706...\n >>> klucbExp(0.9, 0.2) # doctest: +ELLIPSIS\n 1.824671...\n\n - Influence of d:\n\n >>> klucbExp(0.1, 0.4) # doctest: +ELLIPSIS\n 0.285792...\n >>> klucbExp(0.1, 0.9) # doctest: +ELLIPSIS\n 0.559088...\n\n >>> klucbExp(0.5, 0.4) # doctest: +ELLIPSIS\n 1.428962...\n >>> klucbExp(0.5, 0.9) # doctest: +ELLIPSIS\n 2.795442...\n\n >>> klucbExp(0.9, 0.4) # doctest: +ELLIPSIS\n 2.572132...\n >>> klucbExp(0.9, 0.9) # doctest: +ELLIPSIS\n 5.031795...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_23klucbExp = {"klucbExp", (PyCFunction)__pyx_pw_23kullback_leibler_cython_23klucbExp, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_22klucbExp}; static PyObject *__pyx_pw_23kullback_leibler_cython_23klucbExp(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; float __pyx_v_precision; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucbExp (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_precision,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucbExp", 0, 2, 3, 1); __PYX_ERR(0, 541, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucbExp") < 0)) __PYX_ERR(0, 541, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 541, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 541, __pyx_L3_error) if (values[2]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 541, __pyx_L3_error) } else { __pyx_v_precision = ((float)1e-6); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucbExp", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 541, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucbExp", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_22klucbExp(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_precision); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_22klucbExp(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision) { float __pyx_v_upperbound; float __pyx_v_lowerbound; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; double __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; PyObject *__pyx_t_9 = NULL; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; int __pyx_t_12; PyObject *__pyx_t_13 = NULL; __Pyx_RefNannySetupContext("klucbExp", 0); /* "kullback_leibler_cython.pyx":572 * cdef float upperbound * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? # <<<<<<<<<<<<<< * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) */ __pyx_t_1 = ((__pyx_v_d < 0.77) != 0); if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":573 * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) # <<<<<<<<<<<<<< * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) * else: */ __pyx_t_2 = ((1.0 + ((2. / 3.0) * __pyx_v_d)) - sqrt(((((4. / 9.0) * __pyx_v_d) * __pyx_v_d) + (2.0 * __pyx_v_d)))); if (unlikely(__pyx_t_2 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 573, __pyx_L1_error) } __pyx_v_upperbound = (((double)__pyx_v_x) / __pyx_t_2); /* "kullback_leibler_cython.pyx":572 * cdef float upperbound * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? # <<<<<<<<<<<<<< * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) */ goto __pyx_L3; } /* "kullback_leibler_cython.pyx":576 * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) * else: * upperbound = x * exp(d + 1) # <<<<<<<<<<<<<< * if d > 1.61: # XXX where does this value come from? * lowerbound = x * exp(d) */ /*else*/ { __pyx_v_upperbound = (__pyx_v_x * exp((__pyx_v_d + 1.0))); } __pyx_L3:; /* "kullback_leibler_cython.pyx":577 * else: * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? # <<<<<<<<<<<<<< * lowerbound = x * exp(d) * else: */ __pyx_t_1 = ((__pyx_v_d > 1.61) != 0); if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":578 * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? * lowerbound = x * exp(d) # <<<<<<<<<<<<<< * else: * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) */ __pyx_v_lowerbound = (__pyx_v_x * exp(__pyx_v_d)); /* "kullback_leibler_cython.pyx":577 * else: * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? # <<<<<<<<<<<<<< * lowerbound = x * exp(d) * else: */ goto __pyx_L4; } /* "kullback_leibler_cython.pyx":580 * lowerbound = x * exp(d) * else: * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) # <<<<<<<<<<<<<< * return klucb(x, d, klGamma, upperbound, lowerbound, precision) * */ /*else*/ { __pyx_t_2 = ((1.0 + __pyx_v_d) - sqrt(((__pyx_v_d * __pyx_v_d) + (2.0 * __pyx_v_d)))); if (unlikely(__pyx_t_2 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 580, __pyx_L1_error) } __pyx_v_lowerbound = (((double)__pyx_v_x) / __pyx_t_2); } __pyx_L4:; /* "kullback_leibler_cython.pyx":581 * else: * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) * return klucb(x, d, klGamma, upperbound, lowerbound, precision) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_klucb); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_klGamma); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = PyFloat_FromDouble(__pyx_v_upperbound); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_8); __pyx_t_9 = PyFloat_FromDouble(__pyx_v_lowerbound); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_9); __pyx_t_10 = PyFloat_FromDouble(__pyx_v_precision); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __pyx_t_11 = NULL; __pyx_t_12 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_11)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_11); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_12 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[7] = {__pyx_t_11, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10}; __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_12, 6+__pyx_t_12); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[7] = {__pyx_t_11, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10}; __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_12, 6+__pyx_t_12); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; } else #endif { __pyx_t_13 = PyTuple_New(6+__pyx_t_12); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_13); if (__pyx_t_11) { __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11); __pyx_t_11 = NULL; } __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_13, 0+__pyx_t_12, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_13, 1+__pyx_t_12, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_13, 2+__pyx_t_12, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_13, 3+__pyx_t_12, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_13, 4+__pyx_t_12, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_13, 5+__pyx_t_12, __pyx_t_10); __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; __pyx_t_9 = 0; __pyx_t_10 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_13, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 581, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":541 * * * def klucbExp(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for exponential distributions, using :func:`klucb`. * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_9); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_13); __Pyx_AddTraceback("kullback_leibler_cython.klucbExp", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "kullback_leibler_cython.pyx":585 * * # FIXME this one is wrong! * def klucbGamma(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gamma distributions, using :func:`klucb`. * */ /* Python wrapper */ static PyObject *__pyx_pw_23kullback_leibler_cython_25klucbGamma(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_23kullback_leibler_cython_24klucbGamma[] = "klucbGamma(float x, float d, float precision=1e-6) -> float\n KL-UCB index computation for Gamma distributions, using :func:`klucb`.\n\n - Influence of x:\n\n >>> klucbGamma(0.1, 0.2) # doctest: +ELLIPSIS\n 0.202...\n >>> klucbGamma(0.5, 0.2) # doctest: +ELLIPSIS\n 1.013...\n >>> klucbGamma(0.9, 0.2) # doctest: +ELLIPSIS\n 1.824...\n\n - Influence of d:\n\n >>> klucbGamma(0.1, 0.4) # doctest: +ELLIPSIS\n 0.285...\n >>> klucbGamma(0.1, 0.9) # doctest: +ELLIPSIS\n 0.559...\n\n >>> klucbGamma(0.5, 0.4) # doctest: +ELLIPSIS\n 1.428...\n >>> klucbGamma(0.5, 0.9) # doctest: +ELLIPSIS\n 2.795...\n\n >>> klucbGamma(0.9, 0.4) # doctest: +ELLIPSIS\n 2.572...\n >>> klucbGamma(0.9, 0.9) # doctest: +ELLIPSIS\n 5.031...\n "; static PyMethodDef __pyx_mdef_23kullback_leibler_cython_25klucbGamma = {"klucbGamma", (PyCFunction)__pyx_pw_23kullback_leibler_cython_25klucbGamma, METH_VARARGS|METH_KEYWORDS, __pyx_doc_23kullback_leibler_cython_24klucbGamma}; static PyObject *__pyx_pw_23kullback_leibler_cython_25klucbGamma(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { float __pyx_v_x; float __pyx_v_d; float __pyx_v_precision; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("klucbGamma (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_d,&__pyx_n_s_precision,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] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_d)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("klucbGamma", 0, 2, 3, 1); __PYX_ERR(0, 585, __pyx_L3_error) } CYTHON_FALLTHROUGH; case 2: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision); if (value) { values[2] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "klucbGamma") < 0)) __PYX_ERR(0, 585, __pyx_L3_error) } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { 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_x = __pyx_PyFloat_AsFloat(values[0]); if (unlikely((__pyx_v_x == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 585, __pyx_L3_error) __pyx_v_d = __pyx_PyFloat_AsFloat(values[1]); if (unlikely((__pyx_v_d == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 585, __pyx_L3_error) if (values[2]) { __pyx_v_precision = __pyx_PyFloat_AsFloat(values[2]); if (unlikely((__pyx_v_precision == (float)-1) && PyErr_Occurred())) __PYX_ERR(0, 585, __pyx_L3_error) } else { __pyx_v_precision = ((float)1e-6); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("klucbGamma", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 585, __pyx_L3_error) __pyx_L3_error:; __Pyx_AddTraceback("kullback_leibler_cython.klucbGamma", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_23kullback_leibler_cython_24klucbGamma(__pyx_self, __pyx_v_x, __pyx_v_d, __pyx_v_precision); /* function exit code */ __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyObject *__pyx_pf_23kullback_leibler_cython_24klucbGamma(CYTHON_UNUSED PyObject *__pyx_self, float __pyx_v_x, float __pyx_v_d, float __pyx_v_precision) { float __pyx_v_upperbound; float __pyx_v_lowerbound; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; double __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; float __pyx_t_8; double __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; PyObject *__pyx_t_13 = NULL; int __pyx_t_14; PyObject *__pyx_t_15 = NULL; __Pyx_RefNannySetupContext("klucbGamma", 0); /* "kullback_leibler_cython.pyx":616 * cdef float upperbound * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? # <<<<<<<<<<<<<< * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) */ __pyx_t_1 = ((__pyx_v_d < 0.77) != 0); if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":617 * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) # <<<<<<<<<<<<<< * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) * else: */ __pyx_t_2 = ((1.0 + ((2. / 3.0) * __pyx_v_d)) - sqrt(((((4. / 9.0) * __pyx_v_d) * __pyx_v_d) + (2.0 * __pyx_v_d)))); if (unlikely(__pyx_t_2 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 617, __pyx_L1_error) } __pyx_v_upperbound = (((double)__pyx_v_x) / __pyx_t_2); /* "kullback_leibler_cython.pyx":616 * cdef float upperbound * cdef float lowerbound * if d < 0.77: # XXX where does this value come from? # <<<<<<<<<<<<<< * upperbound = x / (1 + 2. / 3 * d - sqrt(4. / 9 * d * d + 2 * d)) * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) */ goto __pyx_L3; } /* "kullback_leibler_cython.pyx":620 * # safe, klexp(x,y) >= e^2/(2*(1-2e/3)) if x=y(1-e) * else: * upperbound = x * exp(d + 1) # <<<<<<<<<<<<<< * if d > 1.61: # XXX where does this value come from? * lowerbound = x * exp(d) */ /*else*/ { __pyx_v_upperbound = (__pyx_v_x * exp((__pyx_v_d + 1.0))); } __pyx_L3:; /* "kullback_leibler_cython.pyx":621 * else: * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? # <<<<<<<<<<<<<< * lowerbound = x * exp(d) * else: */ __pyx_t_1 = ((__pyx_v_d > 1.61) != 0); if (__pyx_t_1) { /* "kullback_leibler_cython.pyx":622 * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? * lowerbound = x * exp(d) # <<<<<<<<<<<<<< * else: * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) */ __pyx_v_lowerbound = (__pyx_v_x * exp(__pyx_v_d)); /* "kullback_leibler_cython.pyx":621 * else: * upperbound = x * exp(d + 1) * if d > 1.61: # XXX where does this value come from? # <<<<<<<<<<<<<< * lowerbound = x * exp(d) * else: */ goto __pyx_L4; } /* "kullback_leibler_cython.pyx":624 * lowerbound = x * exp(d) * else: * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) # <<<<<<<<<<<<<< * # FIXME specify the value for a ! * return klucb(x, d, klGamma, max(upperbound, 1e2), min(-1e2, lowerbound), precision) */ /*else*/ { __pyx_t_2 = ((1.0 + __pyx_v_d) - sqrt(((__pyx_v_d * __pyx_v_d) + (2.0 * __pyx_v_d)))); if (unlikely(__pyx_t_2 == 0)) { PyErr_SetString(PyExc_ZeroDivisionError, "float division"); __PYX_ERR(0, 624, __pyx_L1_error) } __pyx_v_lowerbound = (((double)__pyx_v_x) / __pyx_t_2); } __pyx_L4:; /* "kullback_leibler_cython.pyx":626 * lowerbound = x / (1 + d - sqrt(d * d + 2 * d)) * # FIXME specify the value for a ! * return klucb(x, d, klGamma, max(upperbound, 1e2), min(-1e2, lowerbound), precision) # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_klucb); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_4); __pyx_t_5 = PyFloat_FromDouble(__pyx_v_x); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = PyFloat_FromDouble(__pyx_v_d); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_6); __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_klGamma); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_7); __pyx_t_2 = 1e2; __pyx_t_8 = __pyx_v_upperbound; if (((__pyx_t_2 > __pyx_t_8) != 0)) { __pyx_t_9 = __pyx_t_2; } else { __pyx_t_9 = __pyx_t_8; } __pyx_t_10 = PyFloat_FromDouble(__pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_10); __pyx_t_8 = __pyx_v_lowerbound; __pyx_t_9 = -1e2; if (((__pyx_t_8 < __pyx_t_9) != 0)) { __pyx_t_2 = __pyx_t_8; } else { __pyx_t_2 = __pyx_t_9; } __pyx_t_11 = PyFloat_FromDouble(__pyx_t_2); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_11); __pyx_t_12 = PyFloat_FromDouble(__pyx_v_precision); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_12); __pyx_t_13 = NULL; __pyx_t_14 = 0; if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_4); if (likely(__pyx_t_13)) { PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); __Pyx_INCREF(__pyx_t_13); __Pyx_INCREF(function); __Pyx_DECREF_SET(__pyx_t_4, function); __pyx_t_14 = 1; } } #if CYTHON_FAST_PYCALL if (PyFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[7] = {__pyx_t_13, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_10, __pyx_t_11, __pyx_t_12}; __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_14, 6+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } else #endif #if CYTHON_FAST_PYCCALL if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { PyObject *__pyx_temp[7] = {__pyx_t_13, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_10, __pyx_t_11, __pyx_t_12}; __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_14, 6+__pyx_t_14); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; } else #endif { __pyx_t_15 = PyTuple_New(6+__pyx_t_14); if (unlikely(!__pyx_t_15)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_15); if (__pyx_t_13) { __Pyx_GIVEREF(__pyx_t_13); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_13); __pyx_t_13 = NULL; } __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_15, 0+__pyx_t_14, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_15, 1+__pyx_t_14, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_15, 2+__pyx_t_14, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_15, 3+__pyx_t_14, __pyx_t_10); __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_15, 4+__pyx_t_14, __pyx_t_11); __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_15, 5+__pyx_t_14, __pyx_t_12); __pyx_t_5 = 0; __pyx_t_6 = 0; __pyx_t_7 = 0; __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_15, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 626, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; } __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_r = __pyx_t_3; __pyx_t_3 = 0; goto __pyx_L0; /* "kullback_leibler_cython.pyx":585 * * # FIXME this one is wrong! * def klucbGamma(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gamma distributions, using :func:`klucb`. * */ /* function exit code */ __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_10); __Pyx_XDECREF(__pyx_t_11); __Pyx_XDECREF(__pyx_t_12); __Pyx_XDECREF(__pyx_t_13); __Pyx_XDECREF(__pyx_t_15); __Pyx_AddTraceback("kullback_leibler_cython.klucbGamma", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 #if CYTHON_PEP489_MULTI_PHASE_INIT static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ static int __pyx_pymod_exec_kullback_leibler_cython(PyObject* module); /*proto*/ static PyModuleDef_Slot __pyx_moduledef_slots[] = { {Py_mod_create, (void*)__pyx_pymod_create}, {Py_mod_exec, (void*)__pyx_pymod_exec_kullback_leibler_cython}, {0, NULL} }; #endif static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, "kullback_leibler_cython", __pyx_k_Kullback_Leibler_divergence_fun, /* m_doc */ #if CYTHON_PEP489_MULTI_PHASE_INIT 0, /* m_size */ #else -1, /* m_size */ #endif __pyx_methods /* m_methods */, #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_moduledef_slots, /* m_slots */ #else NULL, /* m_reload */ #endif NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_u_0_9, __pyx_k_0_9, sizeof(__pyx_k_0_9), 0, 1, 0, 0}, {&__pyx_kp_u_KL_UCB_index_computation_for_Be, __pyx_k_KL_UCB_index_computation_for_Be, sizeof(__pyx_k_KL_UCB_index_computation_for_Be), 0, 1, 0, 0}, {&__pyx_kp_u_KL_UCB_index_computation_for_Ga, __pyx_k_KL_UCB_index_computation_for_Ga, sizeof(__pyx_k_KL_UCB_index_computation_for_Ga), 0, 1, 0, 0}, {&__pyx_kp_u_KL_UCB_index_computation_for_Ga_2, __pyx_k_KL_UCB_index_computation_for_Ga_2, sizeof(__pyx_k_KL_UCB_index_computation_for_Ga_2), 0, 1, 0, 0}, {&__pyx_kp_u_KL_UCB_index_computation_for_Po, __pyx_k_KL_UCB_index_computation_for_Po, sizeof(__pyx_k_KL_UCB_index_computation_for_Po), 0, 1, 0, 0}, {&__pyx_kp_u_KL_UCB_index_computation_for_ex, __pyx_k_KL_UCB_index_computation_for_ex, sizeof(__pyx_k_KL_UCB_index_computation_for_ex), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for, __pyx_k_Kullback_Leibler_divergence_for, sizeof(__pyx_k_Kullback_Leibler_divergence_for), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_2, __pyx_k_Kullback_Leibler_divergence_for_2, sizeof(__pyx_k_Kullback_Leibler_divergence_for_2), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_3, __pyx_k_Kullback_Leibler_divergence_for_3, sizeof(__pyx_k_Kullback_Leibler_divergence_for_3), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_4, __pyx_k_Kullback_Leibler_divergence_for_4, sizeof(__pyx_k_Kullback_Leibler_divergence_for_4), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_5, __pyx_k_Kullback_Leibler_divergence_for_5, sizeof(__pyx_k_Kullback_Leibler_divergence_for_5), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_6, __pyx_k_Kullback_Leibler_divergence_for_6, sizeof(__pyx_k_Kullback_Leibler_divergence_for_6), 0, 1, 0, 0}, {&__pyx_kp_u_Kullback_Leibler_divergence_for_7, __pyx_k_Kullback_Leibler_divergence_for_7, sizeof(__pyx_k_Kullback_Leibler_divergence_for_7), 0, 1, 0, 0}, {&__pyx_kp_u_Olivier_Capp_Aurlien_Garivier_Li, __pyx_k_Olivier_Capp_Aurlien_Garivier_Li, sizeof(__pyx_k_Olivier_Capp_Aurlien_Garivier_Li), 0, 1, 0, 0}, {&__pyx_kp_u_The_generic_KL_UCB_index_comput, __pyx_k_The_generic_KL_UCB_index_comput, sizeof(__pyx_k_The_generic_KL_UCB_index_comput), 0, 1, 0, 0}, {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1}, {&__pyx_n_s_author, __pyx_k_author, sizeof(__pyx_k_author), 0, 0, 1, 1}, {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, {&__pyx_n_s_count_iteration, __pyx_k_count_iteration, sizeof(__pyx_k_count_iteration), 0, 0, 1, 1}, {&__pyx_n_s_d, __pyx_k_d, sizeof(__pyx_k_d), 0, 0, 1, 1}, {&__pyx_kp_u_inf, __pyx_k_inf, sizeof(__pyx_k_inf), 0, 1, 0, 0}, {&__pyx_kp_u_inf_2, __pyx_k_inf_2, sizeof(__pyx_k_inf_2), 0, 1, 0, 0}, {&__pyx_n_s_kl, __pyx_k_kl, sizeof(__pyx_k_kl), 0, 0, 1, 1}, {&__pyx_n_s_klBern, __pyx_k_klBern, sizeof(__pyx_k_klBern), 0, 0, 1, 1}, {&__pyx_kp_u_klBern_line_95, __pyx_k_klBern_line_95, sizeof(__pyx_k_klBern_line_95), 0, 1, 0, 0}, {&__pyx_n_s_klBin, __pyx_k_klBin, sizeof(__pyx_k_klBin), 0, 0, 1, 1}, {&__pyx_kp_u_klBin_line_121, __pyx_k_klBin_line_121, sizeof(__pyx_k_klBin_line_121), 0, 1, 0, 0}, {&__pyx_n_s_klExp, __pyx_k_klExp, sizeof(__pyx_k_klExp), 0, 0, 1, 1}, {&__pyx_kp_u_klExp_line_179, __pyx_k_klExp_line_179, sizeof(__pyx_k_klExp_line_179), 0, 1, 0, 0}, {&__pyx_n_s_klGamma, __pyx_k_klGamma, sizeof(__pyx_k_klGamma), 0, 0, 1, 1}, {&__pyx_kp_u_klGamma_line_219, __pyx_k_klGamma_line_219, sizeof(__pyx_k_klGamma_line_219), 0, 1, 0, 0}, {&__pyx_n_s_klGauss, __pyx_k_klGauss, sizeof(__pyx_k_klGauss), 0, 0, 1, 1}, {&__pyx_kp_u_klGauss_line_306, __pyx_k_klGauss_line_306, sizeof(__pyx_k_klGauss_line_306), 0, 1, 0, 0}, {&__pyx_n_s_klNegBin, __pyx_k_klNegBin, sizeof(__pyx_k_klNegBin), 0, 0, 1, 1}, {&__pyx_kp_u_klNegBin_line_263, __pyx_k_klNegBin_line_263, sizeof(__pyx_k_klNegBin_line_263), 0, 1, 0, 0}, {&__pyx_n_s_klPoisson, __pyx_k_klPoisson, sizeof(__pyx_k_klPoisson), 0, 0, 1, 1}, {&__pyx_kp_u_klPoisson_line_151, __pyx_k_klPoisson_line_151, sizeof(__pyx_k_klPoisson_line_151), 0, 1, 0, 0}, {&__pyx_n_s_klucb, __pyx_k_klucb, sizeof(__pyx_k_klucb), 0, 0, 1, 1}, {&__pyx_n_s_klucbBern, __pyx_k_klucbBern, sizeof(__pyx_k_klucbBern), 0, 0, 1, 1}, {&__pyx_kp_u_klucbBern_line_436, __pyx_k_klucbBern_line_436, sizeof(__pyx_k_klucbBern_line_436), 0, 1, 0, 0}, {&__pyx_n_s_klucbExp, __pyx_k_klucbExp, sizeof(__pyx_k_klucbExp), 0, 0, 1, 1}, {&__pyx_kp_u_klucbExp_line_541, __pyx_k_klucbExp_line_541, sizeof(__pyx_k_klucbExp_line_541), 0, 1, 0, 0}, {&__pyx_n_s_klucbGamma, __pyx_k_klucbGamma, sizeof(__pyx_k_klucbGamma), 0, 0, 1, 1}, {&__pyx_kp_u_klucbGamma_line_585, __pyx_k_klucbGamma_line_585, sizeof(__pyx_k_klucbGamma_line_585), 0, 1, 0, 0}, {&__pyx_n_s_klucbGauss, __pyx_k_klucbGauss, sizeof(__pyx_k_klucbGauss), 0, 0, 1, 1}, {&__pyx_kp_u_klucbGauss_line_470, __pyx_k_klucbGauss_line_470, sizeof(__pyx_k_klucbGauss_line_470), 0, 1, 0, 0}, {&__pyx_n_s_klucbPoisson, __pyx_k_klucbPoisson, sizeof(__pyx_k_klucbPoisson), 0, 0, 1, 1}, {&__pyx_kp_u_klucbPoisson_line_508, __pyx_k_klucbPoisson_line_508, sizeof(__pyx_k_klucbPoisson_line_508), 0, 1, 0, 0}, {&__pyx_kp_u_klucb_line_389, __pyx_k_klucb_line_389, sizeof(__pyx_k_klucb_line_389), 0, 1, 0, 0}, {&__pyx_n_s_kullback_leibler_cython, __pyx_k_kullback_leibler_cython, sizeof(__pyx_k_kullback_leibler_cython), 0, 0, 1, 1}, {&__pyx_kp_s_kullback_leibler_cython_pyx, __pyx_k_kullback_leibler_cython_pyx, sizeof(__pyx_k_kullback_leibler_cython_pyx), 0, 0, 1, 0}, {&__pyx_n_s_lowerbound, __pyx_k_lowerbound, sizeof(__pyx_k_lowerbound), 0, 0, 1, 1}, {&__pyx_n_s_m, __pyx_k_m, sizeof(__pyx_k_m), 0, 0, 1, 1}, {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, {&__pyx_n_s_max_iterations, __pyx_k_max_iterations, sizeof(__pyx_k_max_iterations), 0, 0, 1, 1}, {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1}, {&__pyx_n_s_precision, __pyx_k_precision, sizeof(__pyx_k_precision), 0, 0, 1, 1}, {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1}, {&__pyx_n_s_sig2x, __pyx_k_sig2x, sizeof(__pyx_k_sig2x), 0, 0, 1, 1}, {&__pyx_n_s_sig2y, __pyx_k_sig2y, sizeof(__pyx_k_sig2y), 0, 0, 1, 1}, {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, {&__pyx_n_s_u, __pyx_k_u, sizeof(__pyx_k_u), 0, 0, 1, 1}, {&__pyx_n_s_upperbound, __pyx_k_upperbound, sizeof(__pyx_k_upperbound), 0, 0, 1, 1}, {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1}, {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1}, {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { return 0; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "kullback_leibler_cython.pyx":95 * * * def klBern(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_tuple__2 = PyTuple_Pack(2, __pyx_n_s_x, __pyx_n_s_y); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(0, 95, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__2); __Pyx_GIVEREF(__pyx_tuple__2); __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__2, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klBern, 95, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(0, 95, __pyx_L1_error) /* "kullback_leibler_cython.pyx":121 * * * def klBin(float x, float y, int n) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions * */ __pyx_tuple__4 = PyTuple_Pack(3, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_n); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 121, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__4); __Pyx_GIVEREF(__pyx_tuple__4); __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klBin, 121, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 121, __pyx_L1_error) /* "kullback_leibler_cython.pyx":151 * * * def klPoisson(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_tuple__6 = PyTuple_Pack(2, __pyx_n_s_x, __pyx_n_s_y); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__6); __Pyx_GIVEREF(__pyx_tuple__6); __pyx_codeobj__7 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__6, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klPoisson, 151, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__7)) __PYX_ERR(0, 151, __pyx_L1_error) /* "kullback_leibler_cython.pyx":179 * * * def klExp(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_tuple__8 = PyTuple_Pack(2, __pyx_n_s_x, __pyx_n_s_y); if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__8); __Pyx_GIVEREF(__pyx_tuple__8); __pyx_codeobj__9 = (PyObject*)__Pyx_PyCode_New(2, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__8, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klExp, 179, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__9)) __PYX_ERR(0, 179, __pyx_L1_error) /* "kullback_leibler_cython.pyx":219 * * * def klGamma(float x, float y, float a=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_tuple__10 = PyTuple_Pack(3, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_a); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(0, 219, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__10); __Pyx_GIVEREF(__pyx_tuple__10); __pyx_codeobj__11 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__10, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klGamma, 219, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__11)) __PYX_ERR(0, 219, __pyx_L1_error) /* "kullback_leibler_cython.pyx":263 * * * def klNegBin(float x, float y, r=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution * */ __pyx_tuple__12 = PyTuple_Pack(3, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_r); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__12); __Pyx_GIVEREF(__pyx_tuple__12); __pyx_codeobj__13 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__12, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klNegBin, 263, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__13)) __PYX_ERR(0, 263, __pyx_L1_error) /* "kullback_leibler_cython.pyx":306 * * * def klGauss(float x, float y, float sig2x=0.25, float sig2y=0.25) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\nu_1 = \mathcal{N}(x, \sigma_x^2)` and :math:`\nu_2 = \mathcal{N}(y, \sigma_x^2)`: * */ __pyx_tuple__14 = PyTuple_Pack(4, __pyx_n_s_x, __pyx_n_s_y, __pyx_n_s_sig2x, __pyx_n_s_sig2y); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(0, 306, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__14); __Pyx_GIVEREF(__pyx_tuple__14); __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klGauss, 306, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(0, 306, __pyx_L1_error) /* "kullback_leibler_cython.pyx":389 * # --- KL functions, for the KL-UCB policy * * def klucb(float x, float d, kl, # <<<<<<<<<<<<<< * float upperbound, * float lowerbound=float('-inf'), */ __pyx_tuple__16 = PyTuple_Pack(11, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_kl, __pyx_n_s_upperbound, __pyx_n_s_lowerbound, __pyx_n_s_precision, __pyx_n_s_max_iterations, __pyx_n_s_value, __pyx_n_s_u, __pyx_n_s_count_iteration, __pyx_n_s_m); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(0, 389, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__16); __Pyx_GIVEREF(__pyx_tuple__16); __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(7, 0, 11, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucb, 389, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(0, 389, __pyx_L1_error) /* "kullback_leibler_cython.pyx":436 * * * def klucbBern(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Bernoulli distributions, using :func:`klucb`. * */ __pyx_tuple__18 = PyTuple_Pack(4, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_precision, __pyx_n_s_upperbound); if (unlikely(!__pyx_tuple__18)) __PYX_ERR(0, 436, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__18); __Pyx_GIVEREF(__pyx_tuple__18); __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucbBern, 436, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) __PYX_ERR(0, 436, __pyx_L1_error) /* "kullback_leibler_cython.pyx":470 * * * def klucbGauss(float x, float d, float sig2x=0.25, float precision=0.) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gaussian distributions. * */ __pyx_tuple__20 = PyTuple_Pack(4, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_sig2x, __pyx_n_s_precision); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 470, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__20); __Pyx_GIVEREF(__pyx_tuple__20); __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucbGauss, 470, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 470, __pyx_L1_error) /* "kullback_leibler_cython.pyx":508 * * * def klucbPoisson(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Poisson distributions, using :func:`klucb`. * */ __pyx_tuple__22 = PyTuple_Pack(4, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_precision, __pyx_n_s_upperbound); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 508, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__22); __Pyx_GIVEREF(__pyx_tuple__22); __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(3, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucbPoisson, 508, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 508, __pyx_L1_error) /* "kullback_leibler_cython.pyx":541 * * * def klucbExp(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for exponential distributions, using :func:`klucb`. * */ __pyx_tuple__24 = PyTuple_Pack(5, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_precision, __pyx_n_s_upperbound, __pyx_n_s_lowerbound); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 541, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__24); __Pyx_GIVEREF(__pyx_tuple__24); __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucbExp, 541, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 541, __pyx_L1_error) /* "kullback_leibler_cython.pyx":585 * * # FIXME this one is wrong! * def klucbGamma(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gamma distributions, using :func:`klucb`. * */ __pyx_tuple__26 = PyTuple_Pack(5, __pyx_n_s_x, __pyx_n_s_d, __pyx_n_s_precision, __pyx_n_s_upperbound, __pyx_n_s_lowerbound); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 585, __pyx_L1_error) __Pyx_GOTREF(__pyx_tuple__26); __Pyx_GIVEREF(__pyx_tuple__26); __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__26, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_kullback_leibler_cython_pyx, __pyx_n_s_klucbGamma, 585, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 585, __pyx_L1_error) __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); __pyx_float_0_25 = PyFloat_FromDouble(0.25); if (unlikely(!__pyx_float_0_25)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) __PYX_ERR(0, 1, __pyx_L1_error) return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initkullback_leibler_cython(void); /*proto*/ PyMODINIT_FUNC initkullback_leibler_cython(void) #else PyMODINIT_FUNC PyInit_kullback_leibler_cython(void); /*proto*/ PyMODINIT_FUNC PyInit_kullback_leibler_cython(void) #if CYTHON_PEP489_MULTI_PHASE_INIT { return PyModuleDef_Init(&__pyx_moduledef); } static int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name) { PyObject *value = PyObject_GetAttrString(spec, from_name); int result = 0; if (likely(value)) { result = PyDict_SetItemString(moddict, to_name, value); Py_DECREF(value); } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { PyErr_Clear(); } else { result = -1; } return result; } static PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { PyObject *module = NULL, *moddict, *modname; if (__pyx_m) return __Pyx_NewRef(__pyx_m); modname = PyObject_GetAttrString(spec, "name"); if (unlikely(!modname)) goto bad; module = PyModule_NewObject(modname); Py_DECREF(modname); if (unlikely(!module)) goto bad; moddict = PyModule_GetDict(module); if (unlikely(!moddict)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__") < 0)) goto bad; if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__") < 0)) goto bad; return module; bad: Py_XDECREF(module); return NULL; } static int __pyx_pymod_exec_kullback_leibler_cython(PyObject *__pyx_pyinit_module) #endif #endif { PyObject *__pyx_t_1 = NULL; double __pyx_t_2; __Pyx_RefNannyDeclarations #if CYTHON_PEP489_MULTI_PHASE_INIT if (__pyx_m && __pyx_m == __pyx_pyinit_module) return 0; #endif #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_kullback_leibler_cython(void)", 0); if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) #ifdef __Pyx_CyFunction_USED if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Coroutine_USED if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_AsyncGen_USED if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif #ifdef __Pyx_StopAsyncIteration_USED if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if CYTHON_PEP489_MULTI_PHASE_INIT __pyx_m = __pyx_pyinit_module; Py_INCREF(__pyx_m); #else #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4("kullback_leibler_cython", __pyx_methods, __pyx_k_Kullback_Leibler_divergence_fun, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) #endif __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) Py_INCREF(__pyx_d); __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); /*--- Initialize various global constants etc. ---*/ if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif if (__pyx_module_is_main_kullback_leibler_cython) { if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) } #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) if (!PyDict_GetItemString(modules, "kullback_leibler_cython")) { if (unlikely(PyDict_SetItemString(modules, "kullback_leibler_cython", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) } } #endif /*--- Builtin init code ---*/ if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Constants init code ---*/ if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ /*--- Type import code ---*/ /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) #endif /* "kullback_leibler_cython.pyx":83 * from __future__ import division, print_function # Python 2 compatibility * * __author__ = "Olivier Capp, Aurlien Garivier, Lilian Besson" # <<<<<<<<<<<<<< * __version__ = "0.9" * */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_author, __pyx_kp_u_Olivier_Capp_Aurlien_Garivier_Li) < 0) __PYX_ERR(0, 83, __pyx_L1_error) /* "kullback_leibler_cython.pyx":84 * * __author__ = "Olivier Capp, Aurlien Garivier, Lilian Besson" * __version__ = "0.9" # <<<<<<<<<<<<<< * * from libc.math cimport log, sqrt, exp */ if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_kp_u_0_9) < 0) __PYX_ERR(0, 84, __pyx_L1_error) /* "kullback_leibler_cython.pyx":89 * * * cdef float eps = 1e-15 #: Threshold value: everything in [0, 1] is truncated to [eps, 1 - eps] # <<<<<<<<<<<<<< * * */ __pyx_v_23kullback_leibler_cython_eps = 1e-15; /* "kullback_leibler_cython.pyx":95 * * * def klBern(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Bernoulli distributions. https://en.wikipedia.org/wiki/Bernoulli_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_1klBern, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 95, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klBern, __pyx_t_1) < 0) __PYX_ERR(0, 95, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":121 * * * def klBin(float x, float y, int n) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Binomial distributions. https://math.stackexchange.com/questions/320399/kullback-leibner-divergence-of-binomial-distributions * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_3klBin, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 121, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klBin, __pyx_t_1) < 0) __PYX_ERR(0, 121, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":151 * * * def klPoisson(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Poison distributions. https://en.wikipedia.org/wiki/Poisson_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_5klPoisson, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klPoisson, __pyx_t_1) < 0) __PYX_ERR(0, 151, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":179 * * * def klExp(float x, float y) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for exponential distributions. https://en.wikipedia.org/wiki/Exponential_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_7klExp, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klExp, __pyx_t_1) < 0) __PYX_ERR(0, 179, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":219 * * * def klGamma(float x, float y, float a=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for gamma distributions. https://en.wikipedia.org/wiki/Gamma_distribution#Kullback.E2.80.93Leibler_divergence * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_9klGamma, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 219, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klGamma, __pyx_t_1) < 0) __PYX_ERR(0, 219, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":263 * * * def klNegBin(float x, float y, r=1) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for negative binomial distributions. https://en.wikipedia.org/wiki/Negative_binomial_distribution * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_11klNegBin, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klNegBin, __pyx_t_1) < 0) __PYX_ERR(0, 263, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":306 * * * def klGauss(float x, float y, float sig2x=0.25, float sig2y=0.25) -> float: # <<<<<<<<<<<<<< * r""" Kullback-Leibler divergence for Gaussian distributions of means ``x`` and ``y`` and variances ``sig2x`` and ``sig2y``, :math:`\nu_1 = \mathcal{N}(x, \sigma_x^2)` and :math:`\nu_2 = \mathcal{N}(y, \sigma_x^2)`: * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_13klGauss, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 306, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klGauss, __pyx_t_1) < 0) __PYX_ERR(0, 306, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":391 * def klucb(float x, float d, kl, * float upperbound, * float lowerbound=float('-inf'), # <<<<<<<<<<<<<< * float precision=1e-6, * int max_iterations=50 */ __pyx_t_2 = __Pyx_PyObject_AsDouble(__pyx_kp_u_inf_2); if (unlikely(__pyx_t_2 == ((double)((double)-1)) && PyErr_Occurred())) __PYX_ERR(0, 391, __pyx_L1_error) __pyx_k_ = __pyx_t_2; /* "kullback_leibler_cython.pyx":389 * # --- KL functions, for the KL-UCB policy * * def klucb(float x, float d, kl, # <<<<<<<<<<<<<< * float upperbound, * float lowerbound=float('-inf'), */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_15klucb, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 389, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucb, __pyx_t_1) < 0) __PYX_ERR(0, 389, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":436 * * * def klucbBern(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Bernoulli distributions, using :func:`klucb`. * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_17klucbBern, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 436, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucbBern, __pyx_t_1) < 0) __PYX_ERR(0, 436, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":470 * * * def klucbGauss(float x, float d, float sig2x=0.25, float precision=0.) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gaussian distributions. * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_19klucbGauss, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 470, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucbGauss, __pyx_t_1) < 0) __PYX_ERR(0, 470, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":508 * * * def klucbPoisson(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Poisson distributions, using :func:`klucb`. * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_21klucbPoisson, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 508, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucbPoisson, __pyx_t_1) < 0) __PYX_ERR(0, 508, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":541 * * * def klucbExp(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for exponential distributions, using :func:`klucb`. * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_23klucbExp, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 541, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucbExp, __pyx_t_1) < 0) __PYX_ERR(0, 541, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":585 * * # FIXME this one is wrong! * def klucbGamma(float x, float d, float precision=1e-6) -> float: # <<<<<<<<<<<<<< * """ KL-UCB index computation for Gamma distributions, using :func:`klucb`. * */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_23kullback_leibler_cython_25klucbGamma, NULL, __pyx_n_s_kullback_leibler_cython); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 585, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_d, __pyx_n_s_klucbGamma, __pyx_t_1) < 0) __PYX_ERR(0, 585, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "kullback_leibler_cython.pyx":1 * # -*- coding: utf-8 -*- # <<<<<<<<<<<<<< * """ Kullback-Leibler divergence functions and klUCB utilities. Optimized version that should be compiled using Cython (http://docs.cython.org/). * */ __pyx_t_1 = __Pyx_PyDict_NewPresized(13); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klBern_line_95, __pyx_kp_u_Kullback_Leibler_divergence_for) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klBin_line_121, __pyx_kp_u_Kullback_Leibler_divergence_for_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klPoisson_line_151, __pyx_kp_u_Kullback_Leibler_divergence_for_3) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klExp_line_179, __pyx_kp_u_Kullback_Leibler_divergence_for_4) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klGamma_line_219, __pyx_kp_u_Kullback_Leibler_divergence_for_5) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klNegBin_line_263, __pyx_kp_u_Kullback_Leibler_divergence_for_6) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klGauss_line_306, __pyx_kp_u_Kullback_Leibler_divergence_for_7) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucb_line_389, __pyx_kp_u_The_generic_KL_UCB_index_comput) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucbBern_line_436, __pyx_kp_u_KL_UCB_index_computation_for_Be) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucbGauss_line_470, __pyx_kp_u_KL_UCB_index_computation_for_Ga) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucbPoisson_line_508, __pyx_kp_u_KL_UCB_index_computation_for_Po) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucbExp_line_541, __pyx_kp_u_KL_UCB_index_computation_for_ex) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_t_1, __pyx_kp_u_klucbGamma_line_585, __pyx_kp_u_KL_UCB_index_computation_for_Ga_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /*--- Wrapped vars code ---*/ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { if (__pyx_d) { __Pyx_AddTraceback("init kullback_leibler_cython", 0, __pyx_lineno, __pyx_filename); } Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init kullback_leibler_cython"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if CYTHON_PEP489_MULTI_PHASE_INIT return (__pyx_m != NULL) ? 0 : -1; #elif PY_MAJOR_VERSION >= 3 return __pyx_m; #else return; #endif } /* --- Runtime support code --- */ /* Refnanny */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* RaiseArgTupleInvalid */ static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } /* RaiseDoubleKeywords */ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } /* ParseKeywords */ static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%.200s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%.200s() got an unexpected keyword argument '%.200s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } /* PyFunctionFastCall */ #if CYTHON_FAST_PYCALL #include "frameobject.h" static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, PyObject *globals) { PyFrameObject *f; PyThreadState *tstate = __Pyx_PyThreadState_Current; PyObject **fastlocals; Py_ssize_t i; PyObject *result; assert(globals != NULL); /* XXX Perhaps we should create a specialized PyFrame_New() that doesn't take locals, but does take builtins without sanity checking them. */ assert(tstate != NULL); f = PyFrame_New(tstate, co, globals, NULL); if (f == NULL) { return NULL; } fastlocals = f->f_localsplus; for (i = 0; i < na; i++) { Py_INCREF(*args); fastlocals[i] = *args++; } result = PyEval_EvalFrameEx(f,0); ++tstate->recursion_depth; Py_DECREF(f); --tstate->recursion_depth; return result; } #if 1 || PY_VERSION_HEX < 0x030600B1 static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, int nargs, PyObject *kwargs) { PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); PyObject *globals = PyFunction_GET_GLOBALS(func); PyObject *argdefs = PyFunction_GET_DEFAULTS(func); PyObject *closure; #if PY_MAJOR_VERSION >= 3 PyObject *kwdefs; #endif PyObject *kwtuple, **k; PyObject **d; Py_ssize_t nd; Py_ssize_t nk; PyObject *result; assert(kwargs == NULL || PyDict_Check(kwargs)); nk = kwargs ? PyDict_Size(kwargs) : 0; if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { return NULL; } if ( #if PY_MAJOR_VERSION >= 3 co->co_kwonlyargcount == 0 && #endif likely(kwargs == NULL || nk == 0) && co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { if (argdefs == NULL && co->co_argcount == nargs) { result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); goto done; } else if (nargs == 0 && argdefs != NULL && co->co_argcount == Py_SIZE(argdefs)) { /* function called with no arguments, but all parameters have a default value: use default values as arguments .*/ args = &PyTuple_GET_ITEM(argdefs, 0); result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); goto done; } } if (kwargs != NULL) { Py_ssize_t pos, i; kwtuple = PyTuple_New(2 * nk); if (kwtuple == NULL) { result = NULL; goto done; } k = &PyTuple_GET_ITEM(kwtuple, 0); pos = i = 0; while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { Py_INCREF(k[i]); Py_INCREF(k[i+1]); i += 2; } nk = i / 2; } else { kwtuple = NULL; k = NULL; } closure = PyFunction_GET_CLOSURE(func); #if PY_MAJOR_VERSION >= 3 kwdefs = PyFunction_GET_KW_DEFAULTS(func); #endif if (argdefs != NULL) { d = &PyTuple_GET_ITEM(argdefs, 0); nd = Py_SIZE(argdefs); } else { d = NULL; nd = 0; } #if PY_MAJOR_VERSION >= 3 result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, args, nargs, k, (int)nk, d, (int)nd, kwdefs, closure); #else result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, args, nargs, k, (int)nk, d, (int)nd, closure); #endif Py_XDECREF(kwtuple); done: Py_LeaveRecursiveCall(); return result; } #endif #endif /* PyCFunctionFastCall */ #if CYTHON_FAST_PYCCALL static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { PyCFunctionObject *func = (PyCFunctionObject*)func_obj; PyCFunction meth = PyCFunction_GET_FUNCTION(func); PyObject *self = PyCFunction_GET_SELF(func); int flags = PyCFunction_GET_FLAGS(func); assert(PyCFunction_Check(func)); assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS))); assert(nargs >= 0); assert(nargs == 0 || args != NULL); /* _PyCFunction_FastCallDict() must not be called with an exception set, because it may clear it (directly or indirectly) and so the caller loses its exception */ assert(!PyErr_Occurred()); if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { return (*((__Pyx_PyCFunctionFastWithKeywords)meth)) (self, args, nargs, NULL); } else { return (*((__Pyx_PyCFunctionFast)meth)) (self, args, nargs); } } #endif /* PyObjectCall */ #if CYTHON_COMPILING_IN_CPYTHON static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { PyObject *result; ternaryfunc call = func->ob_type->tp_call; if (unlikely(!call)) return PyObject_Call(func, arg, kw); if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) return NULL; result = (*call)(func, arg, kw); Py_LeaveRecursiveCall(); if (unlikely(!result) && unlikely(!PyErr_Occurred())) { PyErr_SetString( PyExc_SystemError, "NULL result without error in PyObject_Call"); } return result; } #endif /* GetBuiltinName */ static PyObject *__Pyx_GetBuiltinName(PyObject *name) { PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); if (unlikely(!result)) { PyErr_Format(PyExc_NameError, #if PY_MAJOR_VERSION >= 3 "name '%U' is not defined", name); #else "name '%.200s' is not defined", PyString_AS_STRING(name)); #endif } return result; } /* GetModuleGlobalName */ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) { PyObject *result; #if !CYTHON_AVOID_BORROWED_REFS result = PyDict_GetItem(__pyx_d, name); if (likely(result)) { Py_INCREF(result); } else { #else result = PyObject_GetItem(__pyx_d, name); if (!result) { PyErr_Clear(); #endif result = __Pyx_GetBuiltinName(name); } return result; } /* pyobject_as_double */ static double __Pyx__PyObject_AsDouble(PyObject* obj) { PyObject* float_value; #if !CYTHON_USE_TYPE_SLOTS float_value = PyNumber_Float(obj); if (0) goto bad; #else PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number; if (likely(nb) && likely(nb->nb_float)) { float_value = nb->nb_float(obj); if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) { PyErr_Format(PyExc_TypeError, "__float__ returned non-float (type %.200s)", Py_TYPE(float_value)->tp_name); Py_DECREF(float_value); goto bad; } } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) { #if PY_MAJOR_VERSION >= 3 float_value = PyFloat_FromString(obj); #else float_value = PyFloat_FromString(obj, 0); #endif } else { PyObject* args = PyTuple_New(1); if (unlikely(!args)) goto bad; PyTuple_SET_ITEM(args, 0, obj); float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0); PyTuple_SET_ITEM(args, 0, 0); Py_DECREF(args); } #endif if (likely(float_value)) { double value = PyFloat_AS_DOUBLE(float_value); Py_DECREF(float_value); return value; } bad: return (double)-1; } /* PyErrFetchRestore */ #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #endif /* CLineInTraceback */ #ifndef CYTHON_CLINE_IN_TRACEBACK static int __Pyx_CLineForTraceback(CYTHON_UNUSED PyThreadState *tstate, int c_line) { PyObject *use_cline; PyObject *ptype, *pvalue, *ptraceback; #if CYTHON_COMPILING_IN_CPYTHON PyObject **cython_runtime_dict; #endif __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); #if CYTHON_COMPILING_IN_CPYTHON cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); if (likely(cython_runtime_dict)) { use_cline = PyDict_GetItem(*cython_runtime_dict, __pyx_n_s_cline_in_traceback); } else #endif { PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); if (use_cline_obj) { use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; Py_DECREF(use_cline_obj); } else { PyErr_Clear(); use_cline = NULL; } } if (!use_cline) { c_line = 0; PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); } else if (PyObject_Not(use_cline) != 0) { c_line = 0; } __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); return c_line; } #endif /* CodeObjectCache */ static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = start + (end - start) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } /* AddTraceback */ #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, 0, 0, 0, 0, __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; PyThreadState *tstate = __Pyx_PyThreadState_Current; if (c_line) { c_line = __Pyx_CLineForTraceback(tstate, c_line); } py_code = __pyx_find_code_object(c_line ? -c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); } py_frame = PyFrame_New( tstate, /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ __pyx_d, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; __Pyx_PyFrame_SetLineNumber(py_frame, py_line); PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } /* CIntFromPyVerify */ #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) #define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) #define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ {\ func_type value = func_value;\ if (sizeof(target_type) < sizeof(func_type)) {\ if (unlikely(value != (func_type) (target_type) value)) {\ func_type zero = 0;\ if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ return (target_type) -1;\ if (is_unsigned && unlikely(value < zero))\ goto raise_neg_overflow;\ else\ goto raise_overflow;\ }\ }\ return (target_type) value;\ } /* CIntFromPy */ static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { const int neg_one = (int) -1, const_zero = (int) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(int) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (int) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (int) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(int) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (int) 0; case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) case -2: if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 2: if (8 * sizeof(int) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -3: if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 3: if (8 * sizeof(int) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case -4: if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; case 4: if (8 * sizeof(int) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); } } break; } #endif if (sizeof(int) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else int val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (int) -1; } } else { int val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (int) -1; val = __Pyx_PyInt_As_int(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to int"); return (int) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to int"); return (int) -1; } /* CIntToPy */ static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; if (is_unsigned) { if (sizeof(long) < sizeof(long)) { return PyInt_FromLong((long) value); } else if (sizeof(long) <= sizeof(unsigned long)) { return PyLong_FromUnsignedLong((unsigned long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); #endif } } else { if (sizeof(long) <= sizeof(long)) { return PyInt_FromLong((long) value); #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { return PyLong_FromLongLong((PY_LONG_LONG) value); #endif } } { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&value; return _PyLong_FromByteArray(bytes, sizeof(long), little, !is_unsigned); } } /* CIntFromPy */ static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { const long neg_one = (long) -1, const_zero = (long) 0; const int is_unsigned = neg_one > const_zero; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x))) { if (sizeof(long) < sizeof(long)) { __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) } else { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { goto raise_neg_overflow; } return (long) val; } } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); } } break; } #endif #if CYTHON_COMPILING_IN_CPYTHON if (unlikely(Py_SIZE(x) < 0)) { goto raise_neg_overflow; } #else { int result = PyObject_RichCompareBool(x, Py_False, Py_LT); if (unlikely(result < 0)) return (long) -1; if (unlikely(result == 1)) goto raise_neg_overflow; } #endif if (sizeof(long) <= sizeof(unsigned long)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) #endif } } else { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)x)->ob_digit; switch (Py_SIZE(x)) { case 0: return (long) 0; case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) case -2: if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 2: if (8 * sizeof(long) > 1 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -3: if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 3: if (8 * sizeof(long) > 2 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case -4: if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; case 4: if (8 * sizeof(long) > 3 * PyLong_SHIFT) { if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); } } break; } #endif if (sizeof(long) <= sizeof(long)) { __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) #ifdef HAVE_LONG_LONG } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) #endif } } { #if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) PyErr_SetString(PyExc_RuntimeError, "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); #else long val; PyObject *v = __Pyx_PyNumber_IntOrLong(x); #if PY_MAJOR_VERSION < 3 if (likely(v) && !PyLong_Check(v)) { PyObject *tmp = v; v = PyNumber_Long(tmp); Py_DECREF(tmp); } #endif if (likely(v)) { int one = 1; int is_little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; int ret = _PyLong_AsByteArray((PyLongObject *)v, bytes, sizeof(val), is_little, !is_unsigned); Py_DECREF(v); if (likely(!ret)) return val; } #endif return (long) -1; } } else { long val; PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); if (!tmp) return (long) -1; val = __Pyx_PyInt_As_long(tmp); Py_DECREF(tmp); return val; } raise_overflow: PyErr_SetString(PyExc_OverflowError, "value too large to convert to long"); return (long) -1; raise_neg_overflow: PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long) -1; } /* FastTypeChecks */ #if CYTHON_COMPILING_IN_CPYTHON static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { while (a) { a = a->tp_base; if (a == b) return 1; } return b == &PyBaseObject_Type; } static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { PyObject *mro; if (a == b) return 1; mro = a->tp_mro; if (likely(mro)) { Py_ssize_t i, n; n = PyTuple_GET_SIZE(mro); for (i = 0; i < n; i++) { if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) return 1; } return 0; } return __Pyx_InBases(a, b); } #if PY_MAJOR_VERSION == 2 static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { PyObject *exception, *value, *tb; int res; __Pyx_PyThreadState_declare __Pyx_PyThreadState_assign __Pyx_ErrFetch(&exception, &value, &tb); res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } if (!res) { res = PyObject_IsSubclass(err, exc_type2); if (unlikely(res == -1)) { PyErr_WriteUnraisable(err); res = 0; } } __Pyx_ErrRestore(exception, value, tb); return res; } #else static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; if (!res) { res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); } return res; } #endif static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject* exc_type) { if (likely(err == exc_type)) return 1; if (likely(PyExceptionClass_Check(err))) { return __Pyx_inner_PyErr_GivenExceptionMatches2(err, NULL, exc_type); } return PyErr_GivenExceptionMatches(err, exc_type); } static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *exc_type1, PyObject *exc_type2) { if (likely(err == exc_type1 || err == exc_type2)) return 1; if (likely(PyExceptionClass_Check(err))) { return __Pyx_inner_PyErr_GivenExceptionMatches2(err, exc_type1, exc_type2); } return (PyErr_GivenExceptionMatches(err, exc_type1) || PyErr_GivenExceptionMatches(err, exc_type2)); } #endif /* CheckBinaryVersion */ static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); return PyErr_WarnEx(NULL, message, 1); } return 0; } /* InitStrings */ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; if (PyObject_Hash(*t->p) == -1) PyErr_Clear(); ++t; } return 0; } static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); } static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { Py_ssize_t ignore; return __Pyx_PyObject_AsStringAndSize(o, &ignore); } #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT #if !CYTHON_PEP393_ENABLED static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { char* defenc_c; PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); if (!defenc) return NULL; defenc_c = PyBytes_AS_STRING(defenc); #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII { char* end = defenc_c + PyBytes_GET_SIZE(defenc); char* c; for (c = defenc_c; c < end; c++) { if ((unsigned char) (*c) >= 128) { PyUnicode_AsASCIIString(o); return NULL; } } } #endif *length = PyBytes_GET_SIZE(defenc); return defenc_c; } #else static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII if (likely(PyUnicode_IS_ASCII(o))) { *length = PyUnicode_GET_LENGTH(o); return PyUnicode_AsUTF8(o); } else { PyUnicode_AsASCIIString(o); return NULL; } #else return PyUnicode_AsUTF8AndSize(o, length); #endif } #endif #endif static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT if ( #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII __Pyx_sys_getdefaultencoding_not_ascii && #endif PyUnicode_Check(o)) { return __Pyx_PyUnicode_AsStringAndSize(o, length); } else #endif #if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) if (PyByteArray_Check(o)) { *length = PyByteArray_GET_SIZE(o); return PyByteArray_AS_STRING(o); } else #endif { char* result; int r = PyBytes_AsStringAndSize(o, &result, length); if (unlikely(r < 0)) { return NULL; } else { return result; } } } static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { #if PY_MAJOR_VERSION >= 3 if (PyLong_Check(result)) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "__int__ returned non-int (type %.200s). " "The ability to return an instance of a strict subclass of int " "is deprecated, and may be removed in a future version of Python.", Py_TYPE(result)->tp_name)) { Py_DECREF(result); return NULL; } return result; } #endif PyErr_Format(PyExc_TypeError, "__%.4s__ returned non-%.4s (type %.200s)", type_name, type_name, Py_TYPE(result)->tp_name); Py_DECREF(result); return NULL; } static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { #if CYTHON_USE_TYPE_SLOTS PyNumberMethods *m; #endif const char *name = NULL; PyObject *res = NULL; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_Check(x) || PyLong_Check(x))) #else if (likely(PyLong_Check(x))) #endif return __Pyx_NewRef(x); #if CYTHON_USE_TYPE_SLOTS m = Py_TYPE(x)->tp_as_number; #if PY_MAJOR_VERSION < 3 if (m && m->nb_int) { name = "int"; res = m->nb_int(x); } else if (m && m->nb_long) { name = "long"; res = m->nb_long(x); } #else if (likely(m && m->nb_int)) { name = "int"; res = m->nb_int(x); } #endif #else if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { res = PyNumber_Int(x); } #endif if (likely(res)) { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { #else if (unlikely(!PyLong_CheckExact(res))) { #endif return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject *x; #if PY_MAJOR_VERSION < 3 if (likely(PyInt_CheckExact(b))) { if (sizeof(Py_ssize_t) >= sizeof(long)) return PyInt_AS_LONG(b); else return PyInt_AsSsize_t(x); } #endif if (likely(PyLong_CheckExact(b))) { #if CYTHON_USE_PYLONG_INTERNALS const digit* digits = ((PyLongObject*)b)->ob_digit; const Py_ssize_t size = Py_SIZE(b); if (likely(__Pyx_sst_abs(size) <= 1)) { ival = likely(size) ? digits[0] : 0; if (size == -1) ival = -ival; return ival; } else { switch (size) { case 2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -2: if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -3: if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case 4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; case -4: if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); } break; } } #endif return PyLong_AsSsize_t(b); } x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { return PyInt_FromSize_t(ival); } #endif /* Py_PYTHON_H */