Created
August 18, 2019 12:37
-
-
Save jorisvandenbossche/c90181a330972d5f4564d7c73b70a114 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Test cython algo using the pygeos geometry extension type" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import pygeos" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"a = np.array([pygeos.points(i, i) for i in range(10000)], dtype=object)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([<pygeos.Geometry POINT (0 0)>, <pygeos.Geometry POINT (1 1)>,\n", | |
" <pygeos.Geometry POINT (2 2)>, ...,\n", | |
" <pygeos.Geometry POINT (1e+04 1e+04)>,\n", | |
" <pygeos.Geometry POINT (1e+04 1e+04)>,\n", | |
" <pygeos.Geometry POINT (1e+04 1e+04)>], dtype=object)" | |
] | |
}, | |
"execution_count": 3, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"a" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<pygeos.Geometry POLYGON ((10 10, 10 100, 100 100, 100 10, 10 10))>" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"poly = pygeos.polygons([(10,10), (10,100), (100,100), (100, 10)])\n", | |
"poly" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Checking for a single polygon if it contains a bunch of points:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([False, False, False, ..., False, False, False])" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"res1 = pygeos.contains(poly, a)\n", | |
"res1" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"177 µs ± 9.57 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit pygeos.contains(poly, a)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"---\n", | |
"\n", | |
"Let's now try to do the same using `cython` as illustrative exercise of interacting with the extension type from cython:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%load_ext cython" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"First using plain loop and python API access to the pointers:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.10 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_af616bc89e0c04e5c0a55617cc29fd92.pyx</title>\n", | |
" <style type=\"text/css\">\n", | |
" \n", | |
"body.cython { font-family: courier; font-size: 12; }\n", | |
"\n", | |
".cython.tag { }\n", | |
".cython.line { margin: 0em }\n", | |
".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n", | |
"\n", | |
".cython.line .run { background-color: #B0FFB0; }\n", | |
".cython.line .mis { background-color: #FFB0B0; }\n", | |
".cython.code.run { border-left: 8px solid #B0FFB0; }\n", | |
".cython.code.mis { border-left: 8px solid #FFB0B0; }\n", | |
"\n", | |
".cython.code .py_c_api { color: red; }\n", | |
".cython.code .py_macro_api { color: #FF7000; }\n", | |
".cython.code .pyx_c_api { color: #FF3000; }\n", | |
".cython.code .pyx_macro_api { color: #FF7000; }\n", | |
".cython.code .refnanny { color: #FFA000; }\n", | |
".cython.code .trace { color: #FFA000; }\n", | |
".cython.code .error_goto { color: #FFA000; }\n", | |
"\n", | |
".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n", | |
".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_attr { color: #0000FF; }\n", | |
".cython.code .py_call { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_call { color: #0000FF; }\n", | |
"\n", | |
".cython.score-0 {background-color: #FFFFff;}\n", | |
".cython.score-1 {background-color: #FFFFe7;}\n", | |
".cython.score-2 {background-color: #FFFFd4;}\n", | |
".cython.score-3 {background-color: #FFFFc4;}\n", | |
".cython.score-4 {background-color: #FFFFb6;}\n", | |
".cython.score-5 {background-color: #FFFFaa;}\n", | |
".cython.score-6 {background-color: #FFFF9f;}\n", | |
".cython.score-7 {background-color: #FFFF96;}\n", | |
".cython.score-8 {background-color: #FFFF8d;}\n", | |
".cython.score-9 {background-color: #FFFF86;}\n", | |
".cython.score-10 {background-color: #FFFF7f;}\n", | |
".cython.score-11 {background-color: #FFFF79;}\n", | |
".cython.score-12 {background-color: #FFFF73;}\n", | |
".cython.score-13 {background-color: #FFFF6e;}\n", | |
".cython.score-14 {background-color: #FFFF6a;}\n", | |
".cython.score-15 {background-color: #FFFF66;}\n", | |
".cython.score-16 {background-color: #FFFF62;}\n", | |
".cython.score-17 {background-color: #FFFF5e;}\n", | |
".cython.score-18 {background-color: #FFFF5b;}\n", | |
".cython.score-19 {background-color: #FFFF57;}\n", | |
".cython.score-20 {background-color: #FFFF55;}\n", | |
".cython.score-21 {background-color: #FFFF52;}\n", | |
".cython.score-22 {background-color: #FFFF4f;}\n", | |
".cython.score-23 {background-color: #FFFF4d;}\n", | |
".cython.score-24 {background-color: #FFFF4b;}\n", | |
".cython.score-25 {background-color: #FFFF48;}\n", | |
".cython.score-26 {background-color: #FFFF46;}\n", | |
".cython.score-27 {background-color: #FFFF44;}\n", | |
".cython.score-28 {background-color: #FFFF43;}\n", | |
".cython.score-29 {background-color: #FFFF41;}\n", | |
".cython.score-30 {background-color: #FFFF3f;}\n", | |
".cython.score-31 {background-color: #FFFF3e;}\n", | |
".cython.score-32 {background-color: #FFFF3c;}\n", | |
".cython.score-33 {background-color: #FFFF3b;}\n", | |
".cython.score-34 {background-color: #FFFF39;}\n", | |
".cython.score-35 {background-color: #FFFF38;}\n", | |
".cython.score-36 {background-color: #FFFF37;}\n", | |
".cython.score-37 {background-color: #FFFF36;}\n", | |
".cython.score-38 {background-color: #FFFF35;}\n", | |
".cython.score-39 {background-color: #FFFF34;}\n", | |
".cython.score-40 {background-color: #FFFF33;}\n", | |
".cython.score-41 {background-color: #FFFF32;}\n", | |
".cython.score-42 {background-color: #FFFF31;}\n", | |
".cython.score-43 {background-color: #FFFF30;}\n", | |
".cython.score-44 {background-color: #FFFF2f;}\n", | |
".cython.score-45 {background-color: #FFFF2e;}\n", | |
".cython.score-46 {background-color: #FFFF2d;}\n", | |
".cython.score-47 {background-color: #FFFF2c;}\n", | |
".cython.score-48 {background-color: #FFFF2b;}\n", | |
".cython.score-49 {background-color: #FFFF2b;}\n", | |
".cython.score-50 {background-color: #FFFF2a;}\n", | |
".cython.score-51 {background-color: #FFFF29;}\n", | |
".cython.score-52 {background-color: #FFFF29;}\n", | |
".cython.score-53 {background-color: #FFFF28;}\n", | |
".cython.score-54 {background-color: #FFFF27;}\n", | |
".cython.score-55 {background-color: #FFFF27;}\n", | |
".cython.score-56 {background-color: #FFFF26;}\n", | |
".cython.score-57 {background-color: #FFFF26;}\n", | |
".cython.score-58 {background-color: #FFFF25;}\n", | |
".cython.score-59 {background-color: #FFFF24;}\n", | |
".cython.score-60 {background-color: #FFFF24;}\n", | |
".cython.score-61 {background-color: #FFFF23;}\n", | |
".cython.score-62 {background-color: #FFFF23;}\n", | |
".cython.score-63 {background-color: #FFFF22;}\n", | |
".cython.score-64 {background-color: #FFFF22;}\n", | |
".cython.score-65 {background-color: #FFFF22;}\n", | |
".cython.score-66 {background-color: #FFFF21;}\n", | |
".cython.score-67 {background-color: #FFFF21;}\n", | |
".cython.score-68 {background-color: #FFFF20;}\n", | |
".cython.score-69 {background-color: #FFFF20;}\n", | |
".cython.score-70 {background-color: #FFFF1f;}\n", | |
".cython.score-71 {background-color: #FFFF1f;}\n", | |
".cython.score-72 {background-color: #FFFF1f;}\n", | |
".cython.score-73 {background-color: #FFFF1e;}\n", | |
".cython.score-74 {background-color: #FFFF1e;}\n", | |
".cython.score-75 {background-color: #FFFF1e;}\n", | |
".cython.score-76 {background-color: #FFFF1d;}\n", | |
".cython.score-77 {background-color: #FFFF1d;}\n", | |
".cython.score-78 {background-color: #FFFF1c;}\n", | |
".cython.score-79 {background-color: #FFFF1c;}\n", | |
".cython.score-80 {background-color: #FFFF1c;}\n", | |
".cython.score-81 {background-color: #FFFF1c;}\n", | |
".cython.score-82 {background-color: #FFFF1b;}\n", | |
".cython.score-83 {background-color: #FFFF1b;}\n", | |
".cython.score-84 {background-color: #FFFF1b;}\n", | |
".cython.score-85 {background-color: #FFFF1a;}\n", | |
".cython.score-86 {background-color: #FFFF1a;}\n", | |
".cython.score-87 {background-color: #FFFF1a;}\n", | |
".cython.score-88 {background-color: #FFFF1a;}\n", | |
".cython.score-89 {background-color: #FFFF19;}\n", | |
".cython.score-90 {background-color: #FFFF19;}\n", | |
".cython.score-91 {background-color: #FFFF19;}\n", | |
".cython.score-92 {background-color: #FFFF19;}\n", | |
".cython.score-93 {background-color: #FFFF18;}\n", | |
".cython.score-94 {background-color: #FFFF18;}\n", | |
".cython.score-95 {background-color: #FFFF18;}\n", | |
".cython.score-96 {background-color: #FFFF18;}\n", | |
".cython.score-97 {background-color: #FFFF17;}\n", | |
".cython.score-98 {background-color: #FFFF17;}\n", | |
".cython.score-99 {background-color: #FFFF17;}\n", | |
".cython.score-100 {background-color: #FFFF17;}\n", | |
".cython.score-101 {background-color: #FFFF16;}\n", | |
".cython.score-102 {background-color: #FFFF16;}\n", | |
".cython.score-103 {background-color: #FFFF16;}\n", | |
".cython.score-104 {background-color: #FFFF16;}\n", | |
".cython.score-105 {background-color: #FFFF16;}\n", | |
".cython.score-106 {background-color: #FFFF15;}\n", | |
".cython.score-107 {background-color: #FFFF15;}\n", | |
".cython.score-108 {background-color: #FFFF15;}\n", | |
".cython.score-109 {background-color: #FFFF15;}\n", | |
".cython.score-110 {background-color: #FFFF15;}\n", | |
".cython.score-111 {background-color: #FFFF15;}\n", | |
".cython.score-112 {background-color: #FFFF14;}\n", | |
".cython.score-113 {background-color: #FFFF14;}\n", | |
".cython.score-114 {background-color: #FFFF14;}\n", | |
".cython.score-115 {background-color: #FFFF14;}\n", | |
".cython.score-116 {background-color: #FFFF14;}\n", | |
".cython.score-117 {background-color: #FFFF14;}\n", | |
".cython.score-118 {background-color: #FFFF13;}\n", | |
".cython.score-119 {background-color: #FFFF13;}\n", | |
".cython.score-120 {background-color: #FFFF13;}\n", | |
".cython.score-121 {background-color: #FFFF13;}\n", | |
".cython.score-122 {background-color: #FFFF13;}\n", | |
".cython.score-123 {background-color: #FFFF13;}\n", | |
".cython.score-124 {background-color: #FFFF13;}\n", | |
".cython.score-125 {background-color: #FFFF12;}\n", | |
".cython.score-126 {background-color: #FFFF12;}\n", | |
".cython.score-127 {background-color: #FFFF12;}\n", | |
".cython.score-128 {background-color: #FFFF12;}\n", | |
".cython.score-129 {background-color: #FFFF12;}\n", | |
".cython.score-130 {background-color: #FFFF12;}\n", | |
".cython.score-131 {background-color: #FFFF12;}\n", | |
".cython.score-132 {background-color: #FFFF11;}\n", | |
".cython.score-133 {background-color: #FFFF11;}\n", | |
".cython.score-134 {background-color: #FFFF11;}\n", | |
".cython.score-135 {background-color: #FFFF11;}\n", | |
".cython.score-136 {background-color: #FFFF11;}\n", | |
".cython.score-137 {background-color: #FFFF11;}\n", | |
".cython.score-138 {background-color: #FFFF11;}\n", | |
".cython.score-139 {background-color: #FFFF11;}\n", | |
".cython.score-140 {background-color: #FFFF11;}\n", | |
".cython.score-141 {background-color: #FFFF10;}\n", | |
".cython.score-142 {background-color: #FFFF10;}\n", | |
".cython.score-143 {background-color: #FFFF10;}\n", | |
".cython.score-144 {background-color: #FFFF10;}\n", | |
".cython.score-145 {background-color: #FFFF10;}\n", | |
".cython.score-146 {background-color: #FFFF10;}\n", | |
".cython.score-147 {background-color: #FFFF10;}\n", | |
".cython.score-148 {background-color: #FFFF10;}\n", | |
".cython.score-149 {background-color: #FFFF10;}\n", | |
".cython.score-150 {background-color: #FFFF0f;}\n", | |
".cython.score-151 {background-color: #FFFF0f;}\n", | |
".cython.score-152 {background-color: #FFFF0f;}\n", | |
".cython.score-153 {background-color: #FFFF0f;}\n", | |
".cython.score-154 {background-color: #FFFF0f;}\n", | |
".cython.score-155 {background-color: #FFFF0f;}\n", | |
".cython.score-156 {background-color: #FFFF0f;}\n", | |
".cython.score-157 {background-color: #FFFF0f;}\n", | |
".cython.score-158 {background-color: #FFFF0f;}\n", | |
".cython.score-159 {background-color: #FFFF0f;}\n", | |
".cython.score-160 {background-color: #FFFF0f;}\n", | |
".cython.score-161 {background-color: #FFFF0e;}\n", | |
".cython.score-162 {background-color: #FFFF0e;}\n", | |
".cython.score-163 {background-color: #FFFF0e;}\n", | |
".cython.score-164 {background-color: #FFFF0e;}\n", | |
".cython.score-165 {background-color: #FFFF0e;}\n", | |
".cython.score-166 {background-color: #FFFF0e;}\n", | |
".cython.score-167 {background-color: #FFFF0e;}\n", | |
".cython.score-168 {background-color: #FFFF0e;}\n", | |
".cython.score-169 {background-color: #FFFF0e;}\n", | |
".cython.score-170 {background-color: #FFFF0e;}\n", | |
".cython.score-171 {background-color: #FFFF0e;}\n", | |
".cython.score-172 {background-color: #FFFF0e;}\n", | |
".cython.score-173 {background-color: #FFFF0d;}\n", | |
".cython.score-174 {background-color: #FFFF0d;}\n", | |
".cython.score-175 {background-color: #FFFF0d;}\n", | |
".cython.score-176 {background-color: #FFFF0d;}\n", | |
".cython.score-177 {background-color: #FFFF0d;}\n", | |
".cython.score-178 {background-color: #FFFF0d;}\n", | |
".cython.score-179 {background-color: #FFFF0d;}\n", | |
".cython.score-180 {background-color: #FFFF0d;}\n", | |
".cython.score-181 {background-color: #FFFF0d;}\n", | |
".cython.score-182 {background-color: #FFFF0d;}\n", | |
".cython.score-183 {background-color: #FFFF0d;}\n", | |
".cython.score-184 {background-color: #FFFF0d;}\n", | |
".cython.score-185 {background-color: #FFFF0d;}\n", | |
".cython.score-186 {background-color: #FFFF0d;}\n", | |
".cython.score-187 {background-color: #FFFF0c;}\n", | |
".cython.score-188 {background-color: #FFFF0c;}\n", | |
".cython.score-189 {background-color: #FFFF0c;}\n", | |
".cython.score-190 {background-color: #FFFF0c;}\n", | |
".cython.score-191 {background-color: #FFFF0c;}\n", | |
".cython.score-192 {background-color: #FFFF0c;}\n", | |
".cython.score-193 {background-color: #FFFF0c;}\n", | |
".cython.score-194 {background-color: #FFFF0c;}\n", | |
".cython.score-195 {background-color: #FFFF0c;}\n", | |
".cython.score-196 {background-color: #FFFF0c;}\n", | |
".cython.score-197 {background-color: #FFFF0c;}\n", | |
".cython.score-198 {background-color: #FFFF0c;}\n", | |
".cython.score-199 {background-color: #FFFF0c;}\n", | |
".cython.score-200 {background-color: #FFFF0c;}\n", | |
".cython.score-201 {background-color: #FFFF0c;}\n", | |
".cython.score-202 {background-color: #FFFF0c;}\n", | |
".cython.score-203 {background-color: #FFFF0b;}\n", | |
".cython.score-204 {background-color: #FFFF0b;}\n", | |
".cython.score-205 {background-color: #FFFF0b;}\n", | |
".cython.score-206 {background-color: #FFFF0b;}\n", | |
".cython.score-207 {background-color: #FFFF0b;}\n", | |
".cython.score-208 {background-color: #FFFF0b;}\n", | |
".cython.score-209 {background-color: #FFFF0b;}\n", | |
".cython.score-210 {background-color: #FFFF0b;}\n", | |
".cython.score-211 {background-color: #FFFF0b;}\n", | |
".cython.score-212 {background-color: #FFFF0b;}\n", | |
".cython.score-213 {background-color: #FFFF0b;}\n", | |
".cython.score-214 {background-color: #FFFF0b;}\n", | |
".cython.score-215 {background-color: #FFFF0b;}\n", | |
".cython.score-216 {background-color: #FFFF0b;}\n", | |
".cython.score-217 {background-color: #FFFF0b;}\n", | |
".cython.score-218 {background-color: #FFFF0b;}\n", | |
".cython.score-219 {background-color: #FFFF0b;}\n", | |
".cython.score-220 {background-color: #FFFF0b;}\n", | |
".cython.score-221 {background-color: #FFFF0b;}\n", | |
".cython.score-222 {background-color: #FFFF0a;}\n", | |
".cython.score-223 {background-color: #FFFF0a;}\n", | |
".cython.score-224 {background-color: #FFFF0a;}\n", | |
".cython.score-225 {background-color: #FFFF0a;}\n", | |
".cython.score-226 {background-color: #FFFF0a;}\n", | |
".cython.score-227 {background-color: #FFFF0a;}\n", | |
".cython.score-228 {background-color: #FFFF0a;}\n", | |
".cython.score-229 {background-color: #FFFF0a;}\n", | |
".cython.score-230 {background-color: #FFFF0a;}\n", | |
".cython.score-231 {background-color: #FFFF0a;}\n", | |
".cython.score-232 {background-color: #FFFF0a;}\n", | |
".cython.score-233 {background-color: #FFFF0a;}\n", | |
".cython.score-234 {background-color: #FFFF0a;}\n", | |
".cython.score-235 {background-color: #FFFF0a;}\n", | |
".cython.score-236 {background-color: #FFFF0a;}\n", | |
".cython.score-237 {background-color: #FFFF0a;}\n", | |
".cython.score-238 {background-color: #FFFF0a;}\n", | |
".cython.score-239 {background-color: #FFFF0a;}\n", | |
".cython.score-240 {background-color: #FFFF0a;}\n", | |
".cython.score-241 {background-color: #FFFF0a;}\n", | |
".cython.score-242 {background-color: #FFFF0a;}\n", | |
".cython.score-243 {background-color: #FFFF0a;}\n", | |
".cython.score-244 {background-color: #FFFF0a;}\n", | |
".cython.score-245 {background-color: #FFFF0a;}\n", | |
".cython.score-246 {background-color: #FFFF09;}\n", | |
".cython.score-247 {background-color: #FFFF09;}\n", | |
".cython.score-248 {background-color: #FFFF09;}\n", | |
".cython.score-249 {background-color: #FFFF09;}\n", | |
".cython.score-250 {background-color: #FFFF09;}\n", | |
".cython.score-251 {background-color: #FFFF09;}\n", | |
".cython.score-252 {background-color: #FFFF09;}\n", | |
".cython.score-253 {background-color: #FFFF09;}\n", | |
".cython.score-254 {background-color: #FFFF09;}\n", | |
".cython .hll { background-color: #ffffcc }\n", | |
".cython { background: #f8f8f8; }\n", | |
".cython .c { color: #408080; font-style: italic } /* Comment */\n", | |
".cython .err { border: 1px solid #FF0000 } /* Error */\n", | |
".cython .k { color: #008000; font-weight: bold } /* Keyword */\n", | |
".cython .o { color: #666666 } /* Operator */\n", | |
".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", | |
".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", | |
".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n", | |
".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", | |
".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", | |
".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n", | |
".cython .gd { color: #A00000 } /* Generic.Deleted */\n", | |
".cython .ge { font-style: italic } /* Generic.Emph */\n", | |
".cython .gr { color: #FF0000 } /* Generic.Error */\n", | |
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", | |
".cython .gi { color: #00A000 } /* Generic.Inserted */\n", | |
".cython .go { color: #888888 } /* Generic.Output */\n", | |
".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", | |
".cython .gs { font-weight: bold } /* Generic.Strong */\n", | |
".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", | |
".cython .gt { color: #0044DD } /* Generic.Traceback */\n", | |
".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n", | |
".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n", | |
".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n", | |
".cython .kp { color: #008000 } /* Keyword.Pseudo */\n", | |
".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n", | |
".cython .kt { color: #B00040 } /* Keyword.Type */\n", | |
".cython .m { color: #666666 } /* Literal.Number */\n", | |
".cython .s { color: #BA2121 } /* Literal.String */\n", | |
".cython .na { color: #7D9029 } /* Name.Attribute */\n", | |
".cython .nb { color: #008000 } /* Name.Builtin */\n", | |
".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", | |
".cython .no { color: #880000 } /* Name.Constant */\n", | |
".cython .nd { color: #AA22FF } /* Name.Decorator */\n", | |
".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", | |
".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", | |
".cython .nf { color: #0000FF } /* Name.Function */\n", | |
".cython .nl { color: #A0A000 } /* Name.Label */\n", | |
".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", | |
".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", | |
".cython .nv { color: #19177C } /* Name.Variable */\n", | |
".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n", | |
".cython .w { color: #bbbbbb } /* Text.Whitespace */\n", | |
".cython .mb { color: #666666 } /* Literal.Number.Bin */\n", | |
".cython .mf { color: #666666 } /* Literal.Number.Float */\n", | |
".cython .mh { color: #666666 } /* Literal.Number.Hex */\n", | |
".cython .mi { color: #666666 } /* Literal.Number.Integer */\n", | |
".cython .mo { color: #666666 } /* Literal.Number.Oct */\n", | |
".cython .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: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", | |
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", | |
".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", | |
".cython .sx { color: #008000 } /* Literal.String.Other */\n", | |
".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n", | |
".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n", | |
".cython .ss { color: #19177C } /* Literal.String.Symbol */\n", | |
".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", | |
".cython .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.10</span></p>\n", | |
"<p>\n", | |
" <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n", | |
" Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n", | |
"</p>\n", | |
"<div class=\"cython\"><pre class=\"cython line score-0\"> <span class=\"\">01</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">02</span>: <span class=\"k\">import</span> <span class=\"nn\">cython</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, 2, __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, 2, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">03</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">04</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __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_np, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 4, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"geos_c.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: <span class=\"k\">ctypedef</span> <span class=\"n\">void</span> <span class=\"o\">*</span><span class=\"n\">GEOSContextHandle_t</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">struct</span> <span class=\"nc\">GEOSGeometry</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">10</span>: <span class=\"n\">char</span> <span class=\"n\">GEOSContains_r</span><span class=\"p\">(</span><span class=\"n\">GEOSContextHandle_t</span><span class=\"p\">,</span> <span class=\"n\">const</span> <span class=\"n\">GEOSGeometry</span><span class=\"o\">*</span><span class=\"p\">,</span> <span class=\"n\">const</span> <span class=\"n\">GEOSGeometry</span><span class=\"o\">*</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">11</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">12</span>: </pre>\n", | |
"<pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">13</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSContextHandle_t</span> <span class=\"nf\">get_geos_context_handle</span><span class=\"p\">():</span></pre>\n", | |
"<pre class='cython code score-5 '>static GEOSContextHandle_t __pyx_f_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_get_geos_context_handle(void) {\n", | |
" PyObject *__pyx_v_lgeos = NULL;\n", | |
" __pyx_t_5numpy_uintp_t __pyx_v_handle;\n", | |
" GEOSContextHandle_t __pyx_r;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"get_geos_context_handle\", 0);\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_2);\n", | |
" <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>(\"_cython_magic_af616bc89e0c04e5c0a55617cc29fd92.get_geos_context_handle\", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);\n", | |
" __pyx_r = 0;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_lgeos);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"c\"># Note: This requires that lgeos is defined, so needs to be imported as:</span></pre>\n", | |
"<pre class=\"cython line score-15\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">15</span>: <span class=\"k\">from</span> <span class=\"nn\">shapely.geos</span> <span class=\"k\">import</span> <span class=\"n\">lgeos</span></pre>\n", | |
"<pre class='cython code score-15 '> __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __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_lgeos);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_lgeos);\n", | |
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, 0, __pyx_n_s_lgeos);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_shapely_geos, __pyx_t_1, 0);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __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_lgeos);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1);\n", | |
" __pyx_v_lgeos = __pyx_t_1;\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-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">16</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">uintp_t</span> <span class=\"nf\">handle</span> <span class=\"o\">=</span> <span class=\"n\">lgeos</span><span class=\"o\">.</span><span class=\"n\">geos_handle</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_lgeos, __pyx_n_s_geos_handle);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_size_t</span>(__pyx_t_2); if (unlikely((__pyx_t_3 == ((npy_uintp)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" __pyx_v_handle = __pyx_t_3;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">17</span>: <span class=\"k\">return</span> <span class=\"o\"><</span><span class=\"n\">GEOSContextHandle_t</span><span class=\"o\">></span><span class=\"n\">handle</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_r = ((GEOSContextHandle_t)__pyx_v_handle);\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">18</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">19</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">20</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">boundscheck</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">21</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">wraparound</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-52\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">22</span>: <span class=\"k\">def</span> <span class=\"nf\">contains_cy</span><span class=\"p\">(</span><span class=\"n\">array</span><span class=\"p\">,</span> <span class=\"n\">geometry</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-52 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_1contains_cy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_1contains_cy = {\"contains_cy\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_1contains_cy, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_1contains_cy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" PyObject *__pyx_v_array = 0;\n", | |
" PyObject *__pyx_v_geometry = 0;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"contains_cy (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_array,&__pyx_n_s_geometry,0};\n", | |
" PyObject* values[2] = {0,0};\n", | |
" if (unlikely(__pyx_kwds)) {\n", | |
" Py_ssize_t kw_args;\n", | |
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n", | |
" switch (pos_args) {\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" 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_array)) != 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_geometry)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"contains_cy\", 1, 2, 2, 1); <span class='error_goto'>__PYX_ERR(0, 22, __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, \"contains_cy\") < 0)) <span class='error_goto'>__PYX_ERR(0, 22, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n", | |
" goto __pyx_L5_argtuple_error;\n", | |
" } else {\n", | |
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" }\n", | |
" __pyx_v_array = values[0];\n", | |
" __pyx_v_geometry = values[1];\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"contains_cy\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 22, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_af616bc89e0c04e5c0a55617cc29fd92.contains_cy\", __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_af616bc89e0c04e5c0a55617cc29fd92_contains_cy(__pyx_self, __pyx_v_array, __pyx_v_geometry);\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_af616bc89e0c04e5c0a55617cc29fd92_contains_cy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_array, PyObject *__pyx_v_geometry) {\n", | |
" Py_ssize_t __pyx_v_idx;\n", | |
" unsigned int __pyx_v_n;\n", | |
" PyArrayObject *__pyx_v_result = 0;\n", | |
" GEOSContextHandle_t __pyx_v_geos_handle;\n", | |
" GEOSGeometry *__pyx_v_geom1;\n", | |
" GEOSGeometry *__pyx_v_geom2;\n", | |
" __pyx_t_5numpy_intp_t __pyx_v_geos_geom;\n", | |
" __pyx_t_5numpy_intp_t __pyx_v_geos_geom1;\n", | |
" PyObject *__pyx_v_g = NULL;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_result;\n", | |
" __Pyx_Buffer __pyx_pybuffer_result;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"contains_cy\", 0);\n", | |
" __pyx_pybuffer_result.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_result.refcount = 0;\n", | |
" __pyx_pybuffernd_result.data = NULL;\n", | |
" __pyx_pybuffernd_result.rcbuffer = &__pyx_pybuffer_result;\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_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_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" __Pyx_PyThreadState_declare\n", | |
" __Pyx_PyThreadState_assign\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_af616bc89e0c04e5c0a55617cc29fd92.contains_cy\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_result);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_g);\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__8 = <span class='py_c_api'>PyTuple_Pack</span>(11, __pyx_n_s_array, __pyx_n_s_geometry, __pyx_n_s_idx, __pyx_n_s_n, __pyx_n_s_result, __pyx_n_s_geos_handle, __pyx_n_s_geom1, __pyx_n_s_geom2, __pyx_n_s_geos_geom, __pyx_n_s_geos_geom1, __pyx_n_s_g);<span class='error_goto'> if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 22, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__8);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__8);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_1contains_cy, NULL, __pyx_n_s_cython_magic_af616bc89e0c04e5c0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __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_contains_cy, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 22, __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=\"\">23</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">24</span>: <span class=\"k\">cdef</span> <span class=\"kt\">Py_ssize_t</span> <span class=\"nf\">idx</span></pre>\n", | |
"<pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">25</span>: <span class=\"k\">cdef</span> <span class=\"kt\">unsigned</span> <span class=\"kt\">int</span> <span class=\"nf\">n</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">size</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_array, __pyx_n_s_size);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 25, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_As_unsigned_int</span>(__pyx_t_1); if (unlikely((__pyx_t_2 == (unsigned int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 25, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_v_n = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-36\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">26</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">ndarray</span>[<span class=\"kt\">np</span>.<span class=\"nf\">uint8_t</span><span class=\"p\">,</span> <span class=\"nf\">ndim</span><span class=\"o\">=</span><span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"n\">cast</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">]</span> <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">empty</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uint8</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-36 '> <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_1, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_empty);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\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_PyInt_From_unsigned_int</span>(__pyx_v_n);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_5, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s_uint8);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 26, __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_5); __pyx_t_5 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_6) < 0) <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\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_Call</span>(__pyx_t_3, __pyx_t_4, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 26, __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_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" if (!(likely(((__pyx_t_6) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 1, __pyx_stack) == -1)) {\n", | |
" __pyx_v_result = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_result.rcbuffer->pybuffer.buf = NULL;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 26, __pyx_L1_error)</span>\n", | |
" } else {__pyx_pybuffernd_result.diminfo[0].strides = __pyx_pybuffernd_result.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_result.diminfo[0].shape = __pyx_pybuffernd_result.rcbuffer->pybuffer.shape[0];\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_7 = 0;\n", | |
" __pyx_v_result = ((PyArrayObject *)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">27</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">28</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSContextHandle_t</span> <span class=\"nf\">geos_handle</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">29</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSGeometry</span> *<span class=\"nf\">geom1</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">30</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSGeometry</span> *<span class=\"nf\">geom2</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">31</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">geos_geom</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">32</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">geos_geom1</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">33</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\">geos_handle</span> <span class=\"o\">=</span> <span class=\"n\">get_geos_context_handle</span><span class=\"p\">()</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geos_handle = __pyx_f_46_cython_magic_af616bc89e0c04e5c0a55617cc29fd92_get_geos_context_handle();\n", | |
"</pre><pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">35</span>: <span class=\"n\">geos_geom1</span> <span class=\"o\">=</span> <span class=\"n\">geometry</span><span class=\"o\">.</span><span class=\"n\">_ptr</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_geometry, __pyx_n_s_ptr);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 35, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_8 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_6); if (unlikely((__pyx_t_8 == ((npy_intp)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 35, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_v_geos_geom1 = __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=\"\">36</span>: <span class=\"n\">geom1</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GEOSGeometry</span> <span class=\"o\">*></span> <span class=\"n\">geos_geom1</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geom1 = ((GEOSGeometry *)__pyx_v_geos_geom1);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">37</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">38</span>: <span class=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">xrange</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_2 = __pyx_v_n;\n", | |
" __pyx_t_9 = __pyx_t_2;\n", | |
" for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) {\n", | |
" __pyx_v_idx = __pyx_t_10;\n", | |
"</pre><pre class=\"cython line score-3\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">39</span>: <span class=\"n\">g</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-3 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetItemInt</span>(__pyx_v_array, __pyx_v_idx, Py_ssize_t, 1, PyInt_FromSsize_t, 0, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 39, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF_SET</span>(__pyx_v_g, __pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">40</span>: <span class=\"n\">geos_geom</span> <span class=\"o\">=</span> <span class=\"n\">g</span><span class=\"o\">.</span><span class=\"n\">_ptr</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_g, __pyx_n_s_ptr);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 40, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_8 = <span class='pyx_c_api'>__Pyx_PyInt_As_Py_intptr_t</span>(__pyx_t_6); if (unlikely((__pyx_t_8 == ((npy_intp)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 40, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" __pyx_v_geos_geom = __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=\"\">41</span>: <span class=\"n\">geom2</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GEOSGeometry</span> <span class=\"o\">*></span><span class=\"n\">geos_geom</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geom2 = ((GEOSGeometry *)__pyx_v_geos_geom);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">42</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">43</span>: <span class=\"c\"># Put the result of whether the point is "contained" into the result array. </span></pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">44</span>: <span class=\"n\">result</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uint8_t</span><span class=\"o\">></span> <span class=\"n\">GEOSContains_r</span><span class=\"p\">(</span><span class=\"n\">geos_handle</span><span class=\"p\">,</span> <span class=\"n\">geom1</span><span class=\"p\">,</span> <span class=\"n\">geom2</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_11 = __pyx_v_idx;\n", | |
" *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_result.rcbuffer->pybuffer.buf, __pyx_t_11, __pyx_pybuffernd_result.diminfo[0].strides) = ((__pyx_t_5numpy_uint8_t)GEOSContains_r(__pyx_v_geos_handle, __pyx_v_geom1, __pyx_v_geom2));\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">45</span>: </pre>\n", | |
"<pre class=\"cython line score-20\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">46</span>: <span class=\"k\">return</span> <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">view</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">bool</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-20 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_result), __pyx_n_s_view);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_4, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_bool);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) <span class='error_goto'>__PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_empty_tuple, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 46, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_r = __pyx_t_3;\n", | |
" __pyx_t_3 = 0;\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 -l geos_c -L /home/joris/miniconda3/envs/geo-dev/lib -I /home/joris/miniconda3/envs/geo-dev/include -a\n", | |
"\n", | |
"import cython\n", | |
"\n", | |
"import numpy as np\n", | |
"cimport numpy as np\n", | |
"\n", | |
"cdef extern from \"geos_c.h\":\n", | |
" ctypedef void *GEOSContextHandle_t\n", | |
" ctypedef struct GEOSGeometry\n", | |
" char GEOSContains_r(GEOSContextHandle_t, const GEOSGeometry*, const GEOSGeometry*) nogil\n", | |
"\n", | |
"\n", | |
"cdef GEOSContextHandle_t get_geos_context_handle():\n", | |
" # Note: This requires that lgeos is defined, so needs to be imported as:\n", | |
" from shapely.geos import lgeos\n", | |
" cdef np.uintp_t handle = lgeos.geos_handle\n", | |
" return <GEOSContextHandle_t>handle\n", | |
"\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def contains_cy(array, geometry):\n", | |
" \n", | |
" cdef Py_ssize_t idx\n", | |
" cdef unsigned int n = array.size\n", | |
" cdef np.ndarray[np.uint8_t, ndim=1, cast=True] result = np.empty(n, dtype=np.uint8)\n", | |
"\n", | |
" cdef GEOSContextHandle_t geos_handle\n", | |
" cdef GEOSGeometry *geom1\n", | |
" cdef GEOSGeometry *geom2\n", | |
" cdef np.intp_t geos_geom\n", | |
" cdef np.intp_t geos_geom1\n", | |
"\n", | |
" geos_handle = get_geos_context_handle()\n", | |
" geos_geom1 = geometry._ptr \n", | |
" geom1 = <GEOSGeometry *> geos_geom1\n", | |
" \n", | |
" for idx in xrange(n):\n", | |
" g = array[idx]\n", | |
" geos_geom = g._ptr\n", | |
" geom2 = <GEOSGeometry *>geos_geom\n", | |
"\n", | |
" # Put the result of whether the point is \"contained\" into the result array. \n", | |
" result[idx] = <np.uint8_t> GEOSContains_r(geos_handle, geom1, geom2)\n", | |
"\n", | |
" return result.view(dtype=np.bool)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([False, False, False, ..., False, False, False])" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"res2 = contains_cy(a, poly)\n", | |
"res2" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"np.testing.assert_allclose(res1, res2)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"459 µs ± 27.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit contains_cy(a, poly)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"This is already a lot faster than if we would do that in pure python with shapely, but it is still quite a bit slower than pygeos' ufunc due to the python interaction for getting the element out of the array and getting the `_ptr` pointer to the GEOS object.\n", | |
"\n", | |
"But since the pygeos.Geometry object is a python extension type, we can access its struct from cython without python overhead.\n", | |
"\n", | |
"I created a `src/pygeos.h` with the following content (the current definition is in `src/ufuncs.c`):\n", | |
"\n", | |
"```c\n", | |
"#include <Python.h>\n", | |
"\n", | |
"typedef struct {\n", | |
" PyObject_HEAD\n", | |
" void *ptr;\n", | |
"} GeometryObject;\n", | |
"```\n", | |
"\n", | |
"so we can let cython know about this:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<!DOCTYPE html>\n", | |
"<!-- Generated by Cython 0.29.10 -->\n", | |
"<html>\n", | |
"<head>\n", | |
" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n", | |
" <title>Cython: _cython_magic_a9838a4c03c47d83fcfca3e26fdbda41.pyx</title>\n", | |
" <style type=\"text/css\">\n", | |
" \n", | |
"body.cython { font-family: courier; font-size: 12; }\n", | |
"\n", | |
".cython.tag { }\n", | |
".cython.line { margin: 0em }\n", | |
".cython.code { font-size: 9; color: #444444; display: none; margin: 0px 0px 0px 8px; border-left: 8px none; }\n", | |
"\n", | |
".cython.line .run { background-color: #B0FFB0; }\n", | |
".cython.line .mis { background-color: #FFB0B0; }\n", | |
".cython.code.run { border-left: 8px solid #B0FFB0; }\n", | |
".cython.code.mis { border-left: 8px solid #FFB0B0; }\n", | |
"\n", | |
".cython.code .py_c_api { color: red; }\n", | |
".cython.code .py_macro_api { color: #FF7000; }\n", | |
".cython.code .pyx_c_api { color: #FF3000; }\n", | |
".cython.code .pyx_macro_api { color: #FF7000; }\n", | |
".cython.code .refnanny { color: #FFA000; }\n", | |
".cython.code .trace { color: #FFA000; }\n", | |
".cython.code .error_goto { color: #FFA000; }\n", | |
"\n", | |
".cython.code .coerce { color: #008000; border: 1px dotted #008000 }\n", | |
".cython.code .py_attr { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_attr { color: #0000FF; }\n", | |
".cython.code .py_call { color: #FF0000; font-weight: bold; }\n", | |
".cython.code .c_call { color: #0000FF; }\n", | |
"\n", | |
".cython.score-0 {background-color: #FFFFff;}\n", | |
".cython.score-1 {background-color: #FFFFe7;}\n", | |
".cython.score-2 {background-color: #FFFFd4;}\n", | |
".cython.score-3 {background-color: #FFFFc4;}\n", | |
".cython.score-4 {background-color: #FFFFb6;}\n", | |
".cython.score-5 {background-color: #FFFFaa;}\n", | |
".cython.score-6 {background-color: #FFFF9f;}\n", | |
".cython.score-7 {background-color: #FFFF96;}\n", | |
".cython.score-8 {background-color: #FFFF8d;}\n", | |
".cython.score-9 {background-color: #FFFF86;}\n", | |
".cython.score-10 {background-color: #FFFF7f;}\n", | |
".cython.score-11 {background-color: #FFFF79;}\n", | |
".cython.score-12 {background-color: #FFFF73;}\n", | |
".cython.score-13 {background-color: #FFFF6e;}\n", | |
".cython.score-14 {background-color: #FFFF6a;}\n", | |
".cython.score-15 {background-color: #FFFF66;}\n", | |
".cython.score-16 {background-color: #FFFF62;}\n", | |
".cython.score-17 {background-color: #FFFF5e;}\n", | |
".cython.score-18 {background-color: #FFFF5b;}\n", | |
".cython.score-19 {background-color: #FFFF57;}\n", | |
".cython.score-20 {background-color: #FFFF55;}\n", | |
".cython.score-21 {background-color: #FFFF52;}\n", | |
".cython.score-22 {background-color: #FFFF4f;}\n", | |
".cython.score-23 {background-color: #FFFF4d;}\n", | |
".cython.score-24 {background-color: #FFFF4b;}\n", | |
".cython.score-25 {background-color: #FFFF48;}\n", | |
".cython.score-26 {background-color: #FFFF46;}\n", | |
".cython.score-27 {background-color: #FFFF44;}\n", | |
".cython.score-28 {background-color: #FFFF43;}\n", | |
".cython.score-29 {background-color: #FFFF41;}\n", | |
".cython.score-30 {background-color: #FFFF3f;}\n", | |
".cython.score-31 {background-color: #FFFF3e;}\n", | |
".cython.score-32 {background-color: #FFFF3c;}\n", | |
".cython.score-33 {background-color: #FFFF3b;}\n", | |
".cython.score-34 {background-color: #FFFF39;}\n", | |
".cython.score-35 {background-color: #FFFF38;}\n", | |
".cython.score-36 {background-color: #FFFF37;}\n", | |
".cython.score-37 {background-color: #FFFF36;}\n", | |
".cython.score-38 {background-color: #FFFF35;}\n", | |
".cython.score-39 {background-color: #FFFF34;}\n", | |
".cython.score-40 {background-color: #FFFF33;}\n", | |
".cython.score-41 {background-color: #FFFF32;}\n", | |
".cython.score-42 {background-color: #FFFF31;}\n", | |
".cython.score-43 {background-color: #FFFF30;}\n", | |
".cython.score-44 {background-color: #FFFF2f;}\n", | |
".cython.score-45 {background-color: #FFFF2e;}\n", | |
".cython.score-46 {background-color: #FFFF2d;}\n", | |
".cython.score-47 {background-color: #FFFF2c;}\n", | |
".cython.score-48 {background-color: #FFFF2b;}\n", | |
".cython.score-49 {background-color: #FFFF2b;}\n", | |
".cython.score-50 {background-color: #FFFF2a;}\n", | |
".cython.score-51 {background-color: #FFFF29;}\n", | |
".cython.score-52 {background-color: #FFFF29;}\n", | |
".cython.score-53 {background-color: #FFFF28;}\n", | |
".cython.score-54 {background-color: #FFFF27;}\n", | |
".cython.score-55 {background-color: #FFFF27;}\n", | |
".cython.score-56 {background-color: #FFFF26;}\n", | |
".cython.score-57 {background-color: #FFFF26;}\n", | |
".cython.score-58 {background-color: #FFFF25;}\n", | |
".cython.score-59 {background-color: #FFFF24;}\n", | |
".cython.score-60 {background-color: #FFFF24;}\n", | |
".cython.score-61 {background-color: #FFFF23;}\n", | |
".cython.score-62 {background-color: #FFFF23;}\n", | |
".cython.score-63 {background-color: #FFFF22;}\n", | |
".cython.score-64 {background-color: #FFFF22;}\n", | |
".cython.score-65 {background-color: #FFFF22;}\n", | |
".cython.score-66 {background-color: #FFFF21;}\n", | |
".cython.score-67 {background-color: #FFFF21;}\n", | |
".cython.score-68 {background-color: #FFFF20;}\n", | |
".cython.score-69 {background-color: #FFFF20;}\n", | |
".cython.score-70 {background-color: #FFFF1f;}\n", | |
".cython.score-71 {background-color: #FFFF1f;}\n", | |
".cython.score-72 {background-color: #FFFF1f;}\n", | |
".cython.score-73 {background-color: #FFFF1e;}\n", | |
".cython.score-74 {background-color: #FFFF1e;}\n", | |
".cython.score-75 {background-color: #FFFF1e;}\n", | |
".cython.score-76 {background-color: #FFFF1d;}\n", | |
".cython.score-77 {background-color: #FFFF1d;}\n", | |
".cython.score-78 {background-color: #FFFF1c;}\n", | |
".cython.score-79 {background-color: #FFFF1c;}\n", | |
".cython.score-80 {background-color: #FFFF1c;}\n", | |
".cython.score-81 {background-color: #FFFF1c;}\n", | |
".cython.score-82 {background-color: #FFFF1b;}\n", | |
".cython.score-83 {background-color: #FFFF1b;}\n", | |
".cython.score-84 {background-color: #FFFF1b;}\n", | |
".cython.score-85 {background-color: #FFFF1a;}\n", | |
".cython.score-86 {background-color: #FFFF1a;}\n", | |
".cython.score-87 {background-color: #FFFF1a;}\n", | |
".cython.score-88 {background-color: #FFFF1a;}\n", | |
".cython.score-89 {background-color: #FFFF19;}\n", | |
".cython.score-90 {background-color: #FFFF19;}\n", | |
".cython.score-91 {background-color: #FFFF19;}\n", | |
".cython.score-92 {background-color: #FFFF19;}\n", | |
".cython.score-93 {background-color: #FFFF18;}\n", | |
".cython.score-94 {background-color: #FFFF18;}\n", | |
".cython.score-95 {background-color: #FFFF18;}\n", | |
".cython.score-96 {background-color: #FFFF18;}\n", | |
".cython.score-97 {background-color: #FFFF17;}\n", | |
".cython.score-98 {background-color: #FFFF17;}\n", | |
".cython.score-99 {background-color: #FFFF17;}\n", | |
".cython.score-100 {background-color: #FFFF17;}\n", | |
".cython.score-101 {background-color: #FFFF16;}\n", | |
".cython.score-102 {background-color: #FFFF16;}\n", | |
".cython.score-103 {background-color: #FFFF16;}\n", | |
".cython.score-104 {background-color: #FFFF16;}\n", | |
".cython.score-105 {background-color: #FFFF16;}\n", | |
".cython.score-106 {background-color: #FFFF15;}\n", | |
".cython.score-107 {background-color: #FFFF15;}\n", | |
".cython.score-108 {background-color: #FFFF15;}\n", | |
".cython.score-109 {background-color: #FFFF15;}\n", | |
".cython.score-110 {background-color: #FFFF15;}\n", | |
".cython.score-111 {background-color: #FFFF15;}\n", | |
".cython.score-112 {background-color: #FFFF14;}\n", | |
".cython.score-113 {background-color: #FFFF14;}\n", | |
".cython.score-114 {background-color: #FFFF14;}\n", | |
".cython.score-115 {background-color: #FFFF14;}\n", | |
".cython.score-116 {background-color: #FFFF14;}\n", | |
".cython.score-117 {background-color: #FFFF14;}\n", | |
".cython.score-118 {background-color: #FFFF13;}\n", | |
".cython.score-119 {background-color: #FFFF13;}\n", | |
".cython.score-120 {background-color: #FFFF13;}\n", | |
".cython.score-121 {background-color: #FFFF13;}\n", | |
".cython.score-122 {background-color: #FFFF13;}\n", | |
".cython.score-123 {background-color: #FFFF13;}\n", | |
".cython.score-124 {background-color: #FFFF13;}\n", | |
".cython.score-125 {background-color: #FFFF12;}\n", | |
".cython.score-126 {background-color: #FFFF12;}\n", | |
".cython.score-127 {background-color: #FFFF12;}\n", | |
".cython.score-128 {background-color: #FFFF12;}\n", | |
".cython.score-129 {background-color: #FFFF12;}\n", | |
".cython.score-130 {background-color: #FFFF12;}\n", | |
".cython.score-131 {background-color: #FFFF12;}\n", | |
".cython.score-132 {background-color: #FFFF11;}\n", | |
".cython.score-133 {background-color: #FFFF11;}\n", | |
".cython.score-134 {background-color: #FFFF11;}\n", | |
".cython.score-135 {background-color: #FFFF11;}\n", | |
".cython.score-136 {background-color: #FFFF11;}\n", | |
".cython.score-137 {background-color: #FFFF11;}\n", | |
".cython.score-138 {background-color: #FFFF11;}\n", | |
".cython.score-139 {background-color: #FFFF11;}\n", | |
".cython.score-140 {background-color: #FFFF11;}\n", | |
".cython.score-141 {background-color: #FFFF10;}\n", | |
".cython.score-142 {background-color: #FFFF10;}\n", | |
".cython.score-143 {background-color: #FFFF10;}\n", | |
".cython.score-144 {background-color: #FFFF10;}\n", | |
".cython.score-145 {background-color: #FFFF10;}\n", | |
".cython.score-146 {background-color: #FFFF10;}\n", | |
".cython.score-147 {background-color: #FFFF10;}\n", | |
".cython.score-148 {background-color: #FFFF10;}\n", | |
".cython.score-149 {background-color: #FFFF10;}\n", | |
".cython.score-150 {background-color: #FFFF0f;}\n", | |
".cython.score-151 {background-color: #FFFF0f;}\n", | |
".cython.score-152 {background-color: #FFFF0f;}\n", | |
".cython.score-153 {background-color: #FFFF0f;}\n", | |
".cython.score-154 {background-color: #FFFF0f;}\n", | |
".cython.score-155 {background-color: #FFFF0f;}\n", | |
".cython.score-156 {background-color: #FFFF0f;}\n", | |
".cython.score-157 {background-color: #FFFF0f;}\n", | |
".cython.score-158 {background-color: #FFFF0f;}\n", | |
".cython.score-159 {background-color: #FFFF0f;}\n", | |
".cython.score-160 {background-color: #FFFF0f;}\n", | |
".cython.score-161 {background-color: #FFFF0e;}\n", | |
".cython.score-162 {background-color: #FFFF0e;}\n", | |
".cython.score-163 {background-color: #FFFF0e;}\n", | |
".cython.score-164 {background-color: #FFFF0e;}\n", | |
".cython.score-165 {background-color: #FFFF0e;}\n", | |
".cython.score-166 {background-color: #FFFF0e;}\n", | |
".cython.score-167 {background-color: #FFFF0e;}\n", | |
".cython.score-168 {background-color: #FFFF0e;}\n", | |
".cython.score-169 {background-color: #FFFF0e;}\n", | |
".cython.score-170 {background-color: #FFFF0e;}\n", | |
".cython.score-171 {background-color: #FFFF0e;}\n", | |
".cython.score-172 {background-color: #FFFF0e;}\n", | |
".cython.score-173 {background-color: #FFFF0d;}\n", | |
".cython.score-174 {background-color: #FFFF0d;}\n", | |
".cython.score-175 {background-color: #FFFF0d;}\n", | |
".cython.score-176 {background-color: #FFFF0d;}\n", | |
".cython.score-177 {background-color: #FFFF0d;}\n", | |
".cython.score-178 {background-color: #FFFF0d;}\n", | |
".cython.score-179 {background-color: #FFFF0d;}\n", | |
".cython.score-180 {background-color: #FFFF0d;}\n", | |
".cython.score-181 {background-color: #FFFF0d;}\n", | |
".cython.score-182 {background-color: #FFFF0d;}\n", | |
".cython.score-183 {background-color: #FFFF0d;}\n", | |
".cython.score-184 {background-color: #FFFF0d;}\n", | |
".cython.score-185 {background-color: #FFFF0d;}\n", | |
".cython.score-186 {background-color: #FFFF0d;}\n", | |
".cython.score-187 {background-color: #FFFF0c;}\n", | |
".cython.score-188 {background-color: #FFFF0c;}\n", | |
".cython.score-189 {background-color: #FFFF0c;}\n", | |
".cython.score-190 {background-color: #FFFF0c;}\n", | |
".cython.score-191 {background-color: #FFFF0c;}\n", | |
".cython.score-192 {background-color: #FFFF0c;}\n", | |
".cython.score-193 {background-color: #FFFF0c;}\n", | |
".cython.score-194 {background-color: #FFFF0c;}\n", | |
".cython.score-195 {background-color: #FFFF0c;}\n", | |
".cython.score-196 {background-color: #FFFF0c;}\n", | |
".cython.score-197 {background-color: #FFFF0c;}\n", | |
".cython.score-198 {background-color: #FFFF0c;}\n", | |
".cython.score-199 {background-color: #FFFF0c;}\n", | |
".cython.score-200 {background-color: #FFFF0c;}\n", | |
".cython.score-201 {background-color: #FFFF0c;}\n", | |
".cython.score-202 {background-color: #FFFF0c;}\n", | |
".cython.score-203 {background-color: #FFFF0b;}\n", | |
".cython.score-204 {background-color: #FFFF0b;}\n", | |
".cython.score-205 {background-color: #FFFF0b;}\n", | |
".cython.score-206 {background-color: #FFFF0b;}\n", | |
".cython.score-207 {background-color: #FFFF0b;}\n", | |
".cython.score-208 {background-color: #FFFF0b;}\n", | |
".cython.score-209 {background-color: #FFFF0b;}\n", | |
".cython.score-210 {background-color: #FFFF0b;}\n", | |
".cython.score-211 {background-color: #FFFF0b;}\n", | |
".cython.score-212 {background-color: #FFFF0b;}\n", | |
".cython.score-213 {background-color: #FFFF0b;}\n", | |
".cython.score-214 {background-color: #FFFF0b;}\n", | |
".cython.score-215 {background-color: #FFFF0b;}\n", | |
".cython.score-216 {background-color: #FFFF0b;}\n", | |
".cython.score-217 {background-color: #FFFF0b;}\n", | |
".cython.score-218 {background-color: #FFFF0b;}\n", | |
".cython.score-219 {background-color: #FFFF0b;}\n", | |
".cython.score-220 {background-color: #FFFF0b;}\n", | |
".cython.score-221 {background-color: #FFFF0b;}\n", | |
".cython.score-222 {background-color: #FFFF0a;}\n", | |
".cython.score-223 {background-color: #FFFF0a;}\n", | |
".cython.score-224 {background-color: #FFFF0a;}\n", | |
".cython.score-225 {background-color: #FFFF0a;}\n", | |
".cython.score-226 {background-color: #FFFF0a;}\n", | |
".cython.score-227 {background-color: #FFFF0a;}\n", | |
".cython.score-228 {background-color: #FFFF0a;}\n", | |
".cython.score-229 {background-color: #FFFF0a;}\n", | |
".cython.score-230 {background-color: #FFFF0a;}\n", | |
".cython.score-231 {background-color: #FFFF0a;}\n", | |
".cython.score-232 {background-color: #FFFF0a;}\n", | |
".cython.score-233 {background-color: #FFFF0a;}\n", | |
".cython.score-234 {background-color: #FFFF0a;}\n", | |
".cython.score-235 {background-color: #FFFF0a;}\n", | |
".cython.score-236 {background-color: #FFFF0a;}\n", | |
".cython.score-237 {background-color: #FFFF0a;}\n", | |
".cython.score-238 {background-color: #FFFF0a;}\n", | |
".cython.score-239 {background-color: #FFFF0a;}\n", | |
".cython.score-240 {background-color: #FFFF0a;}\n", | |
".cython.score-241 {background-color: #FFFF0a;}\n", | |
".cython.score-242 {background-color: #FFFF0a;}\n", | |
".cython.score-243 {background-color: #FFFF0a;}\n", | |
".cython.score-244 {background-color: #FFFF0a;}\n", | |
".cython.score-245 {background-color: #FFFF0a;}\n", | |
".cython.score-246 {background-color: #FFFF09;}\n", | |
".cython.score-247 {background-color: #FFFF09;}\n", | |
".cython.score-248 {background-color: #FFFF09;}\n", | |
".cython.score-249 {background-color: #FFFF09;}\n", | |
".cython.score-250 {background-color: #FFFF09;}\n", | |
".cython.score-251 {background-color: #FFFF09;}\n", | |
".cython.score-252 {background-color: #FFFF09;}\n", | |
".cython.score-253 {background-color: #FFFF09;}\n", | |
".cython.score-254 {background-color: #FFFF09;}\n", | |
".cython .hll { background-color: #ffffcc }\n", | |
".cython { background: #f8f8f8; }\n", | |
".cython .c { color: #408080; font-style: italic } /* Comment */\n", | |
".cython .err { border: 1px solid #FF0000 } /* Error */\n", | |
".cython .k { color: #008000; font-weight: bold } /* Keyword */\n", | |
".cython .o { color: #666666 } /* Operator */\n", | |
".cython .ch { color: #408080; font-style: italic } /* Comment.Hashbang */\n", | |
".cython .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n", | |
".cython .cp { color: #BC7A00 } /* Comment.Preproc */\n", | |
".cython .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */\n", | |
".cython .c1 { color: #408080; font-style: italic } /* Comment.Single */\n", | |
".cython .cs { color: #408080; font-style: italic } /* Comment.Special */\n", | |
".cython .gd { color: #A00000 } /* Generic.Deleted */\n", | |
".cython .ge { font-style: italic } /* Generic.Emph */\n", | |
".cython .gr { color: #FF0000 } /* Generic.Error */\n", | |
".cython .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n", | |
".cython .gi { color: #00A000 } /* Generic.Inserted */\n", | |
".cython .go { color: #888888 } /* Generic.Output */\n", | |
".cython .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n", | |
".cython .gs { font-weight: bold } /* Generic.Strong */\n", | |
".cython .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n", | |
".cython .gt { color: #0044DD } /* Generic.Traceback */\n", | |
".cython .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n", | |
".cython .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n", | |
".cython .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n", | |
".cython .kp { color: #008000 } /* Keyword.Pseudo */\n", | |
".cython .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n", | |
".cython .kt { color: #B00040 } /* Keyword.Type */\n", | |
".cython .m { color: #666666 } /* Literal.Number */\n", | |
".cython .s { color: #BA2121 } /* Literal.String */\n", | |
".cython .na { color: #7D9029 } /* Name.Attribute */\n", | |
".cython .nb { color: #008000 } /* Name.Builtin */\n", | |
".cython .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n", | |
".cython .no { color: #880000 } /* Name.Constant */\n", | |
".cython .nd { color: #AA22FF } /* Name.Decorator */\n", | |
".cython .ni { color: #999999; font-weight: bold } /* Name.Entity */\n", | |
".cython .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n", | |
".cython .nf { color: #0000FF } /* Name.Function */\n", | |
".cython .nl { color: #A0A000 } /* Name.Label */\n", | |
".cython .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n", | |
".cython .nt { color: #008000; font-weight: bold } /* Name.Tag */\n", | |
".cython .nv { color: #19177C } /* Name.Variable */\n", | |
".cython .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n", | |
".cython .w { color: #bbbbbb } /* Text.Whitespace */\n", | |
".cython .mb { color: #666666 } /* Literal.Number.Bin */\n", | |
".cython .mf { color: #666666 } /* Literal.Number.Float */\n", | |
".cython .mh { color: #666666 } /* Literal.Number.Hex */\n", | |
".cython .mi { color: #666666 } /* Literal.Number.Integer */\n", | |
".cython .mo { color: #666666 } /* Literal.Number.Oct */\n", | |
".cython .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: #BB6622; font-weight: bold } /* Literal.String.Escape */\n", | |
".cython .sh { color: #BA2121 } /* Literal.String.Heredoc */\n", | |
".cython .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n", | |
".cython .sx { color: #008000 } /* Literal.String.Other */\n", | |
".cython .sr { color: #BB6688 } /* Literal.String.Regex */\n", | |
".cython .s1 { color: #BA2121 } /* Literal.String.Single */\n", | |
".cython .ss { color: #19177C } /* Literal.String.Symbol */\n", | |
".cython .bp { color: #008000 } /* Name.Builtin.Pseudo */\n", | |
".cython .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.10</span></p>\n", | |
"<p>\n", | |
" <span style=\"background-color: #FFFF00\">Yellow lines</span> hint at Python interaction.<br />\n", | |
" Click on a line that starts with a \"<code>+</code>\" to see the C code that Cython generated for it.\n", | |
"</p>\n", | |
"<div class=\"cython\"><pre class=\"cython line score-0\"> <span class=\"\">01</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">02</span>: <span class=\"k\">import</span> <span class=\"nn\">cython</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, 2, __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, 2, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">03</span>: </pre>\n", | |
"<pre class=\"cython line score-8\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">04</span>: <span class=\"k\">import</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class='cython code score-8 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_numpy, 0, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 4, __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_np, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 4, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">05</span>: <span class=\"k\">cimport</span> <span class=\"nn\">numpy</span> <span class=\"k\">as</span> <span class=\"nn\">np</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">06</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">07</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"geos_c.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">08</span>: <span class=\"k\">ctypedef</span> <span class=\"n\">void</span> <span class=\"o\">*</span><span class=\"n\">GEOSContextHandle_t</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">09</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">struct</span> <span class=\"nc\">GEOSGeometry</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">10</span>: <span class=\"n\">char</span> <span class=\"n\">GEOSContains_r</span><span class=\"p\">(</span><span class=\"n\">GEOSContextHandle_t</span><span class=\"p\">,</span> <span class=\"n\">const</span> <span class=\"n\">GEOSGeometry</span><span class=\"o\">*</span><span class=\"p\">,</span> <span class=\"n\">const</span> <span class=\"n\">GEOSGeometry</span><span class=\"o\">*</span><span class=\"p\">)</span> <span class=\"k\">nogil</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">11</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">12</span>: </pre>\n", | |
"<pre class=\"cython line score-5\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">13</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSContextHandle_t</span> <span class=\"nf\">get_geos_context_handle</span><span class=\"p\">():</span></pre>\n", | |
"<pre class='cython code score-5 '>static GEOSContextHandle_t __pyx_f_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_get_geos_context_handle(void) {\n", | |
" PyObject *__pyx_v_lgeos = NULL;\n", | |
" __pyx_t_5numpy_uintp_t __pyx_v_handle;\n", | |
" GEOSContextHandle_t __pyx_r;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"get_geos_context_handle\", 0);\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_2);\n", | |
" <span class='pyx_c_api'>__Pyx_WriteUnraisable</span>(\"_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41.get_geos_context_handle\", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0);\n", | |
" __pyx_r = 0;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_v_lgeos);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">14</span>: <span class=\"c\"># Note: This requires that lgeos is defined, so needs to be imported as:</span></pre>\n", | |
"<pre class=\"cython line score-15\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">15</span>: <span class=\"k\">from</span> <span class=\"nn\">shapely.geos</span> <span class=\"k\">import</span> <span class=\"n\">lgeos</span></pre>\n", | |
"<pre class='cython code score-15 '> __pyx_t_1 = <span class='py_c_api'>PyList_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __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_lgeos);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_n_s_lgeos);\n", | |
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_1, 0, __pyx_n_s_lgeos);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_Import</span>(__pyx_n_s_shapely_geos, __pyx_t_1, 0);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 15, __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_lgeos);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_t_1);\n", | |
" __pyx_v_lgeos = __pyx_t_1;\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-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">16</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">uintp_t</span> <span class=\"nf\">handle</span> <span class=\"o\">=</span> <span class=\"n\">lgeos</span><span class=\"o\">.</span><span class=\"n\">geos_handle</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_v_lgeos, __pyx_n_s_geos_handle);<span class='error_goto'> if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 16, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_2);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyInt_As_size_t</span>(__pyx_t_2); if (unlikely((__pyx_t_3 == ((npy_uintp)-1)) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 16, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n", | |
" __pyx_v_handle = __pyx_t_3;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">17</span>: <span class=\"k\">return</span> <span class=\"o\"><</span><span class=\"n\">GEOSContextHandle_t</span><span class=\"o\">></span><span class=\"n\">handle</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_r = ((GEOSContextHandle_t)__pyx_v_handle);\n", | |
" goto __pyx_L0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">18</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">19</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">20</span>: <span class=\"c\">#cdef extern class pygeos.ufuncs.Geometry:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">21</span>: <span class=\"c\"># pass</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">22</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">23</span>: <span class=\"k\">cdef</span> <span class=\"kr\">extern</span> <span class=\"k\">from</span> <span class=\"s\">"pygeos.h"</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">24</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">25</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">struct</span> <span class=\"nc\">GeometryObject</span><span class=\"p\">:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">26</span>: <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">intp_t</span> <span class=\"n\">ptr</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">27</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">28</span>: <span class=\"k\">ctypedef</span> <span class=\"k\">class</span> <span class=\"nc\">pygeos</span><span class=\"o\">.</span><span class=\"n\">ufuncs</span><span class=\"o\">.</span><span class=\"n\">Geometry</span> <span class=\"p\">[</span><span class=\"nb\">object</span> <span class=\"n\">GeometryObject</span><span class=\"p\">]:</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">29</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">intp_t</span> <span class=\"kt\">_ptr</span> <span class=\"s\">"ptr"</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">30</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">31</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">32</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">boundscheck</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">33</span>: <span class=\"nd\">@cython</span><span class=\"o\">.</span><span class=\"n\">wraparound</span><span class=\"p\">(</span><span class=\"bp\">False</span><span class=\"p\">)</span></pre>\n", | |
"<pre class=\"cython line score-59\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">34</span>: <span class=\"k\">def</span> <span class=\"nf\">contains_cy2</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">ndarray</span><span class=\"p\">[</span><span class=\"nb\">object</span><span class=\"p\">,</span> <span class=\"n\">ndim</span><span class=\"o\">=</span><span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"n\">cast</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">]</span> <span class=\"n\">array</span><span class=\"p\">,</span> <span class=\"n\">geometry</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-59 '>/* Python wrapper */\n", | |
"static PyObject *__pyx_pw_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_1contains_cy2(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n", | |
"static PyMethodDef __pyx_mdef_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_1contains_cy2 = {\"contains_cy2\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_1contains_cy2, METH_VARARGS|METH_KEYWORDS, 0};\n", | |
"static PyObject *__pyx_pw_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_1contains_cy2(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n", | |
" PyArrayObject *__pyx_v_array = 0;\n", | |
" PyObject *__pyx_v_geometry = 0;\n", | |
" PyObject *__pyx_r = 0;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"contains_cy2 (wrapper)\", 0);\n", | |
" {\n", | |
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_array,&__pyx_n_s_geometry,0};\n", | |
" PyObject* values[2] = {0,0};\n", | |
" if (unlikely(__pyx_kwds)) {\n", | |
" Py_ssize_t kw_args;\n", | |
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n", | |
" switch (pos_args) {\n", | |
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" 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_array)) != 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_geometry)) != 0)) kw_args--;\n", | |
" else {\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"contains_cy2\", 1, 2, 2, 1); <span class='error_goto'>__PYX_ERR(0, 34, __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, \"contains_cy2\") < 0)) <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L3_error)</span>\n", | |
" }\n", | |
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n", | |
" goto __pyx_L5_argtuple_error;\n", | |
" } else {\n", | |
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n", | |
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n", | |
" }\n", | |
" __pyx_v_array = ((PyArrayObject *)values[0]);\n", | |
" __pyx_v_geometry = values[1];\n", | |
" }\n", | |
" goto __pyx_L4_argument_unpacking_done;\n", | |
" __pyx_L5_argtuple_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"contains_cy2\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args)); <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L3_error)</span>\n", | |
" __pyx_L3_error:;\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41.contains_cy2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return NULL;\n", | |
" __pyx_L4_argument_unpacking_done:;\n", | |
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_array), __pyx_ptype_5numpy_ndarray, 1, \"array\", 0))) <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L1_error)</span>\n", | |
" __pyx_r = __pyx_pf_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_contains_cy2(__pyx_self, __pyx_v_array, __pyx_v_geometry);\n", | |
"\n", | |
" /* function exit code */\n", | |
" goto __pyx_L0;\n", | |
" __pyx_L1_error:;\n", | |
" __pyx_r = NULL;\n", | |
" __pyx_L0:;\n", | |
" <span class='refnanny'>__Pyx_RefNannyFinishContext</span>();\n", | |
" return __pyx_r;\n", | |
"}\n", | |
"\n", | |
"static PyObject *__pyx_pf_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_contains_cy2(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_array, PyObject *__pyx_v_geometry) {\n", | |
" Py_ssize_t __pyx_v_idx;\n", | |
" unsigned int __pyx_v_n;\n", | |
" PyArrayObject *__pyx_v_result = 0;\n", | |
" GEOSContextHandle_t __pyx_v_geos_handle;\n", | |
" GeometryObject *__pyx_v_pygeom1;\n", | |
" GeometryObject *__pyx_v_pygeom2;\n", | |
" GEOSGeometry *__pyx_v_geom1;\n", | |
" GEOSGeometry *__pyx_v_geom2;\n", | |
" __pyx_t_5numpy_intp_t __pyx_v_geos_geom;\n", | |
" __pyx_t_5numpy_intp_t __pyx_v_geos_geom1;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_array;\n", | |
" __Pyx_Buffer __pyx_pybuffer_array;\n", | |
" __Pyx_LocalBuf_ND __pyx_pybuffernd_result;\n", | |
" __Pyx_Buffer __pyx_pybuffer_result;\n", | |
" PyObject *__pyx_r = NULL;\n", | |
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n", | |
" <span class='refnanny'>__Pyx_RefNannySetupContext</span>(\"contains_cy2\", 0);\n", | |
" __pyx_pybuffer_result.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_result.refcount = 0;\n", | |
" __pyx_pybuffernd_result.data = NULL;\n", | |
" __pyx_pybuffernd_result.rcbuffer = &__pyx_pybuffer_result;\n", | |
" __pyx_pybuffer_array.pybuffer.buf = NULL;\n", | |
" __pyx_pybuffer_array.refcount = 0;\n", | |
" __pyx_pybuffernd_array.data = NULL;\n", | |
" __pyx_pybuffernd_array.rcbuffer = &__pyx_pybuffer_array;\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer, (PyObject*)__pyx_v_array, &__Pyx_TypeInfo_object, PyBUF_FORMAT| PyBUF_STRIDES, 1, 1, __pyx_stack) == -1)) <span class='error_goto'>__PYX_ERR(0, 34, __pyx_L1_error)</span>\n", | |
" }\n", | |
" __pyx_pybuffernd_array.diminfo[0].strides = __pyx_pybuffernd_array.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_array.diminfo[0].shape = __pyx_pybuffernd_array.rcbuffer->pybuffer.shape[0];\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_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_macro_api'>__Pyx_XDECREF</span>(__pyx_t_6);\n", | |
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n", | |
" __Pyx_PyThreadState_declare\n", | |
" __Pyx_PyThreadState_assign\n", | |
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_ErrRestore</span>(__pyx_type, __pyx_value, __pyx_tb);}\n", | |
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41.contains_cy2\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n", | |
" __pyx_r = NULL;\n", | |
" goto __pyx_L2;\n", | |
" __pyx_L0:;\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_array.rcbuffer->pybuffer);\n", | |
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer);\n", | |
" __pyx_L2:;\n", | |
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_result);\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__8 = <span class='py_c_api'>PyTuple_Pack</span>(12, __pyx_n_s_array, __pyx_n_s_geometry, __pyx_n_s_idx, __pyx_n_s_n, __pyx_n_s_result, __pyx_n_s_geos_handle, __pyx_n_s_pygeom1, __pyx_n_s_pygeom2, __pyx_n_s_geom1, __pyx_n_s_geom2, __pyx_n_s_geos_geom, __pyx_n_s_geos_geom1);<span class='error_goto'> if (unlikely(!__pyx_tuple__8)) __PYX_ERR(0, 34, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_tuple__8);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_tuple__8);\n", | |
"/* … */\n", | |
" __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_1contains_cy2, NULL, __pyx_n_s_cython_magic_a9838a4c03c47d83fc);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __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_contains_cy2, __pyx_t_1) < 0) <span class='error_goto'>__PYX_ERR(0, 34, __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=\"\">35</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">36</span>: <span class=\"k\">cdef</span> <span class=\"kt\">Py_ssize_t</span> <span class=\"nf\">idx</span></pre>\n", | |
"<pre class=\"cython line score-10\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">37</span>: <span class=\"k\">cdef</span> <span class=\"kt\">unsigned</span> <span class=\"kt\">int</span> <span class=\"nf\">n</span> <span class=\"o\">=</span> <span class=\"n\">array</span><span class=\"o\">.</span><span class=\"n\">size</span></pre>\n", | |
"<pre class='cython code score-10 '> __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_array), __pyx_n_s_size);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_PyInt_As_unsigned_int</span>(__pyx_t_1); if (unlikely((__pyx_t_2 == (unsigned int)-1) && <span class='py_c_api'>PyErr_Occurred</span>())) <span class='error_goto'>__PYX_ERR(0, 37, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_v_n = __pyx_t_2;\n", | |
"</pre><pre class=\"cython line score-36\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">38</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">ndarray</span>[<span class=\"kt\">np</span>.<span class=\"nf\">uint8_t</span><span class=\"p\">,</span> <span class=\"nf\">ndim</span><span class=\"o\">=</span><span class=\"mf\">1</span><span class=\"p\">,</span> <span class=\"n\">cast</span><span class=\"o\">=</span><span class=\"bp\">True</span><span class=\"p\">]</span> <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">empty</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">,</span> <span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uint8</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-36 '> <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_1, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s_empty);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\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_PyInt_From_unsigned_int</span>(__pyx_v_n);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" <span class='refnanny'>__Pyx_GIVEREF</span>(__pyx_t_1);\n", | |
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n", | |
" __pyx_t_1 = 0;\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_5, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_5);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s_uint8);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 38, __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_5); __pyx_t_5 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_6) < 0) <span class='error_goto'>__PYX_ERR(0, 38, __pyx_L1_error)</span>\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_Call</span>(__pyx_t_3, __pyx_t_4, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 38, __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_3); __pyx_t_3 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" if (!(likely(((__pyx_t_6) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_6, __pyx_ptype_5numpy_ndarray))))) <span class='error_goto'>__PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" __pyx_t_7 = ((PyArrayObject *)__pyx_t_6);\n", | |
" {\n", | |
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n", | |
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_result.rcbuffer->pybuffer, (PyObject*)__pyx_t_7, &__Pyx_TypeInfo_nn___pyx_t_5numpy_uint8_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 1, 1, __pyx_stack) == -1)) {\n", | |
" __pyx_v_result = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_result.rcbuffer->pybuffer.buf = NULL;\n", | |
" <span class='error_goto'>__PYX_ERR(0, 38, __pyx_L1_error)</span>\n", | |
" } else {__pyx_pybuffernd_result.diminfo[0].strides = __pyx_pybuffernd_result.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_result.diminfo[0].shape = __pyx_pybuffernd_result.rcbuffer->pybuffer.shape[0];\n", | |
" }\n", | |
" }\n", | |
" __pyx_t_7 = 0;\n", | |
" __pyx_v_result = ((PyArrayObject *)__pyx_t_6);\n", | |
" __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">39</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">40</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSContextHandle_t</span> <span class=\"nf\">geos_handle</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">41</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GeometryObject</span> *<span class=\"nf\">pygeom1</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">42</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GeometryObject</span> *<span class=\"nf\">pygeom2</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">43</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSGeometry</span> *<span class=\"nf\">geom1</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">44</span>: <span class=\"k\">cdef</span> <span class=\"kt\">GEOSGeometry</span> *<span class=\"nf\">geom2</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">45</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">geos_geom</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">46</span>: <span class=\"k\">cdef</span> <span class=\"kt\">np</span>.<span class=\"kt\">intp_t</span> <span class=\"nf\">geos_geom1</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">47</span>: <span class=\"c\">#cdef np.ndarray[GeometryObject, ndim=1, cast=True] object_array = array</span></pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">48</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">49</span>: <span class=\"n\">geos_handle</span> <span class=\"o\">=</span> <span class=\"n\">get_geos_context_handle</span><span class=\"p\">()</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geos_handle = __pyx_f_46_cython_magic_a9838a4c03c47d83fcfca3e26fdbda41_get_geos_context_handle();\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">50</span>: </pre>\n", | |
"<pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">51</span>: <span class=\"n\">pygeom1</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GeometryObject</span> <span class=\"o\">*></span> <span class=\"n\">geometry</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_pygeom1 = ((GeometryObject *)__pyx_v_geometry);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">52</span>: <span class=\"n\">geos_geom1</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uintp_t</span><span class=\"o\">></span> <span class=\"n\">pygeom1</span><span class=\"o\">.</span><span class=\"n\">ptr</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geos_geom1 = ((__pyx_t_5numpy_uintp_t)__pyx_v_pygeom1->ptr);\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">53</span>: <span class=\"n\">geom1</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GEOSGeometry</span> <span class=\"o\">*></span> <span class=\"n\">geos_geom1</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geom1 = ((GEOSGeometry *)__pyx_v_geos_geom1);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">54</span>: </pre>\n", | |
"<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=\"k\">for</span> <span class=\"n\">idx</span> <span class=\"ow\">in</span> <span class=\"nb\">xrange</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">):</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_2 = __pyx_v_n;\n", | |
" __pyx_t_8 = __pyx_t_2;\n", | |
" for (__pyx_t_9 = 0; __pyx_t_9 < __pyx_t_8; __pyx_t_9+=1) {\n", | |
" __pyx_v_idx = __pyx_t_9;\n", | |
"</pre><pre class=\"cython line score-2\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">56</span>: <span class=\"n\">pygeom2</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GeometryObject</span> <span class=\"o\">*></span> <span class=\"n\">array</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span></pre>\n", | |
"<pre class='cython code score-2 '> __pyx_t_10 = __pyx_v_idx;\n", | |
" __pyx_t_6 = (PyObject *) *__Pyx_BufPtrStrided1d(PyObject **, __pyx_pybuffernd_array.rcbuffer->pybuffer.buf, __pyx_t_10, __pyx_pybuffernd_array.diminfo[0].strides);\n", | |
" <span class='pyx_macro_api'>__Pyx_INCREF</span>((PyObject*)__pyx_t_6);\n", | |
" __pyx_v_pygeom2 = ((GeometryObject *)__pyx_t_6);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">57</span>: <span class=\"n\">geos_geom</span> <span class=\"o\">=</span> <span class=\"n\">pygeom2</span><span class=\"o\">.</span><span class=\"n\">ptr</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_11 = __pyx_v_pygeom2->ptr;\n", | |
" __pyx_v_geos_geom = __pyx_t_11;\n", | |
"</pre><pre class=\"cython line score-0\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">58</span>: <span class=\"n\">geom2</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">GEOSGeometry</span> <span class=\"o\">*></span><span class=\"n\">geos_geom</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_v_geom2 = ((GEOSGeometry *)__pyx_v_geos_geom);\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">59</span>: </pre>\n", | |
"<pre class=\"cython line score-0\"> <span class=\"\">60</span>: <span class=\"c\"># Put the result of whether the point is "contained" into the result array. </span></pre>\n", | |
"<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\">result</span><span class=\"p\">[</span><span class=\"n\">idx</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"o\"><</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">uint8_t</span><span class=\"o\">></span> <span class=\"n\">GEOSContains_r</span><span class=\"p\">(</span><span class=\"n\">geos_handle</span><span class=\"p\">,</span> <span class=\"n\">geom1</span><span class=\"p\">,</span> <span class=\"n\">geom2</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-0 '> __pyx_t_12 = __pyx_v_idx;\n", | |
" *__Pyx_BufPtrStrided1d(__pyx_t_5numpy_uint8_t *, __pyx_pybuffernd_result.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_result.diminfo[0].strides) = ((__pyx_t_5numpy_uint8_t)GEOSContains_r(__pyx_v_geos_handle, __pyx_v_geom1, __pyx_v_geom2));\n", | |
" }\n", | |
"</pre><pre class=\"cython line score-0\"> <span class=\"\">62</span>: </pre>\n", | |
"<pre class=\"cython line score-20\" onclick=\"(function(s){s.display=s.display==='block'?'none':'block'})(this.nextElementSibling.style)\">+<span class=\"\">63</span>: <span class=\"k\">return</span> <span class=\"n\">result</span><span class=\"o\">.</span><span class=\"n\">view</span><span class=\"p\">(</span><span class=\"n\">dtype</span><span class=\"o\">=</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">bool</span><span class=\"p\">)</span></pre>\n", | |
"<pre class='cython code score-20 '> <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n", | |
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(((PyObject *)__pyx_v_result), __pyx_n_s_view);<span class='error_goto'> if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_6);\n", | |
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_PyDict_NewPresized</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_1);\n", | |
" <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_t_4, __pyx_n_s_np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_4);\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s_bool);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n", | |
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, __pyx_n_s_dtype, __pyx_t_3) < 0) <span class='error_goto'>__PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n", | |
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_PyObject_Call</span>(__pyx_t_6, __pyx_empty_tuple, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 63, __pyx_L1_error)</span>\n", | |
" <span class='refnanny'>__Pyx_GOTREF</span>(__pyx_t_3);\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_6); __pyx_t_6 = 0;\n", | |
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n", | |
" __pyx_r = __pyx_t_3;\n", | |
" __pyx_t_3 = 0;\n", | |
" goto __pyx_L0;\n", | |
"</pre></div></body></html>" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"execution_count": 12, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"%%cython -l geos_c -L /home/joris/miniconda3/envs/geo-dev/lib -I /home/joris/miniconda3/envs/geo-dev/include -I /home/joris/scipy/repos/pygeos/src/ -a\n", | |
"\n", | |
"import cython\n", | |
"\n", | |
"import numpy as np\n", | |
"cimport numpy as np\n", | |
"\n", | |
"cdef extern from \"geos_c.h\":\n", | |
" ctypedef void *GEOSContextHandle_t\n", | |
" ctypedef struct GEOSGeometry\n", | |
" char GEOSContains_r(GEOSContextHandle_t, const GEOSGeometry*, const GEOSGeometry*) nogil\n", | |
"\n", | |
"\n", | |
"cdef GEOSContextHandle_t get_geos_context_handle():\n", | |
" # Note: This requires that lgeos is defined, so needs to be imported as:\n", | |
" from shapely.geos import lgeos\n", | |
" cdef np.uintp_t handle = lgeos.geos_handle\n", | |
" return <GEOSContextHandle_t>handle\n", | |
"\n", | |
"\n", | |
"#cdef extern class pygeos.ufuncs.Geometry:\n", | |
"# pass\n", | |
"\n", | |
"cdef extern from \"pygeos.h\":\n", | |
" \n", | |
" ctypedef struct GeometryObject:\n", | |
" np.intp_t ptr\n", | |
"\n", | |
" ctypedef class pygeos.ufuncs.Geometry [object GeometryObject]:\n", | |
" cdef np.intp_t _ptr \"ptr\"\n", | |
"\n", | |
"\n", | |
"@cython.boundscheck(False)\n", | |
"@cython.wraparound(False)\n", | |
"def contains_cy2(np.ndarray[object, ndim=1, cast=True] array, geometry):\n", | |
" \n", | |
" cdef Py_ssize_t idx\n", | |
" cdef unsigned int n = array.size\n", | |
" cdef np.ndarray[np.uint8_t, ndim=1, cast=True] result = np.empty(n, dtype=np.uint8)\n", | |
"\n", | |
" cdef GEOSContextHandle_t geos_handle\n", | |
" cdef GeometryObject *pygeom1\n", | |
" cdef GeometryObject *pygeom2\n", | |
" cdef GEOSGeometry *geom1\n", | |
" cdef GEOSGeometry *geom2\n", | |
" cdef np.intp_t geos_geom\n", | |
" cdef np.intp_t geos_geom1\n", | |
" #cdef np.ndarray[GeometryObject, ndim=1, cast=True] object_array = array\n", | |
" \n", | |
" geos_handle = get_geos_context_handle()\n", | |
"\n", | |
" pygeom1 = <GeometryObject *> geometry\n", | |
" geos_geom1 = <np.uintp_t> pygeom1.ptr\n", | |
" geom1 = <GEOSGeometry *> geos_geom1\n", | |
"\n", | |
" for idx in xrange(n):\n", | |
" pygeom2 = <GeometryObject *> array[idx]\n", | |
" geos_geom = pygeom2.ptr\n", | |
" geom2 = <GEOSGeometry *>geos_geom\n", | |
"\n", | |
" # Put the result of whether the point is \"contained\" into the result array. \n", | |
" result[idx] = <np.uint8_t> GEOSContains_r(geos_handle, geom1, geom2)\n", | |
"\n", | |
" return result.view(dtype=np.bool)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([False, False, False, ..., False, False, False])" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"res3 = contains_cy2(a, poly)\n", | |
"res3" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"np.testing.assert_allclose(res1, res3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"138 µs ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)\n" | |
] | |
} | |
], | |
"source": [ | |
"%timeit contains_cy2(a, poly)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"So this is a further performance improvement, now in the same order as pygeos (even faster here, but the timing is quite variable, it's more or less the same). We can see that\n", | |
"\n", | |
"- accessing the pointer from the pygeos.Geometry object now happens without python overhead (no yellow in the annotations)\n", | |
"- but, getting an element out of the object array still does .. (the `pygeom2 = <GeometryObject *> array[idx]` line in the loop)\n", | |
"\n", | |
"This doesn't seem to bother performance-wise that much, but, the consequence is that we can't put the loop in a `nogil` context to release the GIL (which is critical to use this algo in a parallel setting).\n" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python (geo-dev)", | |
"language": "python", | |
"name": "geo-dev" | |
}, | |
"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.7.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment