Created
February 16, 2023 10:07
-
-
Save jjerphan/271caa16411f2e55a8aea1a4f6dcdeca to your computer and use it in GitHub Desktop.
OpenMP vs joblib Threading backend
This file contains hidden or 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": "markdown", | |
"id": "e660a867", | |
"metadata": {}, | |
"source": [ | |
"## OpenMP vs joblib Threading backend" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "8385fa67", | |
"metadata": {}, | |
"source": [ | |
"Let's compare OpenMP via Cython and joblib threading backend via a compute bound task (which uses GEMM) and a no-ops' tasks." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"id": "4a4b0803", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%load_ext Cython" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"id": "cf722482", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.33 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_7982e031ff248a54e9e902152fa3b2da.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", | |
"pre { line-height: 125%; }\n", | |
"td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", | |
"span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", | |
"td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", | |
"span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", | |
".cython .hll { background-color: #ffffcc }\n", | |
".cython { background: #f8f8f8; }\n", | |
".cython .c { color: #3D7B7B; 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 .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", | |
".cython .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", | |
".cython .cp { color: #9C6500 } /* Comment.Preproc */\n", | |
".cython .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", | |
".cython .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", | |
".cython .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", | |
".cython .gd { color: #A00000 } /* Generic.Deleted */\n", | |
".cython .ge { font-style: italic } /* Generic.Emph */\n", | |
".cython .gr { color: #E40000 } /* Generic.Error */\n", | |
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", | |
".cython .gi { color: #008400 } /* Generic.Inserted */\n", | |
".cython .go { color: #717171 } /* 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: #687822 } /* 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: #717171; font-weight: bold } /* Name.Entity */\n", | |
".cython .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", | |
".cython .nf { color: #0000FF } /* Name.Function */\n", | |
".cython .nl { color: #767600 } /* 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 .sa { color: #BA2121 } /* Literal.String.Affix */\n", | |
".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n", | |
".cython .sc { color: #BA2121 } /* Literal.String.Char */\n", | |
".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", | |
".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", | |
".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n", | |
".cython .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", | |
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", | |
".cython .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", | |
".cython .sx { color: #008000 } /* Literal.String.Other */\n", | |
".cython .sr { color: #A45A77 } /* 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 .fm { color: #0000FF } /* Name.Function.Magic */\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 .vm { color: #19177C } /* Name.Variable.Magic */\n", | |
".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n", | |
" </style>\n", | |
"</head>\n", | |
"<body class=\"cython\">\n", | |
"<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.29.33</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-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">01</span>: <span class=\"c\"># cython: boundscheck = False</span></pre>\n", | |
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __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_ERR(0, 1, __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=\"\">02</span>: <span class=\"c\"># distutils: define_macros=NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">03</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">04</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">cnp</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">openmp</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">from</span> <span class=\"nn\">cython</span> <span class=\"k\">cimport</span> <span class=\"n\">floating</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: <span class=\"k\">from</span> <span class=\"nn\">cython.parallel</span> <span class=\"k\">cimport</span> <span class=\"n\">prange</span><span class=\"p\">,</span> <span class=\"n\">parallel</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: <span class=\"k\">from</span> <span class=\"nn\">sklearn.utils._cython_blas</span> <span class=\"k\">cimport</span> <span class=\"n\">_gemm</span> <span class=\"k\">as</span> <span class=\"n\">cy_gemm</span><span class=\"p\">,</span> <span class=\"n\">BLAS_Order</span><span class=\"p\">,</span> <span class=\"n\">RowMajor</span><span class=\"p\">,</span> <span class=\"n\">ColMajor</span><span class=\"p\">,</span> <span class=\"n\">BLAS_Trans</span><span class=\"p\">,</span> <span class=\"n\">NoTrans</span><span class=\"p\">,</span> <span class=\"n\">Trans</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">10</span>: </pre>\n", | |
"<pre class=\"cython line score-19\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">11</span>: <span class=\"k\">from</span> <span class=\"nn\">threadpoolctl</span> <span class=\"k\">import</span> <span class=\"n\">threadpool_limits</span></pre>\n", | |
"<pre class='cython code score-19 '> __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_n_s_threadpool_limits);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_threadpool_limits);\n", | |
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, 0, __pyx_n_s_threadpool_limits);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_threadpoolctl, __pyx_t_1, 0);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_ImportFrom</span>(__pyx_t_2, __pyx_n_s_threadpool_limits);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __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_threadpool_limits, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 11, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">12</span>: </pre>\n", | |
"<pre class=\"cython line score-449\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">13</span>: <span class=\"k\">cpdef</span> <span class=\"kt\">void</span> <span class=\"nf\">gemm</span><span class=\"p\">(</span></pre>\n", | |
"<pre class='cython code score-449 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm = {\"gemm\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" PyObject *__pyx_v_signatures = 0;\n", | |
" PyObject *__pyx_v_args = 0;\n", | |
" PyObject *__pyx_v_kwargs = 0;\n", | |
" CYTHON_UNUSED PyObject *__pyx_v_defaults = 0;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fused_cpdef (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_signatures,&__pyx_n_s_args,&__pyx_n_s_kwargs,&__pyx_n_s_defaults,0};\n", | |
" PyObject* values[4] = {0,0,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 4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" CYTHON_FALLTHROUGH;\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='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_signatures)) != 0)) kw_args--;\n", | |
" else goto __pyx_L5_argtuple_error;\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1:\n", | |
" if (likely((values[1] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fused_cpdef\", 1, 4, 4, 1); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2:\n", | |
" if (likely((values[2] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fused_cpdef\", 1, 4, 4, 2); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3:\n", | |
" if (likely((values[3] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_defaults)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fused_cpdef\", 1, 4, 4, 3); <span class='error_goto'>__PYX_ERR(0, 13, __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, \"__pyx_fused_cpdef\") < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 4) {\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", | |
" values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" }\n", | |
" __pyx_v_signatures = values[0];\n", | |
" __pyx_v_args = values[1];\n", | |
" __pyx_v_kwargs = values[2];\n", | |
" __pyx_v_defaults = values[3];\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fused_cpdef\", 1, 4, 4, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fused_cpdef\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(__pyx_self, __pyx_v_signatures, __pyx_v_args, __pyx_v_kwargs, __pyx_v_defaults);\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_signatures, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED PyObject *__pyx_v_defaults) {\n", | |
" PyObject *__pyx_v_dest_sig = NULL;\n", | |
" Py_ssize_t __pyx_v_i;\n", | |
" CYTHON_UNUSED PyTypeObject *__pyx_v_ndarray = 0;\n", | |
" CYTHON_UNUSED Py_ssize_t __pyx_v_itemsize;\n", | |
" PyObject *__pyx_v_arg = NULL;\n", | |
" PyObject *__pyx_v_candidates = NULL;\n", | |
" PyObject *__pyx_v_sig = NULL;\n", | |
" int __pyx_v_match_found;\n", | |
" PyObject *__pyx_v_src_sig = NULL;\n", | |
" PyObject *__pyx_v_dst_type = NULL;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"gemm\", 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_v_kwargs);\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(Py_None);\n", | |
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, 0, Py_None);\n", | |
" __pyx_v_dest_sig = ((PyObject*)__pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_3 = (__pyx_v_kwargs != Py_None);\n", | |
" __pyx_t_4 = (__pyx_t_3 != 0);\n", | |
" if (__pyx_t_4) {\n", | |
" } else {\n", | |
" __pyx_t_2 = __pyx_t_4;\n", | |
" goto __pyx_L4_bool_binop_done;\n", | |
" }\n", | |
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_v_kwargs); if (unlikely(__pyx_t_4 < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_3 = ((!__pyx_t_4) != 0);\n", | |
" __pyx_t_2 = __pyx_t_3;\n", | |
" __pyx_L4_bool_binop_done:;\n", | |
" if (__pyx_t_2) {\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_v_kwargs, Py_None);\n", | |
" }\n", | |
" __pyx_t_1 = ((PyObject *)<span class='pyx_c_api'>__Pyx_ImportNumPyArrayTypeIfAvailable</span>());<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_v_ndarray = ((PyTypeObject*)__pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_v_itemsize = -1L;\n", | |
" if (unlikely(__pyx_v_args == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"object of type 'NoneType' has no len()\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_5 = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(((PyObject*)__pyx_v_args));<span class='error_goto'> if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_2 = ((2 < __pyx_t_5) != 0);\n", | |
" if (__pyx_t_2) {\n", | |
" if (unlikely(__pyx_v_args == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"'NoneType' object is not subscriptable\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_1 = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(((PyObject*)__pyx_v_args), 2);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1);\n", | |
" __pyx_v_arg = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" goto __pyx_L6;\n", | |
" }\n", | |
" __pyx_t_3 = (__pyx_v_kwargs != Py_None);\n", | |
" __pyx_t_4 = (__pyx_t_3 != 0);\n", | |
" if (__pyx_t_4) {\n", | |
" } else {\n", | |
" __pyx_t_2 = __pyx_t_4;\n", | |
" goto __pyx_L7_bool_binop_done;\n", | |
" }\n", | |
" if (unlikely(__pyx_v_kwargs == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"'NoneType' object is not iterable\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_4 = (<span class='pyx_c_api'>__Pyx_PyDict_ContainsTF</span>(__pyx_n_s_alpha, ((PyObject*)__pyx_v_kwargs), Py_EQ)); if (unlikely(__pyx_t_4 < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_3 = (__pyx_t_4 != 0);\n", | |
" __pyx_t_2 = __pyx_t_3;\n", | |
" __pyx_L7_bool_binop_done:;\n", | |
" if (__pyx_t_2) {\n", | |
" if (unlikely(__pyx_v_kwargs == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"'NoneType' object is not subscriptable\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_GetItem</span>(((PyObject*)__pyx_v_kwargs), __pyx_n_s_alpha);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_v_arg = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" goto __pyx_L6;\n", | |
" }\n", | |
" /*else*/ {\n", | |
" if (unlikely(__pyx_v_args == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"object of type 'NoneType' has no len()\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_5 = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(((PyObject*)__pyx_v_args));<span class='error_goto'> if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_1 = <span class='py_c_api'>PyInt_FromSsize_t</span>(__pyx_t_5);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_6 = <span class='py_c_api'>PyTuple_New</span>(3);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_7);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_int_7);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 0, __pyx_int_7);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_n_s_s);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_s);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 1, __pyx_n_s_s);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_6, 2, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyString_Format</span>(__pyx_kp_s_Expected_at_least_d_argument_s_g, __pyx_t_6);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_builtin_TypeError, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __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_1); __pyx_t_1 = 0;\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_6, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_L6:;\n", | |
" while (1) {\n", | |
" __pyx_t_2 = <span class='py_c_api'>PyFloat_Check</span>(__pyx_v_arg); \n", | |
" __pyx_t_3 = (__pyx_t_2 != 0);\n", | |
" if (__pyx_t_3) {\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_SetItemInt</span>(__pyx_v_dest_sig, 0, __pyx_n_s_double, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" goto __pyx_L10_break;\n", | |
" }\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_SetItemInt</span>(__pyx_v_dest_sig, 0, Py_None, long, 1, __Pyx_PyInt_From_long, 1, 0, 0) < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" goto __pyx_L10_break;\n", | |
" }\n", | |
" __pyx_L10_break:;\n", | |
" __pyx_t_6 = <span class='py_c_api'>PyList_New</span>(0);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_v_candidates = ((PyObject*)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
" __pyx_t_5 = 0;\n", | |
" if (unlikely(__pyx_v_signatures == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"'NoneType' object is not iterable\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_1 = __Pyx_dict_iterator(((PyObject*)__pyx_v_signatures), 1, ((PyObject *)NULL), (&__pyx_t_7), (&__pyx_t_8));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" __pyx_t_6 = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" while (1) {\n", | |
" __pyx_t_9 = __Pyx_dict_iter_next(__pyx_t_6, __pyx_t_7, &__pyx_t_5, &__pyx_t_1, NULL, NULL, __pyx_t_8);\n", | |
" if (unlikely(__pyx_t_9 == 0)) break;\n", | |
" if (unlikely(__pyx_t_9 == -1)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF_SET</span>(__pyx_v_sig, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_v_match_found = 0;\n", | |
" __pyx_t_11 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_sig, __pyx_n_s_strip);<span class='error_goto'> if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_11);\n", | |
" __pyx_t_12 = NULL;\n", | |
" if (CYTHON_UNPACK_METHODS && likely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_11))) {\n", | |
" __pyx_t_12 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_11);\n", | |
" if (likely(__pyx_t_12)) {\n", | |
" PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_11);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_12);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_11, function);\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_10 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_12, __pyx_kp_s_) : <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_11, __pyx_kp_s_);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_12); __pyx_t_12 = 0;\n", | |
" if (unlikely(!__pyx_t_10)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_10);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_11); __pyx_t_11 = 0;\n", | |
" __pyx_t_11 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_10, __pyx_n_s_split);<span class='error_goto'> if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_11);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_10); __pyx_t_10 = 0;\n", | |
" __pyx_t_10 = NULL;\n", | |
" if (CYTHON_UNPACK_METHODS && likely(<span class='py_c_api'>PyMethod_Check</span>(__pyx_t_11))) {\n", | |
" __pyx_t_10 = <span class='py_macro_api'>PyMethod_GET_SELF</span>(__pyx_t_11);\n", | |
" if (likely(__pyx_t_10)) {\n", | |
" PyObject* function = <span class='py_macro_api'>PyMethod_GET_FUNCTION</span>(__pyx_t_11);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_10);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(function);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF_SET</span>(__pyx_t_11, function);\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_1 = (__pyx_t_10) ? __Pyx_PyObject_Call2Args(__pyx_t_11, __pyx_t_10, __pyx_kp_s__2) : <span class='pyx_c_api'>__Pyx_PyObject_CallOneArg</span>(__pyx_t_11, __pyx_kp_s__2);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_10); __pyx_t_10 = 0;\n", | |
" if (unlikely(!__pyx_t_1)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_11); __pyx_t_11 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF_SET</span>(__pyx_v_src_sig, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_13 = <span class='py_macro_api'>PyList_GET_SIZE</span>(__pyx_v_dest_sig);<span class='error_goto'> if (unlikely(__pyx_t_13 == ((Py_ssize_t)-1))) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_14 = __pyx_t_13;\n", | |
" for (__pyx_t_15 = 0; __pyx_t_15 < __pyx_t_14; __pyx_t_15+=1) {\n", | |
" __pyx_v_i = __pyx_t_15;\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt_List</span>(__pyx_v_dest_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 1, 1, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF_SET</span>(__pyx_v_dst_type, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_3 = (__pyx_v_dst_type != Py_None);\n", | |
" __pyx_t_2 = (__pyx_t_3 != 0);\n", | |
" if (__pyx_t_2) {\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_src_sig, __pyx_v_i, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 1, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_11 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_1, __pyx_v_dst_type, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_11);<span class='error_goto'> if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_11); if (unlikely(__pyx_t_2 < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_11); __pyx_t_11 = 0;\n", | |
" if (__pyx_t_2) {\n", | |
" __pyx_v_match_found = 1;\n", | |
" goto __pyx_L17;\n", | |
" }\n", | |
" /*else*/ {\n", | |
" __pyx_v_match_found = 0;\n", | |
" goto __pyx_L15_break;\n", | |
" }\n", | |
" __pyx_L17:;\n", | |
" }\n", | |
" }\n", | |
" __pyx_L15_break:;\n", | |
" __pyx_t_2 = (__pyx_v_match_found != 0);\n", | |
" if (__pyx_t_2) {\n", | |
" __pyx_t_16 = <span class='pyx_c_api'>__Pyx_PyList_Append</span>(__pyx_v_candidates, __pyx_v_sig);<span class='error_goto'> if (unlikely(__pyx_t_16 == ((int)-1))) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" }\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_t_2 = (<span class='py_macro_api'>PyList_GET_SIZE</span>(__pyx_v_candidates) != 0);\n", | |
" __pyx_t_3 = ((!__pyx_t_2) != 0);\n", | |
" if (__pyx_t_3) {\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_TypeError, __pyx_tuple__3, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_6, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_7 = <span class='py_macro_api'>PyList_GET_SIZE</span>(__pyx_v_candidates);<span class='error_goto'> if (unlikely(__pyx_t_7 == ((Py_ssize_t)-1))) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" __pyx_t_3 = ((__pyx_t_7 > 1) != 0);\n", | |
" if (__pyx_t_3) {\n", | |
"/* … */\n", | |
" __pyx_tuple__3 = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_kp_s_No_matching_signature_found);<span class='error_goto'> if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__3);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__3);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_builtin_TypeError, __pyx_tuple__4, NULL);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_c_api'>__Pyx_Raise</span>(__pyx_t_6, 0, 0, 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" /*else*/ {\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" if (unlikely(__pyx_v_signatures == Py_None)) {\n", | |
" <span class='py_c_api'>PyErr_SetString</span>(PyExc_TypeError, \"'NoneType' object is not subscriptable\");\n", | |
" <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyDict_GetItem</span>(((PyObject*)__pyx_v_signatures), <span class='py_macro_api'>PyList_GET_ITEM</span>(__pyx_v_candidates, 0));<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __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", | |
" }\n", | |
"\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_10);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_11);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_12);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fused_cpdef\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_dest_sig);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_ndarray);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_arg);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_candidates);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_sig);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_src_sig);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_dst_type);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_kwargs);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static void __pyx_fuse_0__pyx_f_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb, float __pyx_v_alpha, __Pyx_memviewslice __pyx_v_A, __Pyx_memviewslice __pyx_v_B, float __pyx_v_beta, __Pyx_memviewslice __pyx_v_C, CYTHON_UNUSED int __pyx_skip_dispatch) {\n", | |
" int __pyx_v_m;\n", | |
" int __pyx_v_n;\n", | |
" int __pyx_v_k;\n", | |
" int __pyx_v_lda;\n", | |
" int __pyx_v_ldb;\n", | |
" int __pyx_v_ldc;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Order __pyx_v_order;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_0gemm\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
"}\n", | |
"\n", | |
"/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_fuse_0__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm = {\"__pyx_fuse_0gemm\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb;\n", | |
" float __pyx_v_alpha;\n", | |
" __Pyx_memviewslice __pyx_v_A = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" __Pyx_memviewslice __pyx_v_B = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" float __pyx_v_beta;\n", | |
" __Pyx_memviewslice __pyx_v_C = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_0gemm (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_ta,&__pyx_n_s_tb,&__pyx_n_s_alpha,&__pyx_n_s_A,&__pyx_n_s_B,&__pyx_n_s_beta,&__pyx_n_s_C,0};\n", | |
" PyObject* values[7] = {0,0,0,0,0,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 7: values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6: values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5: values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" CYTHON_FALLTHROUGH;\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='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_ta)) != 0)) kw_args--;\n", | |
" else goto __pyx_L5_argtuple_error;\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1:\n", | |
" if (likely((values[1] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_tb)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 1); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2:\n", | |
" if (likely((values[2] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 2); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3:\n", | |
" if (likely((values[3] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_A)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 3); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4:\n", | |
" if (likely((values[4] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_B)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 4); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5:\n", | |
" if (likely((values[5] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_beta)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 5); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6:\n", | |
" if (likely((values[6] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_C)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, 6); <span class='error_goto'>__PYX_ERR(0, 13, __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, \"__pyx_fuse_0gemm\") < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 7) {\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", | |
" values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" }\n", | |
" __pyx_v_ta = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[0]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error)</span>\n", | |
" __pyx_v_tb = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[1]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)</span>\n", | |
" __pyx_v_alpha = __pyx_<span class='py_c_api'>PyFloat_AsFloat</span>(values[2]); if (unlikely((__pyx_v_alpha == (float)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n", | |
" __pyx_v_A = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_float__const__</span>(values[3], 0);<span class='error_goto'> if (unlikely(!__pyx_v_A.memview)) __PYX_ERR(0, 17, __pyx_L3_error)</span>\n", | |
" __pyx_v_B = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_float__const__</span>(values[4], 0);<span class='error_goto'> if (unlikely(!__pyx_v_B.memview)) __PYX_ERR(0, 18, __pyx_L3_error)</span>\n", | |
" __pyx_v_beta = __pyx_<span class='py_c_api'>PyFloat_AsFloat</span>(values[5]); if (unlikely((__pyx_v_beta == (float)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 19, __pyx_L3_error)</span>\n", | |
" __pyx_v_C = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_float</span>(values[6], PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_v_C.memview)) __PYX_ERR(0, 20, __pyx_L3_error)</span>\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_0gemm\", 1, 7, 7, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fuse_0gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_6__pyx_fuse_0gemm(__pyx_self, __pyx_v_ta, __pyx_v_tb, __pyx_v_alpha, __pyx_v_A, __pyx_v_B, __pyx_v_beta, __pyx_v_C);\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_6__pyx_fuse_0gemm(CYTHON_UNUSED PyObject *__pyx_self, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb, float __pyx_v_alpha, __Pyx_memviewslice __pyx_v_A, __Pyx_memviewslice __pyx_v_B, float __pyx_v_beta, __Pyx_memviewslice __pyx_v_C) {\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_0gemm\", 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" if (unlikely(!__pyx_v_A.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"A\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" if (unlikely(!__pyx_v_B.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"B\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" if (unlikely(!__pyx_v_C.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"C\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" __pyx_t_1 = __Pyx_void_to_None(__pyx_fuse_0__pyx_f_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(__pyx_v_ta, __pyx_v_tb, __pyx_v_alpha, __pyx_v_A, __pyx_v_B, __pyx_v_beta, __pyx_v_C, 0));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_r = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" goto __pyx_L0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fuse_0gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_A, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_B, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_C, 1);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static void __pyx_fuse_1__pyx_f_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb, double __pyx_v_alpha, __Pyx_memviewslice __pyx_v_A, __Pyx_memviewslice __pyx_v_B, double __pyx_v_beta, __Pyx_memviewslice __pyx_v_C, CYTHON_UNUSED int __pyx_skip_dispatch) {\n", | |
" int __pyx_v_m;\n", | |
" int __pyx_v_n;\n", | |
" int __pyx_v_k;\n", | |
" int __pyx_v_lda;\n", | |
" int __pyx_v_ldb;\n", | |
" int __pyx_v_ldc;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Order __pyx_v_order;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_1gemm\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
"}\n", | |
"\n", | |
"/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_fuse_1__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm = {\"__pyx_fuse_1gemm\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb;\n", | |
" double __pyx_v_alpha;\n", | |
" __Pyx_memviewslice __pyx_v_A = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" __Pyx_memviewslice __pyx_v_B = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" double __pyx_v_beta;\n", | |
" __Pyx_memviewslice __pyx_v_C = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_1gemm (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_ta,&__pyx_n_s_tb,&__pyx_n_s_alpha,&__pyx_n_s_A,&__pyx_n_s_B,&__pyx_n_s_beta,&__pyx_n_s_C,0};\n", | |
" PyObject* values[7] = {0,0,0,0,0,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 7: values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6: values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5: values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" CYTHON_FALLTHROUGH;\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='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_ta)) != 0)) kw_args--;\n", | |
" else goto __pyx_L5_argtuple_error;\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1:\n", | |
" if (likely((values[1] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_tb)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 1); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2:\n", | |
" if (likely((values[2] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 2); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3:\n", | |
" if (likely((values[3] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_A)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 3); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4:\n", | |
" if (likely((values[4] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_B)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 4); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5:\n", | |
" if (likely((values[5] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_beta)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 5); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6:\n", | |
" if (likely((values[6] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_C)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, 6); <span class='error_goto'>__PYX_ERR(0, 13, __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, \"__pyx_fuse_1gemm\") < 0)) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 7) {\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", | |
" values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" }\n", | |
" __pyx_v_ta = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[0]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 14, __pyx_L3_error)</span>\n", | |
" __pyx_v_tb = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[1]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 15, __pyx_L3_error)</span>\n", | |
" __pyx_v_alpha = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[2]); if (unlikely((__pyx_v_alpha == (double)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L3_error)</span>\n", | |
" __pyx_v_A = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double__const__</span>(values[3], 0);<span class='error_goto'> if (unlikely(!__pyx_v_A.memview)) __PYX_ERR(0, 17, __pyx_L3_error)</span>\n", | |
" __pyx_v_B = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double__const__</span>(values[4], 0);<span class='error_goto'> if (unlikely(!__pyx_v_B.memview)) __PYX_ERR(0, 18, __pyx_L3_error)</span>\n", | |
" __pyx_v_beta = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[5]); if (unlikely((__pyx_v_beta == (double)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 19, __pyx_L3_error)</span>\n", | |
" __pyx_v_C = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double</span>(values[6], PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_v_C.memview)) __PYX_ERR(0, 20, __pyx_L3_error)</span>\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"__pyx_fuse_1gemm\", 1, 7, 7, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fuse_1gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_8__pyx_fuse_1gemm(__pyx_self, __pyx_v_ta, __pyx_v_tb, __pyx_v_alpha, __pyx_v_A, __pyx_v_B, __pyx_v_beta, __pyx_v_C);\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_8__pyx_fuse_1gemm(CYTHON_UNUSED PyObject *__pyx_self, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb, double __pyx_v_alpha, __Pyx_memviewslice __pyx_v_A, __Pyx_memviewslice __pyx_v_B, double __pyx_v_beta, __Pyx_memviewslice __pyx_v_C) {\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"__pyx_fuse_1gemm\", 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" if (unlikely(!__pyx_v_A.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"A\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" if (unlikely(!__pyx_v_B.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"B\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" if (unlikely(!__pyx_v_C.memview)) { <span class='pyx_c_api'>__Pyx_RaiseUnboundLocalError</span>(\"C\"); <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span> }\n", | |
" __pyx_t_1 = __Pyx_void_to_None(__pyx_fuse_1__pyx_f_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_gemm(__pyx_v_ta, __pyx_v_tb, __pyx_v_alpha, __pyx_v_A, __pyx_v_B, __pyx_v_beta, __pyx_v_C, 0));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_r = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" goto __pyx_L0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.__pyx_fuse_1gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_A, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_B, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_C, 1);\n", | |
" <span class='refnanny'>__Pyx_XGIVEREF</span>(__pyx_r);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
" __pyx_tuple__4 = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_kp_s_Function_call_with_ambiguous_arg);<span class='error_goto'> if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__4);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__4);\n", | |
"/* … */\n", | |
" __pyx_tuple__26 = <span class='py_c_api'>PyTuple_Pack</span>(7, __pyx_n_s_ta, __pyx_n_s_tb, __pyx_n_s_alpha, __pyx_n_s_A, __pyx_n_s_B, __pyx_n_s_beta, __pyx_n_s_C);<span class='error_goto'> if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__26);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__26);\n", | |
"/* … */\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_0__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_7__pyx_fuse_0gemm, 0, __pyx_n_s_pyx_fuse_0gemm, NULL, __pyx_n_s_cython_magic_7982e031ff248a54e9, __pyx_d, ((PyObject *)__pyx_codeobj__27));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_CyFunction_SetDefaultsTuple</span>(__pyx_t_1, __pyx_empty_tuple);\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_2, __pyx_n_s_float, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_fuse_1__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_9__pyx_fuse_1gemm, 0, __pyx_n_s_pyx_fuse_1gemm, NULL, __pyx_n_s_cython_magic_7982e031ff248a54e9, __pyx_d, ((PyObject *)__pyx_codeobj__27));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_CyFunction_SetDefaultsTuple</span>(__pyx_t_1, __pyx_empty_tuple);\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_2, __pyx_n_s_double, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = __pyx_FusedFunction_New(&__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_1gemm, 0, __pyx_n_s_gemm, NULL, __pyx_n_s_cython_magic_7982e031ff248a54e9, __pyx_d, ((PyObject *)__pyx_codeobj__27));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_CyFunction_SetDefaultsTuple</span>(__pyx_t_1, __pyx_empty_tuple);\n", | |
" ((__pyx_FusedFunctionObject *) __pyx_t_1)->__signatures__ = __pyx_t_2;\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_2);\n", | |
" __pyx_t_2 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s_gemm, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__27 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(7, 0, 7, 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_home_jjerphan_cache_ipython_cyt, __pyx_n_s_pyx_fuse_0gemm, 13, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 13, __pyx_L1_error)</span>\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"n\">BLAS_Trans</span> <span class=\"n\">ta</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">15</span>: <span class=\"n\">BLAS_Trans</span> <span class=\"n\">tb</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">16</span>: <span class=\"n\">floating</span> <span class=\"n\">alpha</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">17</span>: <span class=\"n\">const</span> <span class=\"n\">floating</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">A</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">18</span>: <span class=\"n\">const</span> <span class=\"n\">floating</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">B</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">19</span>: <span class=\"n\">floating</span> <span class=\"n\">beta</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">20</span>: <span class=\"n\">floating</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">C</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">21</span>: <span class=\"p\">):</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">22</span>: <span class=\"k\">cdef</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">23</span>: <span class=\"nb\">int</span> <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">A</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=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">A</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-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" }\n", | |
" __pyx_v_m = __pyx_t_1;\n", | |
"/* … */\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" }\n", | |
" __pyx_v_m = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">24</span>: <span class=\"nb\">int</span> <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"n\">B</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">B</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[0]);\n", | |
" }\n", | |
" __pyx_v_n = __pyx_t_1;\n", | |
"/* … */\n", | |
" if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[0]);\n", | |
" }\n", | |
" __pyx_v_n = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">25</span>: <span class=\"nb\">int</span> <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" }\n", | |
" __pyx_v_k = __pyx_t_1;\n", | |
"/* … */\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" }\n", | |
" __pyx_v_k = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">26</span>: <span class=\"nb\">int</span> <span class=\"n\">lda</span><span class=\"p\">,</span> <span class=\"n\">ldb</span><span class=\"p\">,</span> <span class=\"n\">ldc</span></pre>\n", | |
"<pre class=\"cython line score-36\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">27</span>: <span class=\"n\">BLAS_Order</span> <span class=\"n\">order</span> <span class=\"o\">=</span> <span class=\"n\">ColMajor</span> <span class=\"k\">if</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">strides</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">itemsize</span> <span class=\"k\">else</span> <span class=\"n\">RowMajor</span></pre>\n", | |
"<pre class='cython code score-36 '> __pyx_t_3 = <span class='py_c_api'>PyInt_FromSsize_t</span>((__pyx_v_A.strides[0]));<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_A, 2, (PyObject *(*)(char *)) __pyx_memview_get_float__const__, (int (*)(char *, PyObject *)) NULL, 0);;<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_itemsize);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_3, __pyx_t_5, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_4);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) <span class='error_goto'>__PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (__pyx_t_6) {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_ColMajor;\n", | |
" } else {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor;\n", | |
" }\n", | |
" __pyx_v_order = __pyx_t_2;\n", | |
"/* … */\n", | |
" __pyx_t_3 = <span class='py_c_api'>PyInt_FromSsize_t</span>((__pyx_v_A.strides[0]));<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_A, 2, (PyObject *(*)(char *)) __pyx_memview_get_double__const__, (int (*)(char *, PyObject *)) NULL, 0);;<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_itemsize);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_3, __pyx_t_5, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_4);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) <span class='error_goto'>__PYX_ERR(0, 27, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (__pyx_t_6) {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_ColMajor;\n", | |
" } else {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor;\n", | |
" }\n", | |
" __pyx_v_order = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">28</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">29</span>: <span class=\"k\">if</span> <span class=\"n\">order</span> <span class=\"o\">==</span> <span class=\"n\">RowMajor</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_6 = ((__pyx_v_order == __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor) != 0);\n", | |
" if (__pyx_t_6) {\n", | |
"/* … */\n", | |
" goto __pyx_L3;\n", | |
" }\n", | |
"/* … */\n", | |
" __pyx_t_6 = ((__pyx_v_order == __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor) != 0);\n", | |
" if (__pyx_t_6) {\n", | |
"/* … */\n", | |
" goto __pyx_L3;\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">30</span>: <span class=\"n\">lda</span> <span class=\"o\">=</span> <span class=\"n\">k</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">m</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"/* … */\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">31</span>: <span class=\"n\">ldb</span> <span class=\"o\">=</span> <span class=\"n\">n</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">k</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"/* … */\n", | |
" if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">32</span>: <span class=\"n\">ldc</span> <span class=\"o\">=</span> <span class=\"n\">n</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ldc = __pyx_v_n;\n", | |
"/* … */\n", | |
" __pyx_v_ldc = __pyx_v_n;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">33</span>: <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">34</span>: <span class=\"n\">lda</span> <span class=\"o\">=</span> <span class=\"n\">m</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">k</span></pre>\n", | |
"<pre class='cython code score-0 '> /*else*/ {\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"/* … */\n", | |
" /*else*/ {\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">35</span>: <span class=\"n\">ldb</span> <span class=\"o\">=</span> <span class=\"n\">k</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">n</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"/* … */\n", | |
" if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">36</span>: <span class=\"n\">ldc</span> <span class=\"o\">=</span> <span class=\"n\">m</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ldc = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_L3:;\n", | |
"/* … */\n", | |
" __pyx_v_ldc = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_L3:;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">37</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">38</span>: <span class=\"k\">with</span> <span class=\"k\">nogil</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-8 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyThreadState *_save;\n", | |
" Py_UNBLOCK_THREADS\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Remember</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" /*normal exit:*/{\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L6;\n", | |
" }\n", | |
" __pyx_L6:;\n", | |
" }\n", | |
" }\n", | |
"/* … */\n", | |
" {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyThreadState *_save;\n", | |
" Py_UNBLOCK_THREADS\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Remember</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" /*normal exit:*/{\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L6;\n", | |
" }\n", | |
" __pyx_L6:;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"n\">cy_gemm</span><span class=\"p\">(</span><span class=\"n\">order</span><span class=\"p\">,</span> <span class=\"n\">ta</span><span class=\"p\">,</span> <span class=\"n\">tb</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">alpha</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">A</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">,</span> <span class=\"mf\">0</span><span class=\"p\">],</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_8 = 0;\n", | |
" __pyx_t_9 = 0;\n", | |
" if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_A.shape[0];\n", | |
" if (__pyx_t_9 < 0) __pyx_t_9 += __pyx_v_A.shape[1];\n", | |
"/* … */\n", | |
" __pyx_fuse_0__pyx_f_7sklearn_5utils_12_cython_blas__gemm(__pyx_v_order, __pyx_v_ta, __pyx_v_tb, __pyx_v_m, __pyx_v_n, __pyx_v_k, __pyx_v_alpha, (&(*((float const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_A.data + __pyx_t_8 * __pyx_v_A.strides[0]) ) + __pyx_t_9 * __pyx_v_A.strides[1]) )))), __pyx_v_lda, (&(*((float const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_B.data + __pyx_t_10 * __pyx_v_B.strides[0]) ) + __pyx_t_11 * __pyx_v_B.strides[1]) )))), __pyx_v_ldb, __pyx_v_beta, (&(*((float *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_C.data + __pyx_t_12 * __pyx_v_C.strides[0]) ) + __pyx_t_13 * __pyx_v_C.strides[1]) )))), __pyx_v_ldc);\n", | |
" }\n", | |
"/* … */\n", | |
" __pyx_t_8 = 0;\n", | |
" __pyx_t_9 = 0;\n", | |
" if (__pyx_t_8 < 0) __pyx_t_8 += __pyx_v_A.shape[0];\n", | |
" if (__pyx_t_9 < 0) __pyx_t_9 += __pyx_v_A.shape[1];\n", | |
"/* … */\n", | |
" __pyx_fuse_1__pyx_f_7sklearn_5utils_12_cython_blas__gemm(__pyx_v_order, __pyx_v_ta, __pyx_v_tb, __pyx_v_m, __pyx_v_n, __pyx_v_k, __pyx_v_alpha, (&(*((double const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_A.data + __pyx_t_8 * __pyx_v_A.strides[0]) ) + __pyx_t_9 * __pyx_v_A.strides[1]) )))), __pyx_v_lda, (&(*((double const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_B.data + __pyx_t_10 * __pyx_v_B.strides[0]) ) + __pyx_t_11 * __pyx_v_B.strides[1]) )))), __pyx_v_ldb, __pyx_v_beta, (&(*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_C.data + __pyx_t_12 * __pyx_v_C.strides[0]) ) + __pyx_t_13 * __pyx_v_C.strides[1]) )))), __pyx_v_ldc);\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">40</span>: <span class=\"n\">lda</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">B</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=\"n\">ldb</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">C</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=\"n\">ldc</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_10 = 0;\n", | |
" __pyx_t_11 = 0;\n", | |
" if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_B.shape[0];\n", | |
" if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_B.shape[1];\n", | |
" __pyx_t_12 = 0;\n", | |
" __pyx_t_13 = 0;\n", | |
" if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_C.shape[0];\n", | |
" if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_C.shape[1];\n", | |
"/* … */\n", | |
" __pyx_t_10 = 0;\n", | |
" __pyx_t_11 = 0;\n", | |
" if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_B.shape[0];\n", | |
" if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_B.shape[1];\n", | |
" __pyx_t_12 = 0;\n", | |
" __pyx_t_13 = 0;\n", | |
" if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_C.shape[0];\n", | |
" if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_C.shape[1];\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">41</span>: </pre>\n", | |
"<pre class=\"cython line score-105\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">42</span>: <span class=\"k\">def</span> <span class=\"nf\">py_gemm</span><span class=\"p\">(</span></pre>\n", | |
"<pre class='cython code score-105 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_3py_gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_3py_gemm = {\"py_gemm\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_3py_gemm, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_3py_gemm(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" CYTHON_UNUSED int __pyx_v_n_calls;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb;\n", | |
" __pyx_t_5numpy_float64_t __pyx_v_alpha;\n", | |
" __Pyx_memviewslice __pyx_v_A = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" __Pyx_memviewslice __pyx_v_B = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" __pyx_t_5numpy_float64_t __pyx_v_beta;\n", | |
" __Pyx_memviewslice __pyx_v_C = { 0, 0, { 0 }, { 0 }, { 0 } };\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"py_gemm (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_n_calls,&__pyx_n_s_ta,&__pyx_n_s_tb,&__pyx_n_s_alpha,&__pyx_n_s_A,&__pyx_n_s_B,&__pyx_n_s_beta,&__pyx_n_s_C,0};\n", | |
" PyObject* values[8] = {0,0,0,0,0,0,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 8: values[7] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 7);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 7: values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6: values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5: values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4: values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3: values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" CYTHON_FALLTHROUGH;\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='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_n_calls)) != 0)) kw_args--;\n", | |
" else goto __pyx_L5_argtuple_error;\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 1:\n", | |
" if (likely((values[1] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_ta)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 1); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 2:\n", | |
" if (likely((values[2] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_tb)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 2); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 3:\n", | |
" if (likely((values[3] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_alpha)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 3); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 4:\n", | |
" if (likely((values[4] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_A)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 4); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 5:\n", | |
" if (likely((values[5] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_B)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 5); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 6:\n", | |
" if (likely((values[6] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_beta)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 6); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" CYTHON_FALLTHROUGH;\n", | |
" case 7:\n", | |
" if (likely((values[7] = <span class='pyx_c_api'>__Pyx_PyDict_GetItemStr</span>(__pyx_kwds, __pyx_n_s_C)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, 7); <span class='error_goto'>__PYX_ERR(0, 42, __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, \"py_gemm\") < 0)) <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 8) {\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", | |
" values[2] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 2);\n", | |
" values[3] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 3);\n", | |
" values[4] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 4);\n", | |
" values[5] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 5);\n", | |
" values[6] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 6);\n", | |
" values[7] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 7);\n", | |
" }\n", | |
" __pyx_v_n_calls = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(values[0]); if (unlikely((__pyx_v_n_calls == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 43, __pyx_L3_error)</span>\n", | |
" __pyx_v_ta = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[1]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 44, __pyx_L3_error)</span>\n", | |
" __pyx_v_tb = ((enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans)__Pyx_PyInt_As_enum____pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans(values[2]));<span class='error_goto'> if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 45, __pyx_L3_error)</span>\n", | |
" __pyx_v_alpha = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[3]); if (unlikely((__pyx_v_alpha == ((npy_float64)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 46, __pyx_L3_error)</span>\n", | |
" __pyx_v_A = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t__const__(values[4], 0);<span class='error_goto'> if (unlikely(!__pyx_v_A.memview)) __PYX_ERR(0, 47, __pyx_L3_error)</span>\n", | |
" __pyx_v_B = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t__const__(values[5], 0);<span class='error_goto'> if (unlikely(!__pyx_v_B.memview)) __PYX_ERR(0, 48, __pyx_L3_error)</span>\n", | |
" __pyx_v_beta = __pyx_<span class='py_c_api'>PyFloat_AsDouble</span>(values[6]); if (unlikely((__pyx_v_beta == ((npy_float64)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 49, __pyx_L3_error)</span>\n", | |
" __pyx_v_C = __Pyx_PyObject_to_MemoryviewSlice_dsds_nn___pyx_t_5numpy_float64_t(values[7], PyBUF_WRITABLE);<span class='error_goto'> if (unlikely(!__pyx_v_C.memview)) __PYX_ERR(0, 50, __pyx_L3_error)</span>\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"py_gemm\", 1, 8, 8, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.py_gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_2py_gemm(__pyx_self, __pyx_v_n_calls, __pyx_v_ta, __pyx_v_tb, __pyx_v_alpha, __pyx_v_A, __pyx_v_B, __pyx_v_beta, __pyx_v_C);\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_2py_gemm(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED int __pyx_v_n_calls, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_ta, enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Trans __pyx_v_tb, __pyx_t_5numpy_float64_t __pyx_v_alpha, __Pyx_memviewslice __pyx_v_A, __Pyx_memviewslice __pyx_v_B, __pyx_t_5numpy_float64_t __pyx_v_beta, __Pyx_memviewslice __pyx_v_C) {\n", | |
" CYTHON_UNUSED int __pyx_v_i;\n", | |
" int __pyx_v_m;\n", | |
" int __pyx_v_n;\n", | |
" int __pyx_v_k;\n", | |
" int __pyx_v_lda;\n", | |
" int __pyx_v_ldb;\n", | |
" int __pyx_v_ldc;\n", | |
" enum __pyx_t_7sklearn_5utils_12_cython_blas_BLAS_Order __pyx_v_order;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"py_gemm\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.py_gemm\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_A, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_B, 1);\n", | |
" __PYX_XDEC_MEMVIEW(&__pyx_v_C, 1);\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__28 = <span class='py_c_api'>PyTuple_Pack</span>(16, __pyx_n_s_n_calls, __pyx_n_s_ta, __pyx_n_s_tb, __pyx_n_s_alpha, __pyx_n_s_A, __pyx_n_s_B, __pyx_n_s_beta, __pyx_n_s_C, __pyx_n_s_i, __pyx_n_s_m, __pyx_n_s_n, __pyx_n_s_k, __pyx_n_s_lda, __pyx_n_s_ldb, __pyx_n_s_ldc, __pyx_n_s_order);<span class='error_goto'> if (unlikely(!__pyx_tuple__28)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__28);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__28);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_3py_gemm, NULL, __pyx_n_s_cython_magic_7982e031ff248a54e9);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __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_py_gemm, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 42, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__29 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(8, 0, 16, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__28, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jjerphan_cache_ipython_cyt, __pyx_n_s_py_gemm, 42, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__29)) __PYX_ERR(0, 42, __pyx_L1_error)</span>\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">43</span>: <span class=\"nb\">int</span> <span class=\"n\">n_calls</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">44</span>: <span class=\"n\">BLAS_Trans</span> <span class=\"n\">ta</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">45</span>: <span class=\"n\">BLAS_Trans</span> <span class=\"n\">tb</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">46</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">float64_t</span> <span class=\"n\">alpha</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">47</span>: <span class=\"n\">const</span> <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">float64_t</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">A</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">48</span>: <span class=\"n\">const</span> <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">float64_t</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">B</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">49</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">float64_t</span> <span class=\"n\">beta</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">50</span>: <span class=\"n\">cnp</span><span class=\"o\">.</span><span class=\"n\">float64_t</span><span class=\"p\">[:,</span> <span class=\"p\">:]</span> <span class=\"n\">C</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">51</span>: <span class=\"p\">):</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">52</span>: <span class=\"k\">cdef</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">53</span>: <span class=\"nb\">int</span> <span class=\"n\">i</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">54</span>: <span class=\"nb\">int</span> <span class=\"n\">m</span> <span class=\"o\">=</span> <span class=\"n\">A</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=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">A</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-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" }\n", | |
" __pyx_v_m = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">55</span>: <span class=\"nb\">int</span> <span class=\"n\">n</span> <span class=\"o\">=</span> <span class=\"n\">B</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">B</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_B.shape[0]);\n", | |
" }\n", | |
" __pyx_v_n = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">56</span>: <span class=\"nb\">int</span> <span class=\"n\">k</span> <span class=\"o\">=</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">1</span><span class=\"p\">]</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[1]);\n", | |
" } else {\n", | |
" __pyx_t_1 = (__pyx_v_A.shape[0]);\n", | |
" }\n", | |
" __pyx_v_k = __pyx_t_1;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">57</span>: <span class=\"nb\">int</span> <span class=\"n\">lda</span><span class=\"p\">,</span> <span class=\"n\">ldb</span><span class=\"p\">,</span> <span class=\"n\">ldc</span></pre>\n", | |
"<pre class=\"cython line score-18\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">58</span>: <span class=\"n\">BLAS_Order</span> <span class=\"n\">order</span> <span class=\"o\">=</span> <span class=\"n\">ColMajor</span> <span class=\"k\">if</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">strides</span><span class=\"p\">[</span><span class=\"mf\">0</span><span class=\"p\">]</span> <span class=\"o\">==</span> <span class=\"n\">A</span><span class=\"o\">.</span><span class=\"n\">itemsize</span> <span class=\"k\">else</span> <span class=\"n\">RowMajor</span></pre>\n", | |
"<pre class='cython code score-18 '> __pyx_t_3 = <span class='py_c_api'>PyInt_FromSsize_t</span>((__pyx_v_A.strides[0]));<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 58, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" __pyx_t_4 = __pyx_memoryview_fromslice(__pyx_v_A, 2, (PyObject *(*)(char *)) __pyx_memview_get_nn___pyx_t_5numpy_float64_t__const__, (int (*)(char *, PyObject *)) NULL, 0);;<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_itemsize);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 58, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_3, __pyx_t_5, Py_EQ); <span class='refnanny'>__Pyx_XGOTREF</span>(__pyx_t_4);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 58, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_IsTrue</span>(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) <span class='error_goto'>__PYX_ERR(0, 58, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (__pyx_t_6) {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_ColMajor;\n", | |
" } else {\n", | |
" __pyx_t_2 = __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor;\n", | |
" }\n", | |
" __pyx_v_order = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">59</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">60</span>: <span class=\"k\">if</span> <span class=\"n\">order</span> <span class=\"o\">==</span> <span class=\"n\">RowMajor</span><span class=\"p\">:</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_6 = ((__pyx_v_order == __pyx_e_7sklearn_5utils_12_cython_blas_RowMajor) != 0);\n", | |
" if (__pyx_t_6) {\n", | |
"/* … */\n", | |
" goto __pyx_L3;\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">61</span>: <span class=\"n\">lda</span> <span class=\"o\">=</span> <span class=\"n\">k</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">m</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">62</span>: <span class=\"n\">ldb</span> <span class=\"o\">=</span> <span class=\"n\">n</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">k</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">63</span>: <span class=\"n\">ldc</span> <span class=\"o\">=</span> <span class=\"n\">n</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ldc = __pyx_v_n;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">64</span>: <span class=\"k\">else</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">65</span>: <span class=\"n\">lda</span> <span class=\"o\">=</span> <span class=\"n\">m</span> <span class=\"k\">if</span> <span class=\"n\">ta</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">k</span></pre>\n", | |
"<pre class='cython code score-0 '> /*else*/ {\n", | |
" if (((__pyx_v_ta == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_m;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" }\n", | |
" __pyx_v_lda = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">66</span>: <span class=\"n\">ldb</span> <span class=\"o\">=</span> <span class=\"n\">k</span> <span class=\"k\">if</span> <span class=\"n\">tb</span> <span class=\"o\">==</span> <span class=\"n\">NoTrans</span> <span class=\"k\">else</span> <span class=\"n\">n</span></pre>\n", | |
"<pre class='cython code score-0 '> if (((__pyx_v_tb == __pyx_e_7sklearn_5utils_12_cython_blas_NoTrans) != 0)) {\n", | |
" __pyx_t_7 = __pyx_v_k;\n", | |
" } else {\n", | |
" __pyx_t_7 = __pyx_v_n;\n", | |
" }\n", | |
" __pyx_v_ldb = __pyx_t_7;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">67</span>: <span class=\"n\">ldc</span> <span class=\"o\">=</span> <span class=\"n\">m</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_ldc = __pyx_v_m;\n", | |
" }\n", | |
" __pyx_L3:;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">68</span>: </pre>\n", | |
"<pre class=\"cython line score-4\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">69</span>: <span class=\"k\">with</span> <span class=\"k\">nogil</span><span class=\"p\">,</span> <span class=\"n\">parallel</span><span class=\"p\">(</span><span class=\"n\">num_threads</span><span class=\"o\">=</span><span class=\"mf\">4</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-4 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyThreadState *_save;\n", | |
" Py_UNBLOCK_THREADS\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Remember</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
" {\n", | |
" #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", | |
" #undef likely\n", | |
" #undef unlikely\n", | |
" #define likely(x) (x)\n", | |
" #define unlikely(x) (x)\n", | |
" #endif\n", | |
" #ifdef _OPENMP\n", | |
" #pragma omp parallel num_threads(4)\n", | |
" #endif /* _OPENMP */\n", | |
" {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" /*normal exit:*/{\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L6;\n", | |
" }\n", | |
" __pyx_L6:;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">70</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">prange</span><span class=\"p\">(</span><span class=\"n\">n_calls</span><span class=\"p\">,</span> <span class=\"n\">schedule</span><span class=\"o\">=</span><span class=\"s\">'static'</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_7 = __pyx_v_n_calls;\n", | |
" if ((1 == 0)) abort();\n", | |
" {\n", | |
" __pyx_t_9 = (__pyx_t_7 - 0 + 1 - 1/abs(1)) / 1;\n", | |
" if (__pyx_t_9 > 0)\n", | |
" {\n", | |
" #ifdef _OPENMP\n", | |
" #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(static)\n", | |
" #endif /* _OPENMP */\n", | |
" for (__pyx_t_8 = 0; __pyx_t_8 < __pyx_t_9; __pyx_t_8++){\n", | |
" {\n", | |
" __pyx_v_i = (int)(0 + 1 * __pyx_t_8);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">71</span>: <span class=\"n\">cy_gemm</span><span class=\"p\">(</span><span class=\"n\">order</span><span class=\"p\">,</span> <span class=\"n\">ta</span><span class=\"p\">,</span> <span class=\"n\">tb</span><span class=\"p\">,</span> <span class=\"n\">m</span><span class=\"p\">,</span> <span class=\"n\">n</span><span class=\"p\">,</span> <span class=\"n\">k</span><span class=\"p\">,</span> <span class=\"n\">alpha</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">A</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=\"n\">lda</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">B</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=\"n\">ldb</span><span class=\"p\">,</span> <span class=\"n\">beta</span><span class=\"p\">,</span> <span class=\"o\">&</span><span class=\"n\">C</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=\"n\">ldc</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_10 = 0;\n", | |
" __pyx_t_11 = 0;\n", | |
" if (__pyx_t_10 < 0) __pyx_t_10 += __pyx_v_A.shape[0];\n", | |
" if (__pyx_t_11 < 0) __pyx_t_11 += __pyx_v_A.shape[1];\n", | |
" __pyx_t_12 = 0;\n", | |
" __pyx_t_13 = 0;\n", | |
" if (__pyx_t_12 < 0) __pyx_t_12 += __pyx_v_B.shape[0];\n", | |
" if (__pyx_t_13 < 0) __pyx_t_13 += __pyx_v_B.shape[1];\n", | |
" __pyx_t_14 = 0;\n", | |
" __pyx_t_15 = 0;\n", | |
" if (__pyx_t_14 < 0) __pyx_t_14 += __pyx_v_C.shape[0];\n", | |
" if (__pyx_t_15 < 0) __pyx_t_15 += __pyx_v_C.shape[1];\n", | |
" __pyx_fuse_1__pyx_f_7sklearn_5utils_12_cython_blas__gemm(__pyx_v_order, __pyx_v_ta, __pyx_v_tb, __pyx_v_m, __pyx_v_n, __pyx_v_k, __pyx_v_alpha, (&(*((__pyx_t_5numpy_float64_t const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_A.data + __pyx_t_10 * __pyx_v_A.strides[0]) ) + __pyx_t_11 * __pyx_v_A.strides[1]) )))), __pyx_v_lda, (&(*((__pyx_t_5numpy_float64_t const *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_B.data + __pyx_t_12 * __pyx_v_B.strides[0]) ) + __pyx_t_13 * __pyx_v_B.strides[1]) )))), __pyx_v_ldb, __pyx_v_beta, (&(*((__pyx_t_5numpy_float64_t *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_C.data + __pyx_t_14 * __pyx_v_C.strides[0]) ) + __pyx_t_15 * __pyx_v_C.strides[1]) )))), __pyx_v_ldc);\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", | |
" #undef likely\n", | |
" #undef unlikely\n", | |
" #define likely(x) __builtin_expect(!!(x), 1)\n", | |
" #define unlikely(x) __builtin_expect(!!(x), 0)\n", | |
" #endif\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">72</span>: </pre>\n", | |
"<pre class=\"cython line score-2\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">73</span>: <span class=\"k\">return</span> <span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-2 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n", | |
" __pyx_r = __pyx_int_0;\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">74</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">75</span>: </pre>\n", | |
"<pre class=\"cython line score-25\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">76</span>: <span class=\"k\">def</span> <span class=\"nf\">py_noop</span><span class=\"p\">(</span></pre>\n", | |
"<pre class='cython code score-25 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_5py_noop(PyObject *__pyx_self, PyObject *__pyx_arg_n_calls); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_5py_noop = {\"py_noop\", (PyCFunction)__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_5py_noop, METH_O, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_5py_noop(PyObject *__pyx_self, PyObject *__pyx_arg_n_calls) {\n", | |
" CYTHON_UNUSED int __pyx_v_n_calls;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"py_noop (wrapper)\", 0);\n", | |
" assert(__pyx_arg_n_calls); {\n", | |
" __pyx_v_n_calls = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_arg_n_calls); if (unlikely((__pyx_v_n_calls == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 77, __pyx_L3_error)</span>\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.py_noop\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_4py_noop(__pyx_self, ((int)__pyx_v_n_calls));\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_4py_noop(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED int __pyx_v_n_calls) {\n", | |
" int __pyx_v_i;\n", | |
" int __pyx_v_d;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"py_noop\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_4);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_7982e031ff248a54e9e902152fa3b2da.py_noop\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\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__30 = <span class='py_c_api'>PyTuple_Pack</span>(4, __pyx_n_s_n_calls, __pyx_n_s_n_calls, __pyx_n_s_i, __pyx_n_s_d);<span class='error_goto'> if (unlikely(!__pyx_tuple__30)) __PYX_ERR(0, 76, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__30);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__30);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_7982e031ff248a54e9e902152fa3b2da_5py_noop, NULL, __pyx_n_s_cython_magic_7982e031ff248a54e9);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 76, __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_py_noop, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 76, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_codeobj__31 = (PyObject*)<span class='pyx_c_api'>__Pyx_PyCode_New</span>(1, 0, 4, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jjerphan_cache_ipython_cyt, __pyx_n_s_py_noop, 76, __pyx_empty_bytes);<span class='error_goto'> if (unlikely(!__pyx_codeobj__31)) __PYX_ERR(0, 76, __pyx_L1_error)</span>\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">77</span>: <span class=\"nb\">int</span> <span class=\"n\">n_calls</span><span class=\"p\">,</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">78</span>: <span class=\"p\">):</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">79</span>: <span class=\"k\">cdef</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">80</span>: <span class=\"nb\">int</span> <span class=\"n\">i</span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">81</span>: <span class=\"nb\">int</span> <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"mf\">0</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_d = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">82</span>: </pre>\n", | |
"<pre class=\"cython line score-4\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">83</span>: <span class=\"k\">with</span> <span class=\"k\">nogil</span><span class=\"p\">,</span> <span class=\"n\">parallel</span><span class=\"p\">(</span><span class=\"n\">num_threads</span><span class=\"o\">=</span><span class=\"mf\">4</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-4 '> {\n", | |
" #ifdef WITH_THREAD\n", | |
" PyThreadState *_save;\n", | |
" Py_UNBLOCK_THREADS\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Remember</span>();\n", | |
" #endif\n", | |
" /*try:*/ {\n", | |
" {\n", | |
" #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", | |
" #undef likely\n", | |
" #undef unlikely\n", | |
" #define likely(x) (x)\n", | |
" #define unlikely(x) (x)\n", | |
" #endif\n", | |
" #ifdef _OPENMP\n", | |
" #pragma omp parallel num_threads(4)\n", | |
" #endif /* _OPENMP */\n", | |
" {\n", | |
"/* … */\n", | |
" /*finally:*/ {\n", | |
" /*normal exit:*/{\n", | |
" #ifdef WITH_THREAD\n", | |
" <span class='pyx_c_api'>__Pyx_FastGIL_Forget</span>();\n", | |
" Py_BLOCK_THREADS\n", | |
" #endif\n", | |
" goto __pyx_L5;\n", | |
" }\n", | |
" __pyx_L5:;\n", | |
" }\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">84</span>: <span class=\"k\">for</span> <span class=\"n\">i</span> <span class=\"ow\">in</span> <span class=\"n\">prange</span><span class=\"p\">(</span><span class=\"n\">n_calls</span><span class=\"p\">,</span> <span class=\"n\">schedule</span><span class=\"o\">=</span><span class=\"s\">'static'</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_1 = __pyx_v_n_calls;\n", | |
" if ((1 == 0)) abort();\n", | |
" {\n", | |
" __pyx_t_3 = (__pyx_t_1 - 0 + 1 - 1/abs(1)) / 1;\n", | |
" if (__pyx_t_3 > 0)\n", | |
" {\n", | |
" #ifdef _OPENMP\n", | |
" #pragma omp for firstprivate(__pyx_v_i) lastprivate(__pyx_v_i) schedule(static)\n", | |
" #endif /* _OPENMP */\n", | |
" for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_3; __pyx_t_2++){\n", | |
" {\n", | |
" __pyx_v_i = (int)(0 + 1 * __pyx_t_2);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">85</span>: <span class=\"n\">d</span> <span class=\"o\">+=</span> <span class=\"n\">i</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_d = (__pyx_v_d + __pyx_v_i);\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" }\n", | |
" #if ((defined(__APPLE__) || defined(__OSX__)) && (defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))))\n", | |
" #undef likely\n", | |
" #undef unlikely\n", | |
" #define likely(x) __builtin_expect(!!(x), 1)\n", | |
" #define unlikely(x) __builtin_expect(!!(x), 0)\n", | |
" #endif\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">86</span>: </pre>\n", | |
"<pre class=\"cython line score-3\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">87</span>: <span class=\"k\">return</span> <span class=\"n\">d</span></pre>\n", | |
"<pre class='cython code score-3 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_v_d);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 87, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_r = __pyx_t_4;\n", | |
" __pyx_t_4 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -a --compile-args=-fopenmp --link-args=-fopenmp \n", | |
"# cython: boundscheck = False\n", | |
"# distutils: define_macros=NPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION\n", | |
"\n", | |
"cimport numpy as cnp\n", | |
"cimport openmp\n", | |
"\n", | |
"from cython cimport floating\n", | |
"from cython.parallel cimport prange, parallel\n", | |
"from sklearn.utils._cython_blas cimport _gemm as cy_gemm, BLAS_Order, RowMajor, ColMajor, BLAS_Trans, NoTrans, Trans\n", | |
"\n", | |
"from threadpoolctl import threadpool_limits\n", | |
"\n", | |
"cpdef void gemm(\n", | |
" BLAS_Trans ta,\n", | |
" BLAS_Trans tb,\n", | |
" floating alpha,\n", | |
" const floating[:, :] A,\n", | |
" const floating[:, :] B,\n", | |
" floating beta,\n", | |
" floating[:, :] C,\n", | |
"):\n", | |
" cdef:\n", | |
" int m = A.shape[0] if ta == NoTrans else A.shape[1]\n", | |
" int n = B.shape[1] if tb == NoTrans else B.shape[0]\n", | |
" int k = A.shape[1] if ta == NoTrans else A.shape[0]\n", | |
" int lda, ldb, ldc\n", | |
" BLAS_Order order = ColMajor if A.strides[0] == A.itemsize else RowMajor\n", | |
"\n", | |
" if order == RowMajor:\n", | |
" lda = k if ta == NoTrans else m\n", | |
" ldb = n if tb == NoTrans else k\n", | |
" ldc = n\n", | |
" else:\n", | |
" lda = m if ta == NoTrans else k\n", | |
" ldb = k if tb == NoTrans else n\n", | |
" ldc = m\n", | |
"\n", | |
" with nogil:\n", | |
" cy_gemm(order, ta, tb, m, n, k, alpha, &A[0, 0],\n", | |
" lda, &B[0, 0], ldb, beta, &C[0, 0], ldc)\n", | |
" \n", | |
"def py_gemm(\n", | |
" int n_calls,\n", | |
" BLAS_Trans ta,\n", | |
" BLAS_Trans tb, \n", | |
" cnp.float64_t alpha,\n", | |
" const cnp.float64_t[:, :] A,\n", | |
" const cnp.float64_t[:, :] B,\n", | |
" cnp.float64_t beta,\n", | |
" cnp.float64_t[:, :] C,\n", | |
"):\n", | |
" cdef:\n", | |
" int i\n", | |
" int m = A.shape[0] if ta == NoTrans else A.shape[1]\n", | |
" int n = B.shape[1] if tb == NoTrans else B.shape[0]\n", | |
" int k = A.shape[1] if ta == NoTrans else A.shape[0]\n", | |
" int lda, ldb, ldc\n", | |
" BLAS_Order order = ColMajor if A.strides[0] == A.itemsize else RowMajor\n", | |
"\n", | |
" if order == RowMajor:\n", | |
" lda = k if ta == NoTrans else m\n", | |
" ldb = n if tb == NoTrans else k\n", | |
" ldc = n\n", | |
" else:\n", | |
" lda = m if ta == NoTrans else k\n", | |
" ldb = k if tb == NoTrans else n\n", | |
" ldc = m\n", | |
"\n", | |
" with nogil, parallel(num_threads=4): \n", | |
" for i in prange(n_calls, schedule='static'):\n", | |
" cy_gemm(order, ta, tb, m, n, k, alpha, &A[0, 0], lda, &B[0, 0], ldb, beta, &C[0, 0], ldc)\n", | |
" \n", | |
" return 0\n", | |
"\n", | |
"\n", | |
"def py_noop(\n", | |
" int n_calls,\n", | |
"):\n", | |
" cdef:\n", | |
" int i\n", | |
" int d = 0\n", | |
"\n", | |
" with nogil, parallel(num_threads=4): \n", | |
" for i in prange(n_calls, schedule='static'):\n", | |
" d += i\n", | |
" \n", | |
" return d" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9de3ebc6", | |
"metadata": {}, | |
"source": [ | |
"### Compute bound operations" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"id": "5f9616ba", | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.utils._cython_blas import NoTrans, Trans\n", | |
"\n", | |
"from joblib import Parallel, delayed\n", | |
"\n", | |
"alpha = - 0.5\n", | |
"beta = 1\n", | |
"\n", | |
"size = 256\n", | |
"\n", | |
"n_calls = 1_000\n", | |
"\n", | |
"ta = NoTrans\n", | |
"tb = Trans\n", | |
"\n", | |
"A = np.random.rand(size, size)\n", | |
"B = np.random.rand(size, size)\n", | |
"C = np.random.rand(size, size)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"id": "bbfa93a1", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"235 ms ± 21 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"with threadpool_limits(1, user_api=\"blas\"): \n", | |
" Parallel(backend=\"threading\", n_jobs=4)(delayed(gemm)(ta, tb, alpha, A, B, beta, C) for i in range(n_calls))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"id": "946b549c", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"201 ms ± 5.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"with threadpool_limits(1, user_api=\"blas\"): \n", | |
" py_gemm(n_calls, ta, tb, alpha, A, B, beta, C)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9a063a59", | |
"metadata": {}, | |
"source": [ | |
"### No-op" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"id": "4a45b9eb", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"22.6 ms ± 992 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"with threadpool_limits(1, user_api=\"blas\"): \n", | |
" Parallel(backend=\"threading\", n_jobs=4)(delayed(lambda x: x)(i) for i in range(n_calls))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"id": "3ae069be", | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"491 µs ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%%timeit\n", | |
"with threadpool_limits(1, user_api=\"blas\"): \n", | |
" py_noop(n_calls)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9151af43", | |
"metadata": {}, | |
"source": [ | |
" - Dispatch de fonction joblib avec `threading`: 30µs\n", | |
" - Dispatch de fonction avec OpenMP: 0.5µs" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "9430d5bb", | |
"metadata": {}, | |
"source": [ | |
"### Understanding Cython code generation" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "6d56d3b4", | |
"metadata": {}, | |
"source": [ | |
"Is it possible to dispatch `cpdef` functions and via an joblib OpenMP backend?\n", | |
"\n", | |
"A necessary condition is to be able to access the address of the C function generated by Cython in a OpenMP `prange`. \n", | |
"\n", | |
"**Question**: Can one access such a function?\n", | |
"\n", | |
"It seems rather impossible.\n", | |
"\n", | |
"For instance, the compilation of the following piece of Cython code:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"id": "7e216d42", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.33 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_b5b8c26a3df671c73fe4c42927886b2c.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", | |
"pre { line-height: 125%; }\n", | |
"td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", | |
"span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n", | |
"td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", | |
"span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n", | |
".cython .hll { background-color: #ffffcc }\n", | |
".cython { background: #f8f8f8; }\n", | |
".cython .c { color: #3D7B7B; 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 .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n", | |
".cython .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n", | |
".cython .cp { color: #9C6500 } /* Comment.Preproc */\n", | |
".cython .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n", | |
".cython .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n", | |
".cython .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n", | |
".cython .gd { color: #A00000 } /* Generic.Deleted */\n", | |
".cython .ge { font-style: italic } /* Generic.Emph */\n", | |
".cython .gr { color: #E40000 } /* Generic.Error */\n", | |
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", | |
".cython .gi { color: #008400 } /* Generic.Inserted */\n", | |
".cython .go { color: #717171 } /* 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: #687822 } /* 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: #717171; font-weight: bold } /* Name.Entity */\n", | |
".cython .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n", | |
".cython .nf { color: #0000FF } /* Name.Function */\n", | |
".cython .nl { color: #767600 } /* 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 .sa { color: #BA2121 } /* Literal.String.Affix */\n", | |
".cython .sb { color: #BA2121 } /* Literal.String.Backtick */\n", | |
".cython .sc { color: #BA2121 } /* Literal.String.Char */\n", | |
".cython .dl { color: #BA2121 } /* Literal.String.Delimiter */\n", | |
".cython .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n", | |
".cython .s2 { color: #BA2121 } /* Literal.String.Double */\n", | |
".cython .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n", | |
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", | |
".cython .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n", | |
".cython .sx { color: #008000 } /* Literal.String.Other */\n", | |
".cython .sr { color: #A45A77 } /* 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 .fm { color: #0000FF } /* Name.Function.Magic */\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 .vm { color: #19177C } /* Name.Variable.Magic */\n", | |
".cython .il { color: #666666 } /* Literal.Number.Integer.Long */\n", | |
" </style>\n", | |
"</head>\n", | |
"<body class=\"cython\">\n", | |
"<p><span style=\"border-bottom: solid 1px grey;\">Generated by Cython 0.29.33</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=\"\">1</span>: <span class=\"c\"># cython: boundscheck = False</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">2</span>: </pre>\n", | |
"<pre class=\"cython line score-15\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">3</span>: <span class=\"k\">cpdef</span> <span class=\"kt\">int</span> <span class=\"nf\">func</span><span class=\"p\">(</span><span class=\"nb\">int</span> <span class=\"n\">a</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-15 '>static PyObject *__pyx_pw_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_1func(PyObject *__pyx_self, PyObject *__pyx_arg_a); /*proto*/\n", | |
"static int __pyx_f_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_func(int __pyx_v_a, CYTHON_UNUSED int __pyx_skip_dispatch) {\n", | |
" int __pyx_r;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"func\", 0);\n", | |
"/* … */\n", | |
" /* function exit code */\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_1func(PyObject *__pyx_self, PyObject *__pyx_arg_a); /*proto*/\n", | |
"static PyObject *__pyx_pw_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_1func(PyObject *__pyx_self, PyObject *__pyx_arg_a) {\n", | |
" int __pyx_v_a;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"func (wrapper)\", 0);\n", | |
" assert(__pyx_arg_a); {\n", | |
" __pyx_v_a = <span class='pyx_c_api'>__Pyx_PyInt_As_int</span>(__pyx_arg_a); if (unlikely((__pyx_v_a == (int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 3, __pyx_L3_error)</span>\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b5b8c26a3df671c73fe4c42927886b2c.func\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_func(__pyx_self, ((int)__pyx_v_a));\n", | |
" int __pyx_lineno = 0;\n", | |
" const char *__pyx_filename = NULL;\n", | |
" int __pyx_clineno = 0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_func(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_a) {\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"func\", 0);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyInt_From_int</span>(__pyx_f_46_cython_magic_b5b8c26a3df671c73fe4c42927886b2c_func(__pyx_v_a, 0));<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 3, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_r = __pyx_t_1;\n", | |
" __pyx_t_1 = 0;\n", | |
" goto __pyx_L0;\n", | |
"\n", | |
" /* function exit code */\n", | |
" __pyx_L1_error:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_b5b8c26a3df671c73fe4c42927886b2c.func\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\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=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">4</span>: <span class=\"k\">return</span> <span class=\"n\">a</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_r = __pyx_v_a;\n", | |
" goto __pyx_L0;\n", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -a\n", | |
"# cython: boundscheck = False\n", | |
"\n", | |
"cpdef int func(int a):\n", | |
" return a" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"id": "895c6963", | |
"metadata": {}, | |
"source": [ | |
"generates 3 C functions, (which after unmangling strings):\n", | |
"```c\n", | |
"// The bare C function.\n", | |
"static int __pyx_f_46_func(int, int __pyx_skip_dispatch);\n", | |
"\n", | |
"// The C function which transfers the call to the bare C function.\n", | |
"static PyObject *__pyx_pf_46_func(CYTHON_UNUSED PyObject *__pyx_self, int __pyx_v_a);\n", | |
"\n", | |
"// The `PyCFunction` exposed via the Python Module, exposed as a symbol in the shared object.\n", | |
"static PyObject *__pyx_pw_46_1func(PyObject *__pyx_self, PyObject *__pyx_arg_a);\n", | |
"```\n", | |
"\n", | |
"`__pyx_pw_46_1func` is the function Python callers interact with via CPython. It is not possible to have access to `__pyx_f_46_func` (which would be the ideal). `__pyx_pw_46_1func` is exported in the shared object and can be loaded with `ctypes` if the type is known in advance but this will hardly be possible because it is bound to the GIL." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"id": "6a2acaeb", | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3 (ipykernel)", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.11.0" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 5 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment