Last active
February 3, 2016 13:33
-
-
Save kudkudak/dabbed1af234c8e3868e to your computer and use it in GitHub Desktop.
Conditional entropy calculation in Python, Numba and Cython (ugly! sorry)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The cython extension is already loaded. To reload it, use:\n", | |
" %reload_ext cython\n" | |
] | |
} | |
], | |
"source": [ | |
"import numpy as np\n", | |
"from numba import autojit\n", | |
"%load_ext cython" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Function code and checks" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"def conditional_entropy_python(X, Y):\n", | |
" \"\"\" \n", | |
" Calculate conditional entropy of all columns of X against Y (i.e. \\sum_i=1^{N} H(X_i | Y)).\n", | |
" \"\"\"\n", | |
" # Calculate distribution of y \n", | |
" Y_dist = np.zeros(shape=(int(Y.max()) + 1, ), dtype=np.float32)\n", | |
" for y in range(Y.max() + 1):\n", | |
" Y_dist[y] = (float(len(np.where(Y==y)[0]))/len(Y))\n", | |
" \n", | |
" Y_max = Y.max()\n", | |
" X_max = X.max()\n", | |
" \n", | |
" ce_sum = 0.\n", | |
" for i in range(X.shape[1]):\n", | |
" ce_sum_partial = 0.\n", | |
" \n", | |
" # Count \n", | |
" counts = np.zeros(shape=(X_max + 1, Y_max + 1), dtype=np.int32)\n", | |
" for row, x in enumerate(X[:, i]):\n", | |
" counts[x, Y[row]] += 1\n", | |
" \n", | |
" # For each value of y add conditional probability\n", | |
" for y in range(Y.max() + 1):\n", | |
" count_sum = float(counts[:, y].sum())\n", | |
" probs = counts[:, y] / count_sum\n", | |
" entropy = -probs * np.log2(probs)\n", | |
" ce_sum_partial += (entropy * Y_dist[y]).sum()\n", | |
"\n", | |
" ce_sum += ce_sum_partial\n", | |
" \n", | |
" return ce_sum" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# Some data: two conditionally independent variables\n", | |
"X = np.random.randint(0, 2, size=(10000, 80))\n", | |
"Y = np.random.randint(0, 2, size=(10000))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"# Check that function calculates correctly entropy\n", | |
"val = conditional_entropy_python(X, Y)\n", | |
"assert abs(val - X.shape[1]) < 0.1, \"X and Y are conditionally independent. 1 bit per column\"" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"# nopython=True is very important, will fail for non-typed code\n", | |
"conditional_entropy_numba = autojit(nopython=True)(conditional_entropy_python)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"(79.989800335148786, 79.98980033514879)" | |
] | |
}, | |
"execution_count": 17, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Always when optimizing check that we have same output\n", | |
"conditional_entropy_python(X, Y), conditional_entropy_numba(X, Y)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"collapsed": false | |
}, | |
"source": [ | |
"## Time measurement. Numba speeds up by 100x using just 1 line" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 loops, best of 3: 1.69 s per loop\n", | |
"10 loops, best of 3: 17.5 ms per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit conditional_entropy_python(X, Y)\n", | |
"%timeit conditional_entropy_numba(X, Y)\n", | |
"\n", | |
"# 100 times faster!" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Try cython" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Annotate will tell you if everything is truly Cython\n", | |
"\n", | |
"Code is very ugly, doesn't matter for now" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.23.4 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_713780f76e023b2fc37b50d30bf4f852.pyx</title>\n", | |
" <style type=\"text/css\">\n", | |
" \n", | |
"body.cython { font-family: courier; font-size: 12; }\n", | |
"\n", | |
".cython.tag { }\n", | |
".cython.line { margin: 0em }\n", | |
".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n", | |
"\n", | |
".cython.line .run { background-color: #B0FFB0; }\n", | |
".cython.line .mis { background-color: #FFB0B0; }\n", | |
".cython.code.run { border-left: 8px solid #B0FFB0; }\n", | |
".cython.code.mis { border-left: 8px solid #FFB0B0; }\n", | |
"\n", | |
".cython.code .py_c_api { color: red; }\n", | |
".cython.code .py_macro_api { color: #FF7000; }\n", | |
".cython.code .pyx_c_api { color: #FF3000; }\n", | |
".cython.code .pyx_macro_api { color: #FF7000; }\n", | |
".cython.code .refnanny { color: #FFA000; }\n", | |
".cython.code .trace { color: #FFA000; }\n", | |
".cython.code .error_goto { color: #FFA000; }\n", | |
"\n", | |
".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n", | |
".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_attr { color: #0000FF; }\n", | |
".cython.code .py_call { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_call { color: #0000FF; }\n", | |
"\n", | |
".cython.score-0 {background-color: #FFFFff;}\n", | |
".cython.score-1 {background-color: #FFFFe7;}\n", | |
".cython.score-2 {background-color: #FFFFd4;}\n", | |
".cython.score-3 {background-color: #FFFFc4;}\n", | |
".cython.score-4 {background-color: #FFFFb6;}\n", | |
".cython.score-5 {background-color: #FFFFaa;}\n", | |
".cython.score-6 {background-color: #FFFF9f;}\n", | |
".cython.score-7 {background-color: #FFFF96;}\n", | |
".cython.score-8 {background-color: #FFFF8d;}\n", | |
".cython.score-9 {background-color: #FFFF86;}\n", | |
".cython.score-10 {background-color: #FFFF7f;}\n", | |
".cython.score-11 {background-color: #FFFF79;}\n", | |
".cython.score-12 {background-color: #FFFF73;}\n", | |
".cython.score-13 {background-color: #FFFF6e;}\n", | |
".cython.score-14 {background-color: #FFFF6a;}\n", | |
".cython.score-15 {background-color: #FFFF66;}\n", | |
".cython.score-16 {background-color: #FFFF62;}\n", | |
".cython.score-17 {background-color: #FFFF5e;}\n", | |
".cython.score-18 {background-color: #FFFF5b;}\n", | |
".cython.score-19 {background-color: #FFFF57;}\n", | |
".cython.score-20 {background-color: #FFFF55;}\n", | |
".cython.score-21 {background-color: #FFFF52;}\n", | |
".cython.score-22 {background-color: #FFFF4f;}\n", | |
".cython.score-23 {background-color: #FFFF4d;}\n", | |
".cython.score-24 {background-color: #FFFF4b;}\n", | |
".cython.score-25 {background-color: #FFFF48;}\n", | |
".cython.score-26 {background-color: #FFFF46;}\n", | |
".cython.score-27 {background-color: #FFFF44;}\n", | |
".cython.score-28 {background-color: #FFFF43;}\n", | |
".cython.score-29 {background-color: #FFFF41;}\n", | |
".cython.score-30 {background-color: #FFFF3f;}\n", | |
".cython.score-31 {background-color: #FFFF3e;}\n", | |
".cython.score-32 {background-color: #FFFF3c;}\n", | |
".cython.score-33 {background-color: #FFFF3b;}\n", | |
".cython.score-34 {background-color: #FFFF39;}\n", | |
".cython.score-35 {background-color: #FFFF38;}\n", | |
".cython.score-36 {background-color: #FFFF37;}\n", | |
".cython.score-37 {background-color: #FFFF36;}\n", | |
".cython.score-38 {background-color: #FFFF35;}\n", | |
".cython.score-39 {background-color: #FFFF34;}\n", | |
".cython.score-40 {background-color: #FFFF33;}\n", | |
".cython.score-41 {background-color: #FFFF32;}\n", | |
".cython.score-42 {background-color: #FFFF31;}\n", | |
".cython.score-43 {background-color: #FFFF30;}\n", | |
".cython.score-44 {background-color: #FFFF2f;}\n", | |
".cython.score-45 {background-color: #FFFF2e;}\n", | |
".cython.score-46 {background-color: #FFFF2d;}\n", | |
".cython.score-47 {background-color: #FFFF2c;}\n", | |
".cython.score-48 {background-color: #FFFF2b;}\n", | |
".cython.score-49 {background-color: #FFFF2b;}\n", | |
".cython.score-50 {background-color: #FFFF2a;}\n", | |
".cython.score-51 {background-color: #FFFF29;}\n", | |
".cython.score-52 {background-color: #FFFF29;}\n", | |
".cython.score-53 {background-color: #FFFF28;}\n", | |
".cython.score-54 {background-color: #FFFF27;}\n", | |
".cython.score-55 {background-color: #FFFF27;}\n", | |
".cython.score-56 {background-color: #FFFF26;}\n", | |
".cython.score-57 {background-color: #FFFF26;}\n", | |
".cython.score-58 {background-color: #FFFF25;}\n", | |
".cython.score-59 {background-color: #FFFF24;}\n", | |
".cython.score-60 {background-color: #FFFF24;}\n", | |
".cython.score-61 {background-color: #FFFF23;}\n", | |
".cython.score-62 {background-color: #FFFF23;}\n", | |
".cython.score-63 {background-color: #FFFF22;}\n", | |
".cython.score-64 {background-color: #FFFF22;}\n", | |
".cython.score-65 {background-color: #FFFF22;}\n", | |
".cython.score-66 {background-color: #FFFF21;}\n", | |
".cython.score-67 {background-color: #FFFF21;}\n", | |
".cython.score-68 {background-color: #FFFF20;}\n", | |
".cython.score-69 {background-color: #FFFF20;}\n", | |
".cython.score-70 {background-color: #FFFF1f;}\n", | |
".cython.score-71 {background-color: #FFFF1f;}\n", | |
".cython.score-72 {background-color: #FFFF1f;}\n", | |
".cython.score-73 {background-color: #FFFF1e;}\n", | |
".cython.score-74 {background-color: #FFFF1e;}\n", | |
".cython.score-75 {background-color: #FFFF1e;}\n", | |
".cython.score-76 {background-color: #FFFF1d;}\n", | |
".cython.score-77 {background-color: #FFFF1d;}\n", | |
".cython.score-78 {background-color: #FFFF1c;}\n", | |
".cython.score-79 {background-color: #FFFF1c;}\n", | |
".cython.score-80 {background-color: #FFFF1c;}\n", | |
".cython.score-81 {background-color: #FFFF1c;}\n", | |
".cython.score-82 {background-color: #FFFF1b;}\n", | |
".cython.score-83 {background-color: #FFFF1b;}\n", | |
".cython.score-84 {background-color: #FFFF1b;}\n", | |
".cython.score-85 {background-color: #FFFF1a;}\n", | |
".cython.score-86 {background-color: #FFFF1a;}\n", | |
".cython.score-87 {background-color: #FFFF1a;}\n", | |
".cython.score-88 {background-color: #FFFF1a;}\n", | |
".cython.score-89 {background-color: #FFFF19;}\n", | |
".cython.score-90 {background-color: #FFFF19;}\n", | |
".cython.score-91 {background-color: #FFFF19;}\n", | |
".cython.score-92 {background-color: #FFFF19;}\n", | |
".cython.score-93 {background-color: #FFFF18;}\n", | |
".cython.score-94 {background-color: #FFFF18;}\n", | |
".cython.score-95 {background-color: #FFFF18;}\n", | |
".cython.score-96 {background-color: #FFFF18;}\n", | |
".cython.score-97 {background-color: #FFFF17;}\n", | |
".cython.score-98 {background-color: #FFFF17;}\n", | |
".cython.score-99 {background-color: #FFFF17;}\n", | |
".cython.score-100 {background-color: #FFFF17;}\n", | |
".cython.score-101 {background-color: #FFFF16;}\n", | |
".cython.score-102 {background-color: #FFFF16;}\n", | |
".cython.score-103 {background-color: #FFFF16;}\n", | |
".cython.score-104 {background-color: #FFFF16;}\n", | |
".cython.score-105 {background-color: #FFFF16;}\n", | |
".cython.score-106 {background-color: #FFFF15;}\n", | |
".cython.score-107 {background-color: #FFFF15;}\n", | |
".cython.score-108 {background-color: #FFFF15;}\n", | |
".cython.score-109 {background-color: #FFFF15;}\n", | |
".cython.score-110 {background-color: #FFFF15;}\n", | |
".cython.score-111 {background-color: #FFFF15;}\n", | |
".cython.score-112 {background-color: #FFFF14;}\n", | |
".cython.score-113 {background-color: #FFFF14;}\n", | |
".cython.score-114 {background-color: #FFFF14;}\n", | |
".cython.score-115 {background-color: #FFFF14;}\n", | |
".cython.score-116 {background-color: #FFFF14;}\n", | |
".cython.score-117 {background-color: #FFFF14;}\n", | |
".cython.score-118 {background-color: #FFFF13;}\n", | |
".cython.score-119 {background-color: #FFFF13;}\n", | |
".cython.score-120 {background-color: #FFFF13;}\n", | |
".cython.score-121 {background-color: #FFFF13;}\n", | |
".cython.score-122 {background-color: #FFFF13;}\n", | |
".cython.score-123 {background-color: #FFFF13;}\n", | |
".cython.score-124 {background-color: #FFFF13;}\n", | |
".cython.score-125 {background-color: #FFFF12;}\n", | |
".cython.score-126 {background-color: #FFFF12;}\n", | |
".cython.score-127 {background-color: #FFFF12;}\n", | |
".cython.score-128 {background-color: #FFFF12;}\n", | |
".cython.score-129 {background-color: #FFFF12;}\n", | |
".cython.score-130 {background-color: #FFFF12;}\n", | |
".cython.score-131 {background-color: #FFFF12;}\n", | |
".cython.score-132 {background-color: #FFFF11;}\n", | |
".cython.score-133 {background-color: #FFFF11;}\n", | |
".cython.score-134 {background-color: #FFFF11;}\n", | |
".cython.score-135 {background-color: #FFFF11;}\n", | |
".cython.score-136 {background-color: #FFFF11;}\n", | |
".cython.score-137 {background-color: #FFFF11;}\n", | |
".cython.score-138 {background-color: #FFFF11;}\n", | |
".cython.score-139 {background-color: #FFFF11;}\n", | |
".cython.score-140 {background-color: #FFFF11;}\n", | |
".cython.score-141 {background-color: #FFFF10;}\n", | |
".cython.score-142 {background-color: #FFFF10;}\n", | |
".cython.score-143 {background-color: #FFFF10;}\n", | |
".cython.score-144 {background-color: #FFFF10;}\n", | |
".cython.score-145 {background-color: #FFFF10;}\n", | |
".cython.score-146 {background-color: #FFFF10;}\n", | |
".cython.score-147 {background-color: #FFFF10;}\n", | |
".cython.score-148 {background-color: #FFFF10;}\n", | |
".cython.score-149 {background-color: #FFFF10;}\n", | |
".cython.score-150 {background-color: #FFFF0f;}\n", | |
".cython.score-151 {background-color: #FFFF0f;}\n", | |
".cython.score-152 {background-color: #FFFF0f;}\n", | |
".cython.score-153 {background-color: #FFFF0f;}\n", | |
".cython.score-154 {background-color: #FFFF0f;}\n", | |
".cython.score-155 {background-color: #FFFF0f;}\n", | |
".cython.score-156 {background-color: #FFFF0f;}\n", | |
".cython.score-157 {background-color: #FFFF0f;}\n", | |
".cython.score-158 {background-color: #FFFF0f;}\n", | |
".cython.score-159 {background-color: #FFFF0f;}\n", | |
".cython.score-160 {background-color: #FFFF0f;}\n", | |
".cython.score-161 {background-color: #FFFF0e;}\n", | |
".cython.score-162 {background-color: #FFFF0e;}\n", | |
".cython.score-163 {background-color: #FFFF0e;}\n", | |
".cython.score-164 {background-color: #FFFF0e;}\n", | |
".cython.score-165 {background-color: #FFFF0e;}\n", | |
".cython.score-166 {background-color: #FFFF0e;}\n", | |
".cython.score-167 {background-color: #FFFF0e;}\n", | |
".cython.score-168 {background-color: #FFFF0e;}\n", | |
".cython.score-169 {background-color: #FFFF0e;}\n", | |
".cython.score-170 {background-color: #FFFF0e;}\n", | |
".cython.score-171 {background-color: #FFFF0e;}\n", | |
".cython.score-172 {background-color: #FFFF0e;}\n", | |
".cython.score-173 {background-color: #FFFF0d;}\n", | |
".cython.score-174 {background-color: #FFFF0d;}\n", | |
".cython.score-175 {background-color: #FFFF0d;}\n", | |
".cython.score-176 {background-color: #FFFF0d;}\n", | |
".cython.score-177 {background-color: #FFFF0d;}\n", | |
".cython.score-178 {background-color: #FFFF0d;}\n", | |
".cython.score-179 {background-color: #FFFF0d;}\n", | |
".cython.score-180 {background-color: #FFFF0d;}\n", | |
".cython.score-181 {background-color: #FFFF0d;}\n", | |
".cython.score-182 {background-color: #FFFF0d;}\n", | |
".cython.score-183 {background-color: #FFFF0d;}\n", | |
".cython.score-184 {background-color: #FFFF0d;}\n", | |
".cython.score-185 {background-color: #FFFF0d;}\n", | |
".cython.score-186 {background-color: #FFFF0d;}\n", | |
".cython.score-187 {background-color: #FFFF0c;}\n", | |
".cython.score-188 {background-color: #FFFF0c;}\n", | |
".cython.score-189 {background-color: #FFFF0c;}\n", | |
".cython.score-190 {background-color: #FFFF0c;}\n", | |
".cython.score-191 {background-color: #FFFF0c;}\n", | |
".cython.score-192 {background-color: #FFFF0c;}\n", | |
".cython.score-193 {background-color: #FFFF0c;}\n", | |
".cython.score-194 {background-color: #FFFF0c;}\n", | |
".cython.score-195 {background-color: #FFFF0c;}\n", | |
".cython.score-196 {background-color: #FFFF0c;}\n", | |
".cython.score-197 {background-color: #FFFF0c;}\n", | |
".cython.score-198 {background-color: #FFFF0c;}\n", | |
".cython.score-199 {background-color: #FFFF0c;}\n", | |
".cython.score-200 {background-color: #FFFF0c;}\n", | |
".cython.score-201 {background-color: #FFFF0c;}\n", | |
".cython.score-202 {background-color: #FFFF0c;}\n", | |
".cython.score-203 {background-color: #FFFF0b;}\n", | |
".cython.score-204 {background-color: #FFFF0b;}\n", | |
".cython.score-205 {background-color: #FFFF0b;}\n", | |
".cython.score-206 {background-color: #FFFF0b;}\n", | |
".cython.score-207 {background-color: #FFFF0b;}\n", | |
".cython.score-208 {background-color: #FFFF0b;}\n", | |
".cython.score-209 {background-color: #FFFF0b;}\n", | |
".cython.score-210 {background-color: #FFFF0b;}\n", | |
".cython.score-211 {background-color: #FFFF0b;}\n", | |
".cython.score-212 {background-color: #FFFF0b;}\n", | |
".cython.score-213 {background-color: #FFFF0b;}\n", | |
".cython.score-214 {background-color: #FFFF0b;}\n", | |
".cython.score-215 {background-color: #FFFF0b;}\n", | |
".cython.score-216 {background-color: #FFFF0b;}\n", | |
".cython.score-217 {background-color: #FFFF0b;}\n", | |
".cython.score-218 {background-color: #FFFF0b;}\n", | |
".cython.score-219 {background-color: #FFFF0b;}\n", | |
".cython.score-220 {background-color: #FFFF0b;}\n", | |
".cython.score-221 {background-color: #FFFF0b;}\n", | |
".cython.score-222 {background-color: #FFFF0a;}\n", | |
".cython.score-223 {background-color: #FFFF0a;}\n", | |
".cython.score-224 {background-color: #FFFF0a;}\n", | |
".cython.score-225 {background-color: #FFFF0a;}\n", | |
".cython.score-226 {background-color: #FFFF0a;}\n", | |
".cython.score-227 {background-color: #FFFF0a;}\n", | |
".cython.score-228 {background-color: #FFFF0a;}\n", | |
".cython.score-229 {background-color: #FFFF0a;}\n", | |
".cython.score-230 {background-color: #FFFF0a;}\n", | |
".cython.score-231 {background-color: #FFFF0a;}\n", | |
".cython.score-232 {background-color: #FFFF0a;}\n", | |
".cython.score-233 {background-color: #FFFF0a;}\n", | |
".cython.score-234 {background-color: #FFFF0a;}\n", | |
".cython.score-235 {background-color: #FFFF0a;}\n", | |
".cython.score-236 {background-color: #FFFF0a;}\n", | |
".cython.score-237 {background-color: #FFFF0a;}\n", | |
".cython.score-238 {background-color: #FFFF0a;}\n", | |
".cython.score-239 {background-color: #FFFF0a;}\n", | |
".cython.score-240 {background-color: #FFFF0a;}\n", | |
".cython.score-241 {background-color: #FFFF0a;}\n", | |
".cython.score-242 {background-color: #FFFF0a;}\n", | |
".cython.score-243 {background-color: #FFFF0a;}\n", | |
".cython.score-244 {background-color: #FFFF0a;}\n", | |
".cython.score-245 {background-color: #FFFF0a;}\n", | |
".cython.score-246 {background-color: #FFFF09;}\n", | |
".cython.score-247 {background-color: #FFFF09;}\n", | |
".cython.score-248 {background-color: #FFFF09;}\n", | |
".cython.score-249 {background-color: #FFFF09;}\n", | |
".cython.score-250 {background-color: #FFFF09;}\n", | |
".cython.score-251 {background-color: #FFFF09;}\n", | |
".cython.score-252 {background-color: #FFFF09;}\n", | |
".cython.score-253 {background-color: #FFFF09;}\n", | |
".cython.score-254 {background-color: #FFFF09;}\n", | |
".cython .hll { background-color: #ffffcc }\n", | |
".cython { background: #f8f8f8; }\n", | |
".cython .c { color: #408080; font-style: italic } /* Comment */\n", | |
".cython .err { border: 1px solid #FF0000 } /* Error */\n", | |
".cython .k { color: #008000; font-weight: bold } /* Keyword */\n", | |
".cython .o { color: #666666 } /* Operator */\n", | |
".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", | |
".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n", | |
".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", | |
".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n", | |
".cython .gd { color: #A00000 } /* Generic.Deleted */\n", | |
".cython .ge { font-style: italic } /* Generic.Emph */\n", | |
".cython .gr { color: #FF0000 } /* Generic.Error */\n", | |
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", | |
".cython .gi { color: #00A000 } /* Generic.Inserted */\n", | |
".cython .go { color: #888888 } /* Generic.Output */\n", | |
".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", | |
".cython .gs { font-weight: bold } /* Generic.Strong */\n", | |
".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", | |
".cython .gt { color: #0044DD } /* Generic.Traceback */\n", | |
".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n", | |
".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n", | |
".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n", | |
".cython .kp { color: #008000 } /* Keyword.Pseudo */\n", | |
".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n", | |
".cython .kt { color: #B00040 } /* Keyword.Type */\n", | |
".cython .m { color: #666666 } /* Literal.Number */\n", | |
".cython .s { color: #BA2121 } /* Literal.String */\n", | |
".cython .na { color: #7D9029 } /* Name.Attribute */\n", | |
".cython .nb { color: #008000 } /* Name.Builtin */\n", | |
".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", | |
".cython .no { color: #880000 } /* Name.Constant */\n", | |
".cython .nd { color: #AA22FF } /* Name.Decorator */\n", | |
".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", | |
".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", | |
".cython .nf { color: #0000FF } /* Name.Function */\n", | |
".cython .nl { color: #A0A000 } /* Name.Label */\n", | |
".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", | |
".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", | |
".cython .nv { color: #19177C } /* Name.Variable */\n", | |
".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n", | |
".cython .w { color: #bbbbbb } /* Text.Whitespace */\n", | |
".cython .mb { color: #666666 } /* Literal.Number.Bin */\n", | |
".cython .mf { color: #666666 } /* Literal.Number.Float */\n", | |
".cython .mh { color: #666666 } /* Literal.Number.Hex */\n", | |
".cython .mi { color: #666666 } /* Literal.Number.Integer */\n", | |
".cython .mo { color: #666666 } /* Literal.Number.Oct */\n", | |
".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n", | |
".cython .sc { color: #BA2121 } /* Literal.String.Char */\n", | |
".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", | |
".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n", | |
".cython .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", | |
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", | |
".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", | |
".cython .sx { color: #008000 } /* Literal.String.Other */\n", | |
".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n", | |
".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n", | |
".cython .ss { color: #19177C } /* Literal.String.Symbol */\n", | |
".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", | |
".cython .vc { color: #19177C } /* Name.Variable.Class */\n", | |
".cython .vg { color: #19177C } /* Name.Variable.Global */\n", | |
".cython .vi { color: #19177C } /* Name.Variable.Instance */\n", | |
".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n", | |
" </style>\n", | |
" <script>\n", | |
" function toggleDiv(id) {\n", | |
" theDiv = id.nextElementSibling\n", | |
" if (theDiv.style.display != 'block') theDiv.style.display = 'block';\n", | |
" else theDiv.style.display = 'none';\n", | |
" }\n", | |
" </script>\n", | |
"</head>\n", | |
"<body class=\"cython\">\n", | |
"<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.23.4</span></p>\n", | |
"<p>\n", | |
" <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n", | |
" Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n", | |
"</p>\n", | |
"<div class=\"cython\"><pre class=\"cython line score-0\"> <span class=\"\">01</span>: </pre>\n", | |
"<pre class=\"cython line score-11\" onclick='toggleDiv(this)'>+<span class=\"\">02</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class='cython code score-11 '> __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">03</span>: <span class=\"k\">from</span> <span class=\"nn\">cpython</span> <span class=\"k\">cimport</span> <span class=\"n\">array</span></pre>\n", | |
"<pre class=\"cython line score-8\" onclick='toggleDiv(this)'>+<span class=\"\">04</span>: <span class=\"k\">import</span> <span class=\"nn\">array</span></pre>\n", | |
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_array, 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_array, __pyx_t_1) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">05</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"math.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"n\">double</span> <span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">double</span> <span class=\"n\">x</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick='toggleDiv(this)'>+<span class=\"\">10</span>: <span class=\"k\">cdef</span> <span class=\"nf\">_conditional_entropy_cython</span><span class=\"p\">(</span><span class=\"nb\">long</span> <span class=\"o\">*</span> <span class=\"n\">X</span><span class=\"p\">,</span> <span class=\"nb\">long</span> <span class=\"o\">*</span> <span class=\"n\">Y</span><span class=\"p\">,</span> <span class=\"nb\">int</span> <span class=\"n\">N</span><span class=\"p\">,</span> <span class=\"nb\">int</span> <span class=\"n\">M</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-6 '>static PyObject *__pyx_f_46_cython_magic_713780f76e023b2fc37b50d30bf4f852__conditional_entropy_cython(long *__pyx_v_X, long *__pyx_v_Y, int __pyx_v_N, int __pyx_v_M) {\n", | |
" long __pyx_v_Y_max;\n", | |
" long __pyx_v_X_max;\n", | |
" int __pyx_v_i;\n", | |
" int __pyx_v_j;\n", | |
" int __pyx_v_k;\n", | |
" float __pyx_v_ce_sum;\n", | |
" float __pyx_v_ce_sum_partial;\n", | |
" int __pyx_v_x;\n", | |
" int __pyx_v_y;\n", | |
" float __pyx_v_count_sum;\n", | |
" float __pyx_v_prob;\n", | |
" float __pyx_v_total;\n", | |
" arrayobject *__pyx_v_Y_dist = 0;\n", | |
" arrayobject *__pyx_v_counts = 0;\n", | |
" CYTHON_UNUSED long __pyx_v__;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"_conditional_entropy_cython\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_7);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_713780f76e023b2fc37b50d30bf4f852._conditional_entropy_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = 0;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_Y_dist);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_counts);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">11</span>: <span class=\"k\">cdef</span> <span class=\"kt\">long</span> <span class=\"nf\">Y_max</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">X_max</span><span class=\"o\">=</span><span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_Y_max = 0;\n", | |
" __pyx_v_X_max = 0;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">12</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">i</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">j</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"o\">=</span><span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_i = 0;\n", | |
" __pyx_v_j = 0;\n", | |
" __pyx_v_k = 0;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">13</span>: <span class=\"k\">cdef</span> <span class=\"kt\">float</span> <span class=\"nf\">ce_sum</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">ce_sum_partial</span><span class=\"o\">=</span><span class=\"mf\">0.</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ce_sum = 0.0;\n", | |
" __pyx_v_ce_sum_partial = 0.;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">14</span>: <span class=\"k\">cdef</span> <span class=\"kt\">int</span> <span class=\"nf\">x</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">y</span><span class=\"o\">=</span><span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_x = 0;\n", | |
" __pyx_v_y = 0;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">15</span>: <span class=\"k\">cdef</span> <span class=\"kt\">float</span> <span class=\"nf\">count_sum</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">prob</span><span class=\"o\">=</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"n\">total</span><span class=\"o\">=</span><span class=\"mf\">0.</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_count_sum = 0.0;\n", | |
" __pyx_v_prob = 0.0;\n", | |
" __pyx_v_total = 0.;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">16</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">17</span>: <span class=\"c\"># Calculate distribution of Y and maxes</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">18</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_1 = __pyx_v_N;\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n", | |
" __pyx_v_i = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">19</span>: <span class=\"n\">Y_max</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">Y_max</span><span class=\"p\">,</span> <span class=\"n\">Y</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">])</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_3 = (__pyx_v_Y[__pyx_v_i]);\n", | |
" __pyx_t_4 = __pyx_v_Y_max;\n", | |
" if (((__pyx_t_3 > __pyx_t_4) != 0)) {\n", | |
" __pyx_t_5 = __pyx_t_3;\n", | |
" } else {\n", | |
" __pyx_t_5 = __pyx_t_4;\n", | |
" }\n", | |
" __pyx_v_Y_max = __pyx_t_5;\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">20</span>: </pre>\n", | |
"<pre class=\"cython line score-18\" onclick='toggleDiv(this)'>+<span class=\"\">21</span>: <span class=\"k\">cdef</span> <span class=\"kt\">array</span>.<span class=\"kt\">array</span> <span class=\"nf\">Y_dist</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"s\">'f'</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mf\">0</span> <span class=\"k\">for</span> <span class=\"n\">_</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)])</span></pre>\n", | |
"<pre class='cython code score-18 '> __pyx_t_6 = <span class='py_c_api'>PyList_New</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_5 = (__pyx_v_Y_max + 1);\n", | |
" for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_5; __pyx_t_3+=1) {\n", | |
" __pyx_v__ = __pyx_t_3;\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_ListComp_Append</span>(__pyx_t_6, (PyObject*)__pyx_int_0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_t_7 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_n_s_f);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_f);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 0, __pyx_n_s_f);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 1, __pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(((PyObject *)__pyx_ptype_7cpython_5array_array), __pyx_t_7, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0;\n", | |
" __pyx_v_Y_dist = ((arrayobject *)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-18\" onclick='toggleDiv(this)'>+<span class=\"\">22</span>: <span class=\"k\">cdef</span> <span class=\"kt\">array</span>.<span class=\"kt\">array</span> <span class=\"nf\">counts</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">array</span><span class=\"p\">(</span><span class=\"s\">'f'</span><span class=\"p\">,</span> <span class=\"p\">[</span><span class=\"mf\">0</span> <span class=\"k\">for</span> <span class=\"n\">_</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">((</span><span class=\"n\">X_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">))])</span></pre>\n", | |
"<pre class='cython code score-18 '> __pyx_t_6 = <span class='py_c_api'>PyList_New</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_5 = ((__pyx_v_X_max + 1) * (__pyx_v_Y_max + 1));\n", | |
" for (__pyx_t_3 = 0; __pyx_t_3 < __pyx_t_5; __pyx_t_3+=1) {\n", | |
" __pyx_v__ = __pyx_t_3;\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_ListComp_Append</span>(__pyx_t_6, (PyObject*)__pyx_int_0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_t_7 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_7);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_n_s_f);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_f);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 0, __pyx_n_s_f);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_6);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_7, 1, __pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(((PyObject *)__pyx_ptype_7cpython_5array_array), __pyx_t_7, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 22; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_7); __pyx_t_7 = 0;\n", | |
" __pyx_v_counts = ((arrayobject *)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">23</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">24</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_1 = __pyx_v_N;\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n", | |
" __pyx_v_i = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">25</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">M</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_M;\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {\n", | |
" __pyx_v_j = __pyx_t_9;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">26</span>: <span class=\"n\">X_max</span> <span class=\"o\">=</span> <span class=\"nb\">max</span><span class=\"p\">(</span><span class=\"n\">X_max</span><span class=\"p\">,</span> <span class=\"n\">X</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"o\">*</span><span class=\"n\">M</span> <span class=\"o\">+</span> <span class=\"n\">j</span><span class=\"p\">])</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_5 = (__pyx_v_X[((__pyx_v_i * __pyx_v_M) + __pyx_v_j)]);\n", | |
" __pyx_t_3 = __pyx_v_X_max;\n", | |
" if (((__pyx_t_5 > __pyx_t_3) != 0)) {\n", | |
" __pyx_t_4 = __pyx_t_5;\n", | |
" } else {\n", | |
" __pyx_t_4 = __pyx_t_3;\n", | |
" }\n", | |
" __pyx_v_X_max = __pyx_t_4;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">27</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">28</span>: <span class=\"k\">for</span> <span class=\"n\">y</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_Y_max + 1);\n", | |
" for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) {\n", | |
" __pyx_v_y = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">29</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_2 = __pyx_v_N;\n", | |
" for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_2; __pyx_t_8+=1) {\n", | |
" __pyx_v_i = __pyx_t_8;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">30</span>: <span class=\"k\">if</span> <span class=\"n\">Y</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">y</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_10 = (((__pyx_v_Y[__pyx_v_i]) == __pyx_v_y) != 0);\n", | |
" if (__pyx_t_10) {\n", | |
"/* … */\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">31</span>: <span class=\"n\">Y_dist</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">+=</span> <span class=\"mf\">1</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_9 = __pyx_v_y;\n", | |
" (__pyx_v_Y_dist->data.as_floats[__pyx_t_9]) = ((__pyx_v_Y_dist->data.as_floats[__pyx_t_9]) + 1.0);\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">32</span>: <span class=\"n\">total</span> <span class=\"o\">+=</span> <span class=\"n\">Y_dist</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_total = (__pyx_v_total + (__pyx_v_Y_dist->data.as_floats[__pyx_v_y]));\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">33</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">34</span>: <span class=\"k\">for</span> <span class=\"n\">y</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_Y_max + 1);\n", | |
" for (__pyx_t_1 = 0; __pyx_t_1 < __pyx_t_4; __pyx_t_1+=1) {\n", | |
" __pyx_v_y = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">35</span>: <span class=\"n\">Y_dist</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span> <span class=\"o\">/=</span> <span class=\"n\">total</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_2 = __pyx_v_y;\n", | |
" if (unlikely(__pyx_v_total == 0)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_ZeroDivisionError, \"float division\");\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" (__pyx_v_Y_dist->data.as_floats[__pyx_t_2]) = ((__pyx_v_Y_dist->data.as_floats[__pyx_t_2]) / __pyx_v_total);\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">36</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">37</span>: <span class=\"n\">ce_sum</span> <span class=\"o\">=</span> <span class=\"mf\">0.</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ce_sum = 0.;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">38</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">M</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_1 = __pyx_v_M;\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) {\n", | |
" __pyx_v_i = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">39</span>: <span class=\"n\">ce_sum_partial</span> <span class=\"o\">=</span> <span class=\"mf\">0.</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ce_sum_partial = 0.;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">40</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">41</span>: <span class=\"c\"># Zero out count (could be done using memset)</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">42</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">X_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_X_max + 1);\n", | |
" for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_4; __pyx_t_8+=1) {\n", | |
" __pyx_v_j = __pyx_t_8;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">43</span>: <span class=\"k\">for</span> <span class=\"n\">k</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_5 = (__pyx_v_Y_max + 1);\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_5; __pyx_t_9+=1) {\n", | |
" __pyx_v_k = __pyx_t_9;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">44</span>: <span class=\"n\">counts</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">j</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">k</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> (__pyx_v_counts->data.as_floats[((__pyx_v_j * (__pyx_v_Y_max + 1)) + __pyx_v_k)]) = 0.0;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">45</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">46</span>: <span class=\"c\"># Calculate count</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">47</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_8 = __pyx_v_N;\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {\n", | |
" __pyx_v_j = __pyx_t_9;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">48</span>: <span class=\"n\">x</span> <span class=\"o\">=</span> <span class=\"n\">X</span><span class=\"p\">[</span><span class=\"n\">j</span> <span class=\"o\">*</span> <span class=\"n\">M</span> <span class=\"o\">+</span> <span class=\"n\">i</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_x = (__pyx_v_X[((__pyx_v_j * __pyx_v_M) + __pyx_v_i)]);\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">49</span>: <span class=\"n\">counts</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">x</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">Y</span><span class=\"p\">[</span><span class=\"n\">j</span><span class=\"p\">]]</span> <span class=\"o\">+=</span> <span class=\"mf\">1</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_4 = ((__pyx_v_x * (__pyx_v_Y_max + 1)) + (__pyx_v_Y[__pyx_v_j]));\n", | |
" (__pyx_v_counts->data.as_floats[__pyx_t_4]) = ((__pyx_v_counts->data.as_floats[__pyx_t_4]) + 1.0);\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">50</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">51</span>: <span class=\"c\"># For each value of y add conditional probability</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">52</span>: <span class=\"k\">for</span> <span class=\"n\">y</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_4 = (__pyx_v_Y_max + 1);\n", | |
" for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_4; __pyx_t_8+=1) {\n", | |
" __pyx_v_y = __pyx_t_8;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">53</span>: <span class=\"n\">count_sum</span> <span class=\"o\">=</span> <span class=\"mf\">0.</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_count_sum = 0.;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">54</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">N</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_9 = __pyx_v_N;\n", | |
" for (__pyx_t_11 = 0; __pyx_t_11 < __pyx_t_9; __pyx_t_11+=1) {\n", | |
" __pyx_v_j = __pyx_t_11;\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">55</span>: <span class=\"n\">count_sum</span> <span class=\"o\">+=</span> <span class=\"n\">counts</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">j</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">y</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_count_sum = (__pyx_v_count_sum + (__pyx_v_counts->data.as_floats[((__pyx_v_j * (__pyx_v_Y_max + 1)) + __pyx_v_y)]));\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">56</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">57</span>: <span class=\"k\">for</span> <span class=\"n\">j</span> <span class=\"ow\">in</span> <span class=\"nb\">range</span><span class=\"p\">(</span><span class=\"n\">X_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_5 = (__pyx_v_X_max + 1);\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_5; __pyx_t_9+=1) {\n", | |
" __pyx_v_j = __pyx_t_9;\n", | |
"</pre><pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">58</span>: <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"n\">counts</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">j</span> <span class=\"o\">*</span> <span class=\"p\">(</span><span class=\"n\">Y_max</span> <span class=\"o\">+</span> <span class=\"mf\">1</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">y</span><span class=\"p\">]</span><span class=\"o\">/</span><span class=\"n\">count_sum</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_12 = (__pyx_v_counts->data.as_floats[((__pyx_v_j * (__pyx_v_Y_max + 1)) + __pyx_v_y)]);\n", | |
" if (unlikely(__pyx_v_count_sum == 0)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_ZeroDivisionError, \"float division\");\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_v_prob = (__pyx_t_12 / __pyx_v_count_sum);\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">59</span>: <span class=\"k\">if</span> <span class=\"n\">prob</span> <span class=\"o\"><</span> <span class=\"mf\">0.0001</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_10 = ((__pyx_v_prob < 0.0001) != 0);\n", | |
" if (__pyx_t_10) {\n", | |
"/* … */\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">60</span>: <span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"mf\">0.0001</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_prob = 0.0001;\n", | |
"</pre><pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">61</span>: <span class=\"n\">ce_sum_partial</span> <span class=\"o\">+=</span> <span class=\"o\">-</span><span class=\"n\">prob</span> <span class=\"o\">*</span> <span class=\"n\">log</span><span class=\"p\">(</span><span class=\"n\">prob</span><span class=\"p\">)</span><span class=\"o\">/</span><span class=\"n\">log</span><span class=\"p\">(</span><span class=\"mf\">2.</span><span class=\"p\">)</span><span class=\"o\">*</span> <span class=\"n\">Y_dist</span><span class=\"o\">.</span><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"n\">as_floats</span><span class=\"p\">[</span><span class=\"n\">y</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-5 '> __pyx_t_13 = ((-__pyx_v_prob) * log(__pyx_v_prob));\n", | |
" __pyx_t_14 = log(2.);\n", | |
" if (unlikely(__pyx_t_14 == 0)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_ZeroDivisionError, \"float division\");\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 61; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_v_ce_sum_partial = (__pyx_v_ce_sum_partial + ((__pyx_t_13 / __pyx_t_14) * (__pyx_v_Y_dist->data.as_floats[__pyx_v_y])));\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">62</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick='toggleDiv(this)'>+<span class=\"\">63</span>: <span class=\"n\">ce_sum</span> <span class=\"o\">+=</span> <span class=\"n\">ce_sum_partial</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ce_sum = (__pyx_v_ce_sum + __pyx_v_ce_sum_partial);\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">64</span>: </pre>\n", | |
"<pre class=\"cython line score-6\" onclick='toggleDiv(this)'>+<span class=\"\">65</span>: <span class=\"k\">return</span> <span class=\"n\">ce_sum</span></pre>\n", | |
"<pre class='cython code score-6 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_6 = <span class='py_c_api'>PyFloat_FromDouble</span>(__pyx_v_ce_sum);<span class='error_goto'> if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 65; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_r = __pyx_t_6;\n", | |
" __pyx_t_6 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">66</span>: </pre>\n", | |
"<pre class=\"cython line score-64\" onclick='toggleDiv(this)'>+<span class=\"\">67</span>: <span class=\"k\">def</span> <span class=\"nf\">conditional_entropy_cython</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">[</span><span class=\"nb\">long</span><span class=\"p\">,</span> <span class=\"n\">ndim</span><span class=\"o\">=</span><span class=\"mf\">2</span><span class=\"p\">,</span> <span class=\"n\">mode</span><span class=\"o\">=</span><span class=\"s\">"c"</span><span class=\"p\">]</span> <span class=\"n\">X</span><span class=\"p\">,</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">[</span><span class=\"nb\">long</span><span class=\"p\">,</span> <span class=\"n\">ndim</span><span class=\"o\">=</span><span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"n\">mode</span><span class=\"o\">=</span><span class=\"s\">"c"</span><span class=\"p\">]</span> <span class=\"n\">Y</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-64 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_1conditional_entropy_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static char __pyx_doc_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_conditional_entropy_cython[] = \" \\n Calculate conditional entropy of all columns of X against Y (i.e. \\\\sum_i=1^{N} H(X_i | Y)).\\n \";\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_1conditional_entropy_cython = {\"conditional_entropy_cython\", (PyCFunction)__pyx_pw_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_1conditional_entropy_cython, METH_VARARGS|METH_KEYWORDS, __pyx_doc_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_conditional_entropy_cython};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_1conditional_entropy_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" PyArrayObject *__pyx_v_X = 0;\n", | |
" PyArrayObject *__pyx_v_Y = 0;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"conditional_entropy_cython (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_X,&__pyx_n_s_Y,0};\n", | |
" PyObject* values[2] = {0,0};\n", | |
" if (unlikely(__pyx_kwds)) {\n", | |
" Py_ssize_t kw_args;\n", | |
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n", | |
" switch (pos_args) {\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" case 0: break;\n", | |
" default: goto __pyx_L5_argtuple_error;\n", | |
" }\n", | |
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n", | |
" switch (pos_args) {\n", | |
" case 0:\n", | |
" if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_X)) != 0)) kw_args--;\n", | |
" else goto __pyx_L5_argtuple_error;\n", | |
" case 1:\n", | |
" if (likely((values[1] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s_Y)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"conditional_entropy_cython\", 1, 2, 2, 1); <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n", | |
" }\n", | |
" }\n", | |
" if (unlikely(kw_args > 0)) {\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"conditional_entropy_cython\") < 0)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n", | |
" goto __pyx_L5_argtuple_error;\n", | |
" } else {\n", | |
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" }\n", | |
" __pyx_v_X = ((PyArrayObject *)values[0]);\n", | |
" __pyx_v_Y = ((PyArrayObject *)values[1]);\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"conditional_entropy_cython\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_713780f76e023b2fc37b50d30bf4f852.conditional_entropy_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_X), __pyx_ptype_5numpy_ndarray, 1, \"X\", 0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_Y), __pyx_ptype_5numpy_ndarray, 1, \"Y\", 0))) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_conditional_entropy_cython(__pyx_self, __pyx_v_X, __pyx_v_Y);\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_conditional_entropy_cython(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_X, PyArrayObject *__pyx_v_Y) {\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_X;\n", | |
" __Pyx_Buffer __pyx_pybuffer_X;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_Y;\n", | |
" __Pyx_Buffer __pyx_pybuffer_Y;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"conditional_entropy_cython\", 0);\n", | |
" __pyx_pybuffer_X.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_X.refcount = 0;\n", | |
" __pyx_pybuffernd_X.data = NULL;\n", | |
" __pyx_pybuffernd_X.rcbuffer = &__pyx_pybuffer_X;\n", | |
" __pyx_pybuffer_Y.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_Y.refcount = 0;\n", | |
" __pyx_pybuffernd_Y.data = NULL;\n", | |
" __pyx_pybuffernd_Y.rcbuffer = &__pyx_pybuffer_Y;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_X.rcbuffer->pybuffer, (PyObject*)__pyx_v_X, &__Pyx_TypeInfo_long, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 2, 0, __pyx_stack) == -1)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_X.diminfo[0].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_X.diminfo[0].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_X.diminfo[1].strides = __pyx_pybuffernd_X.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_X.diminfo[1].shape = __pyx_pybuffernd_X.rcbuffer->pybuffer.shape[1];\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_Y.rcbuffer->pybuffer, (PyObject*)__pyx_v_Y, &__Pyx_TypeInfo_long, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_Y.diminfo[0].strides = __pyx_pybuffernd_Y.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_Y.diminfo[0].shape = __pyx_pybuffernd_Y.rcbuffer->pybuffer.shape[0];\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_X.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_713780f76e023b2fc37b50d30bf4f852.conditional_entropy_cython\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_X.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_Y.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"/* … */\n", | |
" __pyx_tuple__7 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_n_s_X, __pyx_n_s_Y);<span class='error_goto'> if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__7);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__7);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_713780f76e023b2fc37b50d30bf4f852_1conditional_entropy_cython, NULL, __pyx_n_s_cython_magic_713780f76e023b2fc3);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_conditional_entropy_cython, __pyx_t_1) < 0) <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 67; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">68</span>: <span class=\"sd\">""" </span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">69</span>: <span class=\"sd\"> Calculate conditional entropy of all columns of X against Y (i.e. \\sum_i=1^{N} H(X_i | Y)).</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">70</span>: <span class=\"sd\"> """</span></pre>\n", | |
"<pre class=\"cython line score-5\" onclick='toggleDiv(this)'>+<span class=\"\">71</span>: <span class=\"k\">return</span> <span class=\"n\">_conditional_entropy_cython</span><span class=\"p\">(</span><span class=\"o\">&</span><span class=\"n\">X</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span><span class=\"mf\">0</span><span class=\"p\">],</span> <span class=\"o\">&</span><span class=\"n\">Y</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">],</span> <span class=\"n\">X</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">],</span> <span class=\"n\">X</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">])</span></pre>\n", | |
"<pre class='cython code score-5 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_2 = 0;\n", | |
" __pyx_t_3 = -1;\n", | |
" if (__pyx_t_1 < 0) {\n", | |
" __pyx_t_1 += __pyx_pybuffernd_X.diminfo[0].shape;\n", | |
" if (unlikely(__pyx_t_1 < 0)) __pyx_t_3 = 0;\n", | |
" } else if (unlikely(__pyx_t_1 >= __pyx_pybuffernd_X.diminfo[0].shape)) __pyx_t_3 = 0;\n", | |
" if (__pyx_t_2 < 0) {\n", | |
" __pyx_t_2 += __pyx_pybuffernd_X.diminfo[1].shape;\n", | |
" if (unlikely(__pyx_t_2 < 0)) __pyx_t_3 = 1;\n", | |
" } else if (unlikely(__pyx_t_2 >= __pyx_pybuffernd_X.diminfo[1].shape)) __pyx_t_3 = 1;\n", | |
" if (unlikely(__pyx_t_3 != -1)) {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_3);\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_t_4 = 0;\n", | |
" __pyx_t_3 = -1;\n", | |
" if (__pyx_t_4 < 0) {\n", | |
" __pyx_t_4 += __pyx_pybuffernd_Y.diminfo[0].shape;\n", | |
" if (unlikely(__pyx_t_4 < 0)) __pyx_t_3 = 0;\n", | |
" } else if (unlikely(__pyx_t_4 >= __pyx_pybuffernd_Y.diminfo[0].shape)) __pyx_t_3 = 0;\n", | |
" if (unlikely(__pyx_t_3 != -1)) {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_3);\n", | |
" <span class='error_goto'>{__pyx_filename = __pyx_f[0]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" }\n", | |
" __pyx_t_5 = __pyx_f_46_cython_magic_713780f76e023b2fc37b50d30bf4f852__conditional_entropy_cython((&(*__Pyx_BufPtrCContig2d(long *, __pyx_pybuffernd_X.rcbuffer->pybuffer.buf, __pyx_t_1, __pyx_pybuffernd_X.diminfo[0].strides, __pyx_t_2, __pyx_pybuffernd_X.diminfo[1].strides))), (&(*__Pyx_BufPtrCContig1d(long *, __pyx_pybuffernd_Y.rcbuffer->pybuffer.buf, __pyx_t_4, __pyx_pybuffernd_Y.diminfo[0].strides))), (__pyx_v_X->dimensions[0]), (__pyx_v_X->dimensions[1]));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 71; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_r = __pyx_t_5;\n", | |
" __pyx_t_5 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 20, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython --annotate\n", | |
"\n", | |
"cimport numpy as np\n", | |
"from cpython cimport array\n", | |
"import array\n", | |
"\n", | |
"cdef extern from \"math.h\":\n", | |
" double log(double x)\n", | |
"\n", | |
"\n", | |
"cdef _conditional_entropy_cython(long * X, long * Y, int N, int M):\n", | |
" cdef long Y_max=0, X_max=0\n", | |
" cdef int i=0, j=0, k=0\n", | |
" cdef float ce_sum=0, ce_sum_partial=0.\n", | |
" cdef int x=0, y=0\n", | |
" cdef float count_sum=0, prob=0, total=0.\n", | |
" \n", | |
" # Calculate distribution of Y and maxes\n", | |
" for i in range(N):\n", | |
" Y_max = max(Y_max, Y[i])\n", | |
" \n", | |
" cdef array.array Y_dist = array.array('f', [0 for _ in range(Y_max + 1)])\n", | |
" cdef array.array counts = array.array('f', [0 for _ in range((X_max + 1)*(Y_max + 1))])\n", | |
" \n", | |
" for i in range(N):\n", | |
" for j in range(M):\n", | |
" X_max = max(X_max, X[i*M + j]) \n", | |
"\n", | |
" for y in range(Y_max + 1):\n", | |
" for i in range(N):\n", | |
" if Y[i] == y:\n", | |
" Y_dist.data.as_floats[y] += 1\n", | |
" total += Y_dist.data.as_floats[y]\n", | |
" \n", | |
" for y in range(Y_max + 1):\n", | |
" Y_dist.data.as_floats[y] /= total\n", | |
" \n", | |
" ce_sum = 0.\n", | |
" for i in range(M):\n", | |
" ce_sum_partial = 0.\n", | |
" \n", | |
" # Zero out count (could be done using memset)\n", | |
" for j in range(X_max + 1):\n", | |
" for k in range(Y_max + 1):\n", | |
" counts.data.as_floats[j * (Y_max + 1) + k] = 0\n", | |
" \n", | |
" # Calculate count\n", | |
" for j in range(N):\n", | |
" x = X[j * M + i]\n", | |
" counts.data.as_floats[x * (Y_max + 1) + Y[j]] += 1\n", | |
" \n", | |
" # For each value of y add conditional probability\n", | |
" for y in range(Y_max + 1):\n", | |
" count_sum = 0.\n", | |
" for j in range(N):\n", | |
" count_sum += counts.data.as_floats[j * (Y_max + 1) + y]\n", | |
" \n", | |
" for j in range(X_max + 1):\n", | |
" prob = counts.data.as_floats[j * (Y_max + 1) + y]/count_sum \n", | |
" if prob < 0.0001:\n", | |
" prob = 0.0001\n", | |
" ce_sum_partial += -prob * log(prob)/log(2.)* Y_dist.data.as_floats[y]\n", | |
"\n", | |
" ce_sum += ce_sum_partial\n", | |
" \n", | |
" return ce_sum\n", | |
"\n", | |
"def conditional_entropy_cython(np.ndarray[long, ndim=2, mode=\"c\"] X, np.ndarray[long, ndim=1, mode=\"c\"] Y):\n", | |
" \"\"\" \n", | |
" Calculate conditional entropy of all columns of X against Y (i.e. \\sum_i=1^{N} H(X_i | Y)).\n", | |
" \"\"\"\n", | |
" return _conditional_entropy_cython(&X[0,0], &Y[0], X.shape[0], X.shape[1])" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"collapsed": false | |
}, | |
"source": [ | |
"## Benchmark everything" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"1 loops, best of 3: 1.62 s per loop\n", | |
"100 loops, best of 3: 8.08 ms per loop\n", | |
"100 loops, best of 3: 7.3 ms per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit conditional_entropy_python(X, Y)\n", | |
"%timeit conditional_entropy_numba(X, Y)\n", | |
"%timeit conditional_entropy_cython(X, Y)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 520, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"100 loops, best of 3: 9.29 ms per loop\n" | |
] | |
} | |
], | |
"source": [ | |
"# Only 0.6ms faster, probably wasn't worth is.\n", | |
"# Warning: cython code has bug and returns different entropy, I didn't have patience to fix it" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.11" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment