Skip to content

Instantly share code, notes, and snippets.

@patricksnape
Last active December 21, 2015 04:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patricksnape/6245c96743db51020c3b to your computer and use it in GitHub Desktop.
Save patricksnape/6245c96743db51020c3b to your computer and use it in GitHub Desktop.
My Cython optimisation tutorial
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Cython: Optimising for speed\n",
"============================\n",
"This notebook aims to take the reader through a realworld example of increasing the speed on an algorithm. The given example is that of computing the normals for a given triangle mesh (points and a trilist). Computing the per-vertex normal for a mesh is an intensive operation that yields poor performance in pure Python. This is due to the need to loop over every triangle and and sum the per-triangle normal that every vertex is a member of. This notebook is not designed to describe Cython syntax or basics. It is assumed that the reader has some understanding and preferably experience with writing Cythonised functions.\n",
"\n",
"Algorithm Pseudocode\n",
"--------------------\n",
"\n",
"```\n",
"foreach face in faces:\n",
" face_normal = crossproduct(vertices[face[1]] - vertices[face[0]], \n",
" vertices[face[2]] - vertices[face[0]])\n",
" foreach v in face:\n",
" normalise(face_normal)\n",
" vertices[v].in_faces.append(face_normal)\n",
"\n",
"foreach vertex in vertices:\n",
" normal = (0,0,0)\n",
" for face in vertex.in_faces:\n",
" normal += face_normal\n",
" normalise(normal)\n",
"\n",
"crossproduct(v0, v1):\n",
" v0.y * v1.z - v0.z * v1.y,\n",
" v0.z * v1.x - v0.x * v1.z,\n",
" v0.x * v1.y - v0.y * v1.x,\n",
"```\n",
"\n",
"Begin\n",
"-----\n",
"We begin by loading an appropriate mesh."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from pybug.io import auto_import\n",
"import numpy as np\n",
"\n",
"mesh = auto_import('/vol/atlas/databases/frgc/spring2003/04201d302.abs')[0]\n",
"tris = mesh.trilist\n",
"points = mesh.points\n",
"\n",
"print mesh"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Found 1 files. (1/1) are importable\n",
"\r",
"Creating importer for <pybug.io.mesh.base.ABSImporter object at 0xbff26d0> (1 of 1)"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Found 1 files. (0/1) are importable\n",
"\n"
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"<class 'pybug.shape.mesh.textured.TexturedTriMesh'>: n_points: 61599, n_dims: 3\n",
"n_tris: 123160\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pure Python Implementation\n",
"--------------------------\n",
"This implementation uses numpy and broadcasting to achieve it's goals."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def normalise(vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" # np.spacing(1) is equivalent to Matlab's eps\n",
" d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" d[d < np.spacing(1)] = 1.0\n",
" return vec / d[..., None]\n",
"\n",
"def py_compute_normal(vertex, face):\n",
" nface = face.shape[0]\n",
" nvert = vertex.shape[0]\n",
" \n",
" # Calculate the cross product (per-face normal)\n",
" normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" normalf = normalise(normalf)\n",
" \n",
" # Calculate per-vertex normal\n",
" normal = np.zeros([nvert, 3])\n",
" for i in xrange(nface):\n",
" f = face[i, :]\n",
" for j in xrange(3):\n",
" normal[f[j], :] += normalf[i, :]\n",
" \n",
" # Normalize\n",
" normal = normalise(normal)\n",
" \n",
" # Enforce that the normal are outward\n",
" v = vertex - np.mean(vertex)[..., None]\n",
" s = np.sum(v * normal, axis=1)\n",
" if np.sum(np.greater(s, 0)) < np.sum(np.less(s, 0)):\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
" \n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we then time this function, we can see that it takes about 3 seconds (on my ``Intel(R) Xeon(R) CPU E5-1650 @ 3.20GHz`` with ``32GB`` of RAM) for ``123160`` triangles and ``61599`` points."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit py_compute_normal(points, tris)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 3.15 s per loop\n"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Naive Cython\n",
"------------\n",
"This is obviously far too slow to be of any use. Therefore, we naively port this method to Cython. Cython is useful for code where tight looping is unavoidable, as is the case in computing the per-vertex normal. This is because it pre-compiles as much of the code as possible down to C, which is very efficient at tight looping. To compile Cython code, we have to load the Cython magic extension"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%load_ext cythonmagic"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"The cythonmagic extension is already loaded. To reload it, use:\n",
" %reload_ext cythonmagic\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The Cython extension gives us the ``%%cython`` cell magic where we can put raw Cython code which will compiled on execution. TO get started with Cython, we note that the majority of Cython's speedup comes from the fact that we statically type variables. Therefore, we always have to import some C code via the ``cimport`` statement. For example, to use numpy, we could use:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython\n",
"import numpy as np\n",
"\n",
"cimport cython\n",
"cimport numpy as np"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that we have to Python ``import`` Numpy **AND** ``cimport`` it. Therefore, a simple Cython function using numpy would look like:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython\n",
"import numpy as np\n",
"\n",
"cimport cython\n",
"cimport numpy as np\n",
"\n",
"def my_pow(double x):\n",
" return np.power(x, 2)\n",
"\n",
"print my_pow(2.0)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 20
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It's important to note that there are 3 kinds of functions definitions in Cython:\n",
"\n",
" - ``def``\n",
" - This is a Python function. It is called via Python and thus has all the overhead of being called by Python. Any C-code will have to call out of Python\n",
" - Parameters are Python objects which are then explicitly converted to static types if specified\n",
" - Returns a Python object\n",
" - ``cdef``\n",
" - This is a C signature and can **ONLY** run from a Cython context. It cannot be called by pure Python code.\n",
" - Parameters are converted to static type by the caller\n",
" - Return type can be statitically defined\n",
" - ``cpdef``\n",
" - This is a mixed signature whereby Cython automatically builds a pure Python wrapper around a ``cdef`` function. So Python calls the wrapper and C calls the ``cdef`` function.\n",
" - Parameters are converted to C type of Python wrapper\n",
" - Return types are statically defined and marshalled by Python wrapper\n",
" \n",
"So, to create a naive implementation of our Python function, in Cython, we define ``cpdef`` function as follows:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython\n",
"\n",
"import numpy as np\n",
"cimport numpy as np\n",
"cimport cython\n",
"\n",
"\n",
"cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" d[d < np.spacing(1)] = 1.0\n",
" return vec / d[..., None]\n",
" \n",
"\n",
"cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" cdef int nface = face.shape[0]\n",
" cdef int nvert = vertex.shape[0]\n",
" \n",
" # Calculate the cross product (per-face normal)\n",
" cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" normalf = cy_normalise_naive(normalf)\n",
" \n",
" # Calculate per-vertex normal\n",
" cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" cdef np.ndarray[int, ndim=1] f\n",
" for i in xrange(nface):\n",
" f = face[i, :]\n",
" for j in xrange(3):\n",
" normal[f[j], :] += normalf[i, :]\n",
" \n",
" # Normalize\n",
" normal = cy_normalise_naive(normal)\n",
" \n",
" # Enforce that the normal are outward\n",
" cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" if np.sum(np.greater(s, 0)) < np.sum(np.less(s, 0)):\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
" \n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 21
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"If we then time this function, we can see that it takes about 1.8 seconds (on my ``Intel(R) Xeon(R) CPU E5-1650 @ 3.20GHz`` with ``32GB`` of RAM) for ``123160`` triangles and ``61599`` points. This represents an approximately 1.6x speedup just by naively moving the code in to a Cython function. Other than the static typing, the code is almost identical.\n",
"\n",
"*Note:* There are decorators such as ``@cython.boundscheck(False)`` and ``@cython.wraparound(False)`` that can provide speedups by telling Cython that you guarantee the kinds of accesses arrays will have inside the function. See [here](http://docs.cython.org/src/reference/compilation.html) for more information."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit cy_compute_normal_naive(points, tris)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 1.9 s per loop\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Optimising Cython\n",
"-----------------\n",
"However, we can do better than this! In order to give us a better indiciaton, Cython provides the ability to pass flags in for execution. These can be compile time flags, or special running flags. The flag we are interested in is ``-a``. This provides an output that colour codes the typing that is going on within the Cython function. Yellow backgrounds indicate function calls back in to Python (which is slow), and white/clear backgrounds represent pure C calls. If we run this on our naive implementaton, we get the following:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython -a\n",
"\n",
"import numpy as np\n",
"cimport numpy as np\n",
"cimport cython\n",
"\n",
"\n",
"cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" d[d < np.spacing(1)] = 1.0\n",
" return vec / d[..., None]\n",
" \n",
"\n",
"cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" cdef int nface = face.shape[0]\n",
" cdef int nvert = vertex.shape[0]\n",
" \n",
" # unit normals to the faces\n",
" cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" normalf = cy_normalise_naive(normalf)\n",
" \n",
" # unit normal to the vertex\n",
" cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" cdef double[:] f\n",
" for i in xrange(nface):\n",
" f = face[i, :]\n",
" for j in xrange(3):\n",
" normal[f[j], :] += normalf[i, :]\n",
" \n",
" # normalize\n",
" normal = cy_normalise_naive(normal)\n",
" \n",
" # enforce that the normal are outward\n",
" cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" if np.sum(np.greater(s, 0)) < np.sum(np.less(s, 0)):\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
" \n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<!-- Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013 -->\n",
"<html>\n",
"\n",
"<head>\n",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
"<style type=\"text/css\">\n",
"\n",
"body { font-family: courier; font-size: 12; }\n",
"\n",
".code { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n",
".py_c_api { color: red; }\n",
".py_macro_api { color: #FF7000; }\n",
".pyx_c_api { color: #FF3000; }\n",
".pyx_macro_api { color: #FF7000; }\n",
".refnanny { color: #FFA000; }\n",
"\n",
".error_goto { color: #FFA000; }\n",
"\n",
".tag { }\n",
"\n",
".coerce { color: #008000; border: 1px dotted #008000 }\n",
"\n",
".py_attr { color: #FF0000; font-weight: bold; }\n",
".c_attr { color: #0000FF; }\n",
"\n",
".py_call { color: #FF0000; font-weight: bold; }\n",
".c_call { color: #0000FF; }\n",
"\n",
".line { margin: 0em }\n",
"\n",
"</style>\n",
"<script>\n",
"function toggleDiv(id) {\n",
" theDiv = document.getElementById(id);\n",
" if (theDiv.style.display == 'none') theDiv.style.display = 'block';\n",
" else theDiv.style.display = 'none';\n",
"}\n",
"</script>\n",
"</head>\n",
" <body>\n",
"<p>Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013\n",
"<pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line1\")'> 1: </pre>\n",
"<pre id='line1' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line2\")'> 2: import numpy as np</pre>\n",
"<pre id='line2' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":2\n",
" * \n",
" * import numpy as np # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cimport numpy as np\n",
" * cimport cython\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__numpy), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s__np, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line3\")'> 3: cimport numpy as np</pre>\n",
"<pre id='line3' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: cimport cython</pre>\n",
"<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line5\")'> 5: </pre>\n",
"<pre id='line5' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: </pre>\n",
"<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line7\")'> 7: cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):</pre>\n",
"<pre id='line7' class='code' style='background-color: #FFFFd4'>\n",
"/* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":7\n",
" * \n",
" * \n",
" * cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" */\n",
"\n",
"static PyArrayObject *__pyx_f_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_normalise_naive(PyArrayObject *__pyx_v_vec) {\n",
" PyArrayObject *__pyx_v_d = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_d;\n",
" __Pyx_Buffer __pyx_pybuffer_d;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vec;\n",
" __Pyx_Buffer __pyx_pybuffer_vec;\n",
" PyArrayObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_normalise_naive\", 0);\n",
" __pyx_pybuffer_d.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_d.refcount = 0;\n",
" __pyx_pybuffernd_d.data = NULL;\n",
" __pyx_pybuffernd_d.rcbuffer = &__pyx_pybuffer_d;\n",
" __pyx_pybuffer_vec.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vec.refcount = 0;\n",
" __pyx_pybuffernd_vec.data = NULL;\n",
" __pyx_pybuffernd_vec.rcbuffer = &__pyx_pybuffer_vec;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vec.diminfo[0].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vec.diminfo[0].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vec.diminfo[1].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vec.diminfo[1].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[1];\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line8\")'> 8: # Avoid divisions by almost 0 numbers</pre>\n",
"<pre id='line8' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF22' onclick='toggleDiv(\"line9\")'> 9: cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))</pre>\n",
"<pre id='line9' class='code' style='background-color: #FFFF22'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":9\n",
" * cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1)) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None]\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sqrt);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_3 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyNumber_Power</span>(((PyObject *)__pyx_v_vec), __pyx_int_2, Py_None);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_3, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_d = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_d.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_d.diminfo[0].strides = __pyx_pybuffernd_d.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_d.diminfo[0].shape = __pyx_pybuffernd_d.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_6 = 0;\n",
" __pyx_v_d = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF36' onclick='toggleDiv(\"line10\")'> 10: d[d &lt; np.spacing(1)] = 1.0</pre>\n",
"<pre id='line10' class='code' style='background-color: #FFFF36'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>(1.0);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__spacing);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_k_tuple_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_RichCompare</span>(((PyObject *)__pyx_v_d), __pyx_t_1, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" if (<span class='py_c_api'>PyObject_SetItem</span>(((PyObject *)__pyx_v_d), __pyx_t_2, __pyx_t_5) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_k_tuple_1 = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_1));\n",
"</pre><pre class='line' style='background-color: #FFFF32' onclick='toggleDiv(\"line11\")'> 11: return vec / d[..., None]</pre>\n",
"<pre id='line11' class='code' style='background-color: #FFFF32'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(((PyObject *)__pyx_r));\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_d), ((PyObject *)__pyx_k_tuple_2));<span class='error_goto'> if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyNumber_Divide</span>(((PyObject *)__pyx_v_vec), __pyx_t_5);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_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",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.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_8a17498f1f23780b33414dc2e93cc08d.cy_normalise_naive\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_d);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>((PyObject *)__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" __pyx_k_tuple_2 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_2));\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line12\")'> 12: </pre>\n",
"<pre id='line12' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line13\")'> 13: </pre>\n",
"<pre id='line13' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF44' onclick='toggleDiv(\"line14\")'> 14: cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):</pre>\n",
"<pre id='line14' class='code' style='background-color: #FFFF44'>\n",
"/* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pw_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_1cy_compute_normal_naive(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_f_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_compute_normal_naive(PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face, CYTHON_UNUSED int __pyx_skip_dispatch) {\n",
" int __pyx_v_nface;\n",
" int __pyx_v_nvert;\n",
" PyArrayObject *__pyx_v_normalf = 0;\n",
" PyArrayObject *__pyx_v_normal = 0;\n",
" __Pyx_memviewslice __pyx_v_f = { 0, 0, { 0 }, { 0 }, { 0 } };\n",
" int __pyx_v_i;\n",
" long __pyx_v_j;\n",
" PyArrayObject *__pyx_v_v = 0;\n",
" PyArrayObject *__pyx_v_s = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normal;\n",
" __Pyx_Buffer __pyx_pybuffer_normal;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normalf;\n",
" __Pyx_Buffer __pyx_pybuffer_normalf;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_s;\n",
" __Pyx_Buffer __pyx_pybuffer_s;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_v;\n",
" __Pyx_Buffer __pyx_pybuffer_v;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_naive\", 0);\n",
" __pyx_pybuffer_normalf.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normalf.refcount = 0;\n",
" __pyx_pybuffernd_normalf.data = NULL;\n",
" __pyx_pybuffernd_normalf.rcbuffer = &__pyx_pybuffer_normalf;\n",
" __pyx_pybuffer_normal.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normal.refcount = 0;\n",
" __pyx_pybuffernd_normal.data = NULL;\n",
" __pyx_pybuffernd_normal.rcbuffer = &__pyx_pybuffer_normal;\n",
" __pyx_pybuffer_v.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_v.refcount = 0;\n",
" __pyx_pybuffernd_v.data = NULL;\n",
" __pyx_pybuffernd_v.rcbuffer = &__pyx_pybuffer_v;\n",
" __pyx_pybuffer_s.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_s.refcount = 0;\n",
" __pyx_pybuffernd_s.data = NULL;\n",
" __pyx_pybuffernd_s.rcbuffer = &__pyx_pybuffer_s;\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
"\n",
"/* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pf_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_compute_normal_naive(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face) {\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_naive\", 0);\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_1 = __pyx_f_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_compute_normal_naive(__pyx_v_vertex, __pyx_v_face, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_r = __pyx_t_1;\n",
" __pyx_t_1 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_8a17498f1f23780b33414dc2e93cc08d.cy_compute_normal_naive\", __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_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n",
" int __pyx_r;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"__getbuffer__ (wrapper)\", 0);\n",
" __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line15\")'> 15: cdef int nface = face.shape[0]</pre>\n",
"<pre id='line15' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":15\n",
" * \n",
" * cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nvert = vertex.shape[0]\n",
" * \n",
" */\n",
" __pyx_v_nface = (__pyx_v_face->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line16\")'> 16: cdef int nvert = vertex.shape[0]</pre>\n",
"<pre id='line16' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":16\n",
" * cpdef cy_compute_normal_naive(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normals to the faces\n",
" */\n",
" __pyx_v_nvert = (__pyx_v_vertex->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line17\")'> 17: </pre>\n",
"<pre id='line17' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line18\")'> 18: # unit normals to the faces</pre>\n",
"<pre id='line18' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1b' onclick='toggleDiv(\"line19\")'> 19: cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],</pre>\n",
"<pre id='line19' class='code' style='background-color: #FFFF1b'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":19\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf)\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__cross);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":19\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf)\n",
" */\n",
" __pyx_k_slice_3 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_3);\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_4));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_k_tuple_4 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_3, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_4);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_4));\n",
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_3));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
" __pyx_k_slice_5 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_k_slice_6 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_6);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_6);\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_7));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_k_tuple_7 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_6, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_7);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_7));\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_8);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, __pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_4));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_1, __pyx_t_3);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\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_3); __pyx_t_3 = 0;\n",
" __pyx_k_slice_8 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
"</pre><pre class='line' style='background-color: #FFFF18' onclick='toggleDiv(\"line20\")'> 20: vertex[face[:, 2], :] - vertex[face[:, 0], :])</pre>\n",
"<pre id='line20' class='code' style='background-color: #FFFF18'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":20\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = cy_normalise_naive(normalf)\n",
" * \n",
" */\n",
" __pyx_k_slice_9 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_9);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_9);\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":20\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = cy_normalise_naive(normalf)\n",
" * \n",
" */\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_10));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_k_tuple_10 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_9, __pyx_int_2);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_10);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_10));\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_11);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_k_slice_11 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_k_slice_12 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_12);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_12);\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_13));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_k_tuple_13 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_12, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_13);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_13));\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_14);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_5));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_3, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_4);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_4 = 0;\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normalf = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_6 = 0;\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_k_slice_14 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
"</pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line21\")'> 21: normalf = cy_normalise_naive(normalf)</pre>\n",
"<pre id='line21' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":21\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normal to the vertex\n",
" */\n",
" __pyx_t_5 = ((PyObject *)__pyx_f_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_normalise_naive(((PyArrayObject *)__pyx_v_normalf)));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_5), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_8, __pyx_t_9, __pyx_t_10);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line22\")'> 22: </pre>\n",
"<pre id='line22' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line23\")'> 23: # unit normal to the vertex</pre>\n",
"<pre id='line23' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line24\")'> 24: cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])</pre>\n",
"<pre id='line24' class='code' style='background-color: #FFFF34'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":24\n",
" * \n",
" * # unit normal to the vertex\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef double[:] f\n",
" * for i in xrange(nface):\n",
" */\n",
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s__zeros);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyInt_FromLong</span>(__pyx_v_nvert);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_2 = <span class='py_c_api'>PyList_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_2, 1, __pyx_int_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_3);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_t_2));\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\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>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_11 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_11, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normal = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_11 = 0;\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line25\")'> 25: cdef double[:] f</pre>\n",
"<pre id='line25' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line26\")'> 26: for i in xrange(nface):</pre>\n",
"<pre id='line26' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":26\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" * cdef double[:] f\n",
" * for i in xrange(nface): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f = face[i, :]\n",
" * for j in xrange(3):\n",
" */\n",
" __pyx_t_7 = __pyx_v_nface;\n",
" for (__pyx_t_12 = 0; __pyx_t_12 <code><</code> __pyx_t_7; __pyx_t_12+=1) {\n",
" __pyx_v_i = __pyx_t_12;\n",
"</pre><pre class='line' style='background-color: #FFFF44' onclick='toggleDiv(\"line27\")'> 27: f = face[i, :]</pre>\n",
"<pre id='line27' class='code' style='background-color: #FFFF44'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":27\n",
" * cdef double[:] f\n",
" * for i in xrange(nface):\n",
" * f = face[i, :] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * for j in xrange(3):\n",
" * normal[f[j], :] += normalf[i, :]\n",
" */\n",
" __pyx_t_2 = <span class='py_c_api'>PyInt_FromLong</span>(__pyx_v_i);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_15);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_k_slice_15);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_15);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_t_5));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" __pyx_t_13 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_ds_double</span>(__pyx_t_2);\n",
" if (unlikely(!__pyx_t_13.memview))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __PYX_XDEC_MEMVIEW(&__pyx_v_f, 1);\n",
" __pyx_v_f = __pyx_t_13;\n",
" __pyx_t_13.memview = NULL;\n",
" __pyx_t_13.data = NULL;\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":27\n",
" * cdef double[:] f\n",
" * for i in xrange(nface):\n",
" * f = face[i, :] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * for j in xrange(3):\n",
" * normal[f[j], :] += normalf[i, :]\n",
" */\n",
" __pyx_k_slice_15 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_15);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_15);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line28\")'> 28: for j in xrange(3):</pre>\n",
"<pre id='line28' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":28\n",
" * for i in xrange(nface):\n",
" * f = face[i, :]\n",
" * for j in xrange(3): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f[j], :] += normalf[i, :]\n",
" * \n",
" */\n",
" for (__pyx_t_14 = 0; __pyx_t_14 <code><</code> 3; __pyx_t_14+=1) {\n",
" __pyx_v_j = __pyx_t_14;\n",
"</pre><pre class='line' style='background-color: #FFFF22' onclick='toggleDiv(\"line29\")'> 29: normal[f[j], :] += normalf[i, :]</pre>\n",
"<pre id='line29' class='code' style='background-color: #FFFF22'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":29\n",
" * f = face[i, :]\n",
" * for j in xrange(3):\n",
" * normal[f[j], :] += normalf[i, :] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # normalize\n",
" */\n",
" __pyx_t_15 = __pyx_v_j;\n",
" __pyx_t_16 = -1;\n",
" if (__pyx_t_15 <code><</code> 0) {\n",
" __pyx_t_15 += __pyx_v_f.shape[0];\n",
" if (unlikely(__pyx_t_15 <code><</code> 0)) __pyx_t_16 = 0;\n",
" } else if (unlikely(__pyx_t_15 >= __pyx_v_f.shape[0])) __pyx_t_16 = 0;\n",
" if (unlikely(__pyx_t_16 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_16);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_2 = <span class='py_c_api'>PyFloat_FromDouble</span>((*((double *) ( /* dim=0 */ (__pyx_v_f.data + __pyx_t_15 * __pyx_v_f.strides[0]) ))));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_16);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_k_slice_16);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_16);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_normal), ((PyObject *)__pyx_t_5));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_1 = <span class='py_c_api'>PyInt_FromLong</span>(__pyx_v_i);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":29\n",
" * f = face[i, :]\n",
" * for j in xrange(3):\n",
" * normal[f[j], :] += normalf[i, :] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # normalize\n",
" */\n",
" __pyx_k_slice_16 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_16);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_16);\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_17);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, __pyx_k_slice_17);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_17);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_normalf), ((PyObject *)__pyx_t_4));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyNumber_InPlaceAdd</span>(__pyx_t_2, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" if (<span class='py_c_api'>PyObject_SetItem</span>(((PyObject *)__pyx_v_normal), ((PyObject *)__pyx_t_5), __pyx_t_4) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\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>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" }\n",
" }\n",
" __pyx_k_slice_17 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_17);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_17);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line30\")'> 30: </pre>\n",
"<pre id='line30' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line31\")'> 31: # normalize</pre>\n",
"<pre id='line31' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line32\")'> 32: normal = cy_normalise_naive(normal)</pre>\n",
"<pre id='line32' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":32\n",
" * \n",
" * # normalize\n",
" * normal = cy_normalise_naive(normal) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # enforce that the normal are outward\n",
" */\n",
" __pyx_t_5 = ((PyObject *)__pyx_f_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_normalise_naive(((PyArrayObject *)__pyx_v_normal)));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_5), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_10, __pyx_t_9, __pyx_t_8);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line33\")'> 33: </pre>\n",
"<pre id='line33' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line34\")'> 34: # enforce that the normal are outward</pre>\n",
"<pre id='line34' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF2f' onclick='toggleDiv(\"line35\")'> 35: cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]</pre>\n",
"<pre id='line35' class='code' style='background-color: #FFFF2f'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":35\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_4 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s__mean);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_vertex));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, ((PyObject *)__pyx_v_vertex));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_vertex));\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\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>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, ((PyObject *)__pyx_k_tuple_18));<span class='error_goto'> if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyNumber_Subtract</span>(((PyObject *)__pyx_v_vertex), __pyx_t_5);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_1) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_1, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_17 = ((PyArrayObject *)__pyx_t_1);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer, (PyObject*)__pyx_t_17, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_v = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_v.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_v.diminfo[0].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_v.diminfo[0].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_v.diminfo[1].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_v.diminfo[1].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_17 = 0;\n",
" __pyx_v_v = ((PyArrayObject *)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":35\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_k_tuple_18 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_18);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_18));\n",
"</pre><pre class='line' style='background-color: #FFFF31' onclick='toggleDiv(\"line36\")'> 36: cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)</pre>\n",
"<pre id='line36' class='code' style='background-color: #FFFF31'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":36\n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_5 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyNumber_Multiply</span>(((PyObject *)__pyx_v_v), ((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_5, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_18 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer, (PyObject*)__pyx_t_18, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_s = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_s.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_s.diminfo[0].strides = __pyx_pybuffernd_s.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_s.diminfo[0].shape = __pyx_pybuffernd_s.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_18 = 0;\n",
" __pyx_v_s = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF16' onclick='toggleDiv(\"line37\")'> 37: if np.sum(np.greater(s, 0)) &lt; np.sum(np.less(s, 0)):</pre>\n",
"<pre id='line37' class='code' style='background-color: #FFFF16'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":37\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # flip\n",
" * normal = -normal\n",
" */\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_4 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__greater);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_4 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__less);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_4, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\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>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\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>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_5, __pyx_t_3, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" __pyx_t_19 = __Pyx_<span class='py_c_api'>PyObject_IsTrue</span>(__pyx_t_2);<span class='error_goto'> if (unlikely(__pyx_t_19 <code><</code> 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" if (__pyx_t_19) {\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line38\")'> 38: # flip</pre>\n",
"<pre id='line38' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line39\")'> 39: normal = -normal</pre>\n",
"<pre id='line39' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":39\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" * normal = -normal # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = -normalf\n",
" * \n",
" */\n",
" __pyx_t_2 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_11 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_11, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_8, __pyx_t_9, __pyx_t_10);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_11 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line40\")'> 40: normalf = -normalf</pre>\n",
"<pre id='line40' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":40\n",
" * # flip\n",
" * normal = -normal\n",
" * normalf = -normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * return normal, normalf\n",
" */\n",
" __pyx_t_2 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normalf));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_10, __pyx_t_9, __pyx_t_8);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_6 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" goto __pyx_L7;\n",
" }\n",
" __pyx_L7:;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line41\")'> 41: </pre>\n",
"<pre id='line41' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1a' onclick='toggleDiv(\"line42\")'> 42: return normal, normalf</pre>\n",
"<pre id='line42' class='code' style='background-color: #FFFF1a'>\n",
" /* \"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.pyx\":42\n",
" * normalf = -normalf\n",
" * \n",
" * return normal, normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normal));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, ((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normalf));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, ((PyObject *)__pyx_v_normalf));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_r = ((PyObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_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",
" __PYX_XDEC_MEMVIEW(&__pyx_t_13, 1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_8a17498f1f23780b33414dc2e93cc08d.cy_compute_normal_naive\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normalf);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normal);\n",
" __PYX_XDEC_MEMVIEW(&__pyx_v_f, 1);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_v);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_s);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static PyObject *__pyx_pw_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_1cy_compute_normal_naive(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_pw_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_1cy_compute_normal_naive(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
" PyArrayObject *__pyx_v_vertex = 0;\n",
" PyArrayObject *__pyx_v_face = 0;\n",
" PyObject *__pyx_r = 0;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_naive (wrapper)\", 0);\n",
" {\n",
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex,&__pyx_n_s__face,0};\n",
" PyObject* values[2] = {0,0};\n",
" if (unlikely(__pyx_kwds)) {\n",
" Py_ssize_t kw_args;\n",
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
" switch (pos_args) {\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
" switch (pos_args) {\n",
" case 0:\n",
" if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__vertex)) != 0)) kw_args--;\n",
" else goto __pyx_L5_argtuple_error;\n",
" case 1:\n",
" if (likely((values[1] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__face)) != 0)) kw_args--;\n",
" else {\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal_naive\", 1, 2, 2, 1);<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" }\n",
" if (unlikely(kw_args > 0)) {\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"cy_compute_normal_naive\") <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n",
" goto __pyx_L5_argtuple_error;\n",
" } else {\n",
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" }\n",
" __pyx_v_vertex = ((PyArrayObject *)values[0]);\n",
" __pyx_v_face = ((PyArrayObject *)values[1]);\n",
" }\n",
" goto __pyx_L4_argument_unpacking_done;\n",
" __pyx_L5_argtuple_error:;\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal_naive\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args));<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" __pyx_L3_error:;\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_8a17498f1f23780b33414dc2e93cc08d.cy_compute_normal_naive\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return NULL;\n",
" __pyx_L4_argument_unpacking_done:;\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_vertex), __pyx_ptype_5numpy_ndarray, 1, \"vertex\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_face), __pyx_ptype_5numpy_ndarray, 1, \"face\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = __pyx_pf_46_cython_magic_8a17498f1f23780b33414dc2e93cc08d_cy_compute_normal_naive(__pyx_self, __pyx_v_vertex, __pyx_v_face);\n",
" int __pyx_lineno = 0;\n",
" const char *__pyx_filename = NULL;\n",
" int __pyx_clineno = 0;\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" __pyx_r = NULL;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre></body></html>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 23,
"text": [
"<IPython.core.display.HTML at 0xbff2dd0>"
]
}
],
"prompt_number": 23
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Looking above, we see that the majority of the code is still making calls back in to Python. In particular, the slow vetex loop is making a Python call **every iteration**. Therefore, we want to try and remove this."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython -a\n",
"\n",
"import numpy as np\n",
"cimport numpy as np\n",
"cimport cython\n",
"\n",
"\n",
"cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" d[d < np.spacing(1)] = 1.0\n",
" return vec / d[..., None]\n",
" \n",
" \n",
"cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" cdef int nface = face.shape[0]\n",
" cdef int nvert = vertex.shape[0]\n",
" \n",
" # unit normals to the faces\n",
" cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" normalf = cy_normalise_naive(normalf)\n",
" \n",
" # unit normal to the vertex\n",
" cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" cdef int f0, f1, f2\n",
" for i in range(nface):\n",
" f0 = face[i, 0]\n",
" f1 = face[i, 1]\n",
" f2 = face[i, 2]\n",
" for j in range(3):\n",
" normal[f0, j] += normalf[i, j] \n",
" normal[f1, j] += normalf[i, j] \n",
" normal[f2, j] += normalf[i, j]\n",
" \n",
" # normalize\n",
" normal = cy_normalise_naive(normal)\n",
" \n",
" # enforce that the normal are outward\n",
" cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" if np.sum(np.greater(s, 0)) < np.sum(np.less(s, 0)):\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
" \n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<!-- Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013 -->\n",
"<html>\n",
"\n",
"<head>\n",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
"<style type=\"text/css\">\n",
"\n",
"body { font-family: courier; font-size: 12; }\n",
"\n",
".code { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n",
".py_c_api { color: red; }\n",
".py_macro_api { color: #FF7000; }\n",
".pyx_c_api { color: #FF3000; }\n",
".pyx_macro_api { color: #FF7000; }\n",
".refnanny { color: #FFA000; }\n",
"\n",
".error_goto { color: #FFA000; }\n",
"\n",
".tag { }\n",
"\n",
".coerce { color: #008000; border: 1px dotted #008000 }\n",
"\n",
".py_attr { color: #FF0000; font-weight: bold; }\n",
".c_attr { color: #0000FF; }\n",
"\n",
".py_call { color: #FF0000; font-weight: bold; }\n",
".c_call { color: #0000FF; }\n",
"\n",
".line { margin: 0em }\n",
"\n",
"</style>\n",
"<script>\n",
"function toggleDiv(id) {\n",
" theDiv = document.getElementById(id);\n",
" if (theDiv.style.display == 'none') theDiv.style.display = 'block';\n",
" else theDiv.style.display = 'none';\n",
"}\n",
"</script>\n",
"</head>\n",
" <body>\n",
"<p>Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013\n",
"<pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line1\")'> 1: </pre>\n",
"<pre id='line1' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line2\")'> 2: import numpy as np</pre>\n",
"<pre id='line2' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":2\n",
" * \n",
" * import numpy as np # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cimport numpy as np\n",
" * cimport cython\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__numpy), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s__np, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line3\")'> 3: cimport numpy as np</pre>\n",
"<pre id='line3' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: cimport cython</pre>\n",
"<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line5\")'> 5: </pre>\n",
"<pre id='line5' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: </pre>\n",
"<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line7\")'> 7: cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):</pre>\n",
"<pre id='line7' class='code' style='background-color: #FFFFd4'>\n",
"/* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":7\n",
" * \n",
" * \n",
" * cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" */\n",
"\n",
"static PyArrayObject *__pyx_f_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_normalise_naive(PyArrayObject *__pyx_v_vec) {\n",
" PyArrayObject *__pyx_v_d = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_d;\n",
" __Pyx_Buffer __pyx_pybuffer_d;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vec;\n",
" __Pyx_Buffer __pyx_pybuffer_vec;\n",
" PyArrayObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_normalise_naive\", 0);\n",
" __pyx_pybuffer_d.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_d.refcount = 0;\n",
" __pyx_pybuffernd_d.data = NULL;\n",
" __pyx_pybuffernd_d.rcbuffer = &__pyx_pybuffer_d;\n",
" __pyx_pybuffer_vec.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vec.refcount = 0;\n",
" __pyx_pybuffernd_vec.data = NULL;\n",
" __pyx_pybuffernd_vec.rcbuffer = &__pyx_pybuffer_vec;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vec.diminfo[0].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vec.diminfo[0].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vec.diminfo[1].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vec.diminfo[1].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[1];\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line8\")'> 8: # Avoid divisions by almost 0 numbers</pre>\n",
"<pre id='line8' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF22' onclick='toggleDiv(\"line9\")'> 9: cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))</pre>\n",
"<pre id='line9' class='code' style='background-color: #FFFF22'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":9\n",
" * cdef np.ndarray[np.float64_t, ndim=2] cy_normalise_naive(np.ndarray[np.float64_t, ndim=2] vec):\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1)) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None]\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sqrt);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_3 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyNumber_Power</span>(((PyObject *)__pyx_v_vec), __pyx_int_2, Py_None);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_3, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_d = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_d.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_d.diminfo[0].strides = __pyx_pybuffernd_d.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_d.diminfo[0].shape = __pyx_pybuffernd_d.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_6 = 0;\n",
" __pyx_v_d = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF36' onclick='toggleDiv(\"line10\")'> 10: d[d &lt; np.spacing(1)] = 1.0</pre>\n",
"<pre id='line10' class='code' style='background-color: #FFFF36'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>(1.0);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__spacing);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_k_tuple_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_RichCompare</span>(((PyObject *)__pyx_v_d), __pyx_t_1, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" if (<span class='py_c_api'>PyObject_SetItem</span>(((PyObject *)__pyx_v_d), __pyx_t_2, __pyx_t_5) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_k_tuple_1 = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_1));\n",
"</pre><pre class='line' style='background-color: #FFFF32' onclick='toggleDiv(\"line11\")'> 11: return vec / d[..., None]</pre>\n",
"<pre id='line11' class='code' style='background-color: #FFFF32'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(((PyObject *)__pyx_r));\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_d), ((PyObject *)__pyx_k_tuple_2));<span class='error_goto'> if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyNumber_Divide</span>(((PyObject *)__pyx_v_vec), __pyx_t_5);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_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",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.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_e68c2952022b03511661b5dfa01f749b.cy_normalise_naive\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_d);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>((PyObject *)__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" __pyx_k_tuple_2 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_2));\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line12\")'> 12: </pre>\n",
"<pre id='line12' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line13\")'> 13: </pre>\n",
"<pre id='line13' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF44' onclick='toggleDiv(\"line14\")'> 14: cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):</pre>\n",
"<pre id='line14' class='code' style='background-color: #FFFF44'>\n",
"/* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pw_46_cython_magic_e68c2952022b03511661b5dfa01f749b_1cy_compute_normal_better(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_f_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_compute_normal_better(PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face, CYTHON_UNUSED int __pyx_skip_dispatch) {\n",
" int __pyx_v_nface;\n",
" int __pyx_v_nvert;\n",
" PyArrayObject *__pyx_v_normalf = 0;\n",
" PyArrayObject *__pyx_v_normal = 0;\n",
" int __pyx_v_f0;\n",
" int __pyx_v_f1;\n",
" int __pyx_v_f2;\n",
" int __pyx_v_i;\n",
" long __pyx_v_j;\n",
" PyArrayObject *__pyx_v_v = 0;\n",
" PyArrayObject *__pyx_v_s = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normal;\n",
" __Pyx_Buffer __pyx_pybuffer_normal;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normalf;\n",
" __Pyx_Buffer __pyx_pybuffer_normalf;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_s;\n",
" __Pyx_Buffer __pyx_pybuffer_s;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_v;\n",
" __Pyx_Buffer __pyx_pybuffer_v;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_better\", 0);\n",
" __pyx_pybuffer_normalf.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normalf.refcount = 0;\n",
" __pyx_pybuffernd_normalf.data = NULL;\n",
" __pyx_pybuffernd_normalf.rcbuffer = &__pyx_pybuffer_normalf;\n",
" __pyx_pybuffer_normal.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normal.refcount = 0;\n",
" __pyx_pybuffernd_normal.data = NULL;\n",
" __pyx_pybuffernd_normal.rcbuffer = &__pyx_pybuffer_normal;\n",
" __pyx_pybuffer_v.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_v.refcount = 0;\n",
" __pyx_pybuffernd_v.data = NULL;\n",
" __pyx_pybuffernd_v.rcbuffer = &__pyx_pybuffer_v;\n",
" __pyx_pybuffer_s.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_s.refcount = 0;\n",
" __pyx_pybuffernd_s.data = NULL;\n",
" __pyx_pybuffernd_s.rcbuffer = &__pyx_pybuffer_s;\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
"\n",
"/* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":14\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pf_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_compute_normal_better(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face) {\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_better\", 0);\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_1 = __pyx_f_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_compute_normal_better(__pyx_v_vertex, __pyx_v_face, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_r = __pyx_t_1;\n",
" __pyx_t_1 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_e68c2952022b03511661b5dfa01f749b.cy_compute_normal_better\", __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_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n",
" int __pyx_r;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"__getbuffer__ (wrapper)\", 0);\n",
" __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line15\")'> 15: cdef int nface = face.shape[0]</pre>\n",
"<pre id='line15' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":15\n",
" * \n",
" * cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nvert = vertex.shape[0]\n",
" * \n",
" */\n",
" __pyx_v_nface = (__pyx_v_face->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line16\")'> 16: cdef int nvert = vertex.shape[0]</pre>\n",
"<pre id='line16' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":16\n",
" * cpdef cy_compute_normal_better(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normals to the faces\n",
" */\n",
" __pyx_v_nvert = (__pyx_v_vertex->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line17\")'> 17: </pre>\n",
"<pre id='line17' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line18\")'> 18: # unit normals to the faces</pre>\n",
"<pre id='line18' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1b' onclick='toggleDiv(\"line19\")'> 19: cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],</pre>\n",
"<pre id='line19' class='code' style='background-color: #FFFF1b'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":19\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf)\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__cross);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":19\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf)\n",
" */\n",
" __pyx_k_slice_3 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_3);\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_4));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_k_tuple_4 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_3, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_4);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_4));\n",
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_3));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
" __pyx_k_slice_5 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_k_slice_6 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_6);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_6);\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_7));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_k_tuple_7 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_6, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_7);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_7));\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_8);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, __pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_4));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_1, __pyx_t_3);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\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_3); __pyx_t_3 = 0;\n",
" __pyx_k_slice_8 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
"</pre><pre class='line' style='background-color: #FFFF18' onclick='toggleDiv(\"line20\")'> 20: vertex[face[:, 2], :] - vertex[face[:, 0], :])</pre>\n",
"<pre id='line20' class='code' style='background-color: #FFFF18'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":20\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = cy_normalise_naive(normalf)\n",
" * \n",
" */\n",
" __pyx_k_slice_9 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_9);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_9);\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":20\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = cy_normalise_naive(normalf)\n",
" * \n",
" */\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_10));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_k_tuple_10 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_9, __pyx_int_2);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_10);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_10));\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_11);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_k_slice_11 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_k_slice_12 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_12);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_12);\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_13));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_k_tuple_13 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_12, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_13);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_13));\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_14);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 1, __pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_5));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_3, __pyx_t_1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_4);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_4 = 0;\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normalf = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_6 = 0;\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_k_slice_14 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
"</pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line21\")'> 21: normalf = cy_normalise_naive(normalf)</pre>\n",
"<pre id='line21' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":21\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = np.cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = cy_normalise_naive(normalf) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normal to the vertex\n",
" */\n",
" __pyx_t_5 = ((PyObject *)__pyx_f_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_normalise_naive(((PyArrayObject *)__pyx_v_normalf)));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_5), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_8, __pyx_t_9, __pyx_t_10);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 21; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line22\")'> 22: </pre>\n",
"<pre id='line22' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line23\")'> 23: # unit normal to the vertex</pre>\n",
"<pre id='line23' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line24\")'> 24: cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])</pre>\n",
"<pre id='line24' class='code' style='background-color: #FFFF34'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":24\n",
" * \n",
" * # unit normal to the vertex\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface):\n",
" */\n",
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_5, __pyx_n_s__zeros);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyInt_FromLong</span>(__pyx_v_nvert);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_2 = <span class='py_c_api'>PyList_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_2, 1, __pyx_int_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_3);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, ((PyObject *)__pyx_t_2));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_t_2));\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_5), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\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>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_11 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_11, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normal = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_11 = 0;\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line25\")'> 25: cdef int f0, f1, f2</pre>\n",
"<pre id='line25' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line26\")'> 26: for i in range(nface):</pre>\n",
"<pre id='line26' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":26\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1]\n",
" */\n",
" __pyx_t_7 = __pyx_v_nface;\n",
" for (__pyx_t_12 = 0; __pyx_t_12 <code><</code> __pyx_t_7; __pyx_t_12+=1) {\n",
" __pyx_v_i = __pyx_t_12;\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line27\")'> 27: f0 = face[i, 0]</pre>\n",
"<pre id='line27' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":27\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface):\n",
" * f0 = face[i, 0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2]\n",
" */\n",
" __pyx_t_13 = __pyx_v_i;\n",
" __pyx_t_14 = 0;\n",
" __pyx_t_15 = -1;\n",
" if (__pyx_t_13 <code><</code> 0) {\n",
" __pyx_t_13 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_13 <code><</code> 0)) __pyx_t_15 = 0;\n",
" } else if (unlikely(__pyx_t_13 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_15 = 0;\n",
" if (__pyx_t_14 <code><</code> 0) {\n",
" __pyx_t_14 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_14 <code><</code> 0)) __pyx_t_15 = 1;\n",
" } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_15 = 1;\n",
" if (unlikely(__pyx_t_15 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_15);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 27; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f0 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_13, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_14, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line28\")'> 28: f1 = face[i, 1]</pre>\n",
"<pre id='line28' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":28\n",
" * for i in range(nface):\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f2 = face[i, 2]\n",
" * for j in range(3):\n",
" */\n",
" __pyx_t_15 = __pyx_v_i;\n",
" __pyx_t_16 = 1;\n",
" __pyx_t_17 = -1;\n",
" if (__pyx_t_15 <code><</code> 0) {\n",
" __pyx_t_15 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_15 <code><</code> 0)) __pyx_t_17 = 0;\n",
" } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_17 = 0;\n",
" if (__pyx_t_16 <code><</code> 0) {\n",
" __pyx_t_16 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_16 <code><</code> 0)) __pyx_t_17 = 1;\n",
" } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_17 = 1;\n",
" if (unlikely(__pyx_t_17 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_17);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 28; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f1 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line29\")'> 29: f2 = face[i, 2]</pre>\n",
"<pre id='line29' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":29\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j]\n",
" */\n",
" __pyx_t_17 = __pyx_v_i;\n",
" __pyx_t_18 = 2;\n",
" __pyx_t_19 = -1;\n",
" if (__pyx_t_17 <code><</code> 0) {\n",
" __pyx_t_17 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_17 <code><</code> 0)) __pyx_t_19 = 0;\n",
" } else if (unlikely(__pyx_t_17 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_19 = 0;\n",
" if (__pyx_t_18 <code><</code> 0) {\n",
" __pyx_t_18 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_18 <code><</code> 0)) __pyx_t_19 = 1;\n",
" } else if (unlikely(__pyx_t_18 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_19 = 1;\n",
" if (unlikely(__pyx_t_19 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_19);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f2 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_17, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_18, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line30\")'> 30: for j in range(3):</pre>\n",
"<pre id='line30' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":30\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2]\n",
" * for j in range(3): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j]\n",
" */\n",
" for (__pyx_t_20 = 0; __pyx_t_20 <code><</code> 3; __pyx_t_20+=1) {\n",
" __pyx_v_j = __pyx_t_20;\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line31\")'> 31: normal[f0, j] += normalf[i, j]</pre>\n",
"<pre id='line31' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":31\n",
" * f2 = face[i, 2]\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f1, j] += normalf[i, j]\n",
" * normal[f2, j] += normalf[i, j]\n",
" */\n",
" __pyx_t_19 = __pyx_v_i;\n",
" __pyx_t_21 = __pyx_v_j;\n",
" __pyx_t_22 = -1;\n",
" if (__pyx_t_19 <code><</code> 0) {\n",
" __pyx_t_19 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_19 <code><</code> 0)) __pyx_t_22 = 0;\n",
" } else if (unlikely(__pyx_t_19 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_22 = 0;\n",
" if (__pyx_t_21 <code><</code> 0) {\n",
" __pyx_t_21 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_21 <code><</code> 0)) __pyx_t_22 = 1;\n",
" } else if (unlikely(__pyx_t_21 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_22 = 1;\n",
" if (unlikely(__pyx_t_22 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_22);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_22 = __pyx_v_f0;\n",
" __pyx_t_23 = __pyx_v_j;\n",
" __pyx_t_24 = -1;\n",
" if (__pyx_t_22 <code><</code> 0) {\n",
" __pyx_t_22 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_22 <code><</code> 0)) __pyx_t_24 = 0;\n",
" } else if (unlikely(__pyx_t_22 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_24 = 0;\n",
" if (__pyx_t_23 <code><</code> 0) {\n",
" __pyx_t_23 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_23 <code><</code> 0)) __pyx_t_24 = 1;\n",
" } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_24 = 1;\n",
" if (unlikely(__pyx_t_24 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_24);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_22, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_23, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_19, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_21, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line32\")'> 32: normal[f1, j] += normalf[i, j]</pre>\n",
"<pre id='line32' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":32\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f2, j] += normalf[i, j]\n",
" * \n",
" */\n",
" __pyx_t_24 = __pyx_v_i;\n",
" __pyx_t_25 = __pyx_v_j;\n",
" __pyx_t_26 = -1;\n",
" if (__pyx_t_24 <code><</code> 0) {\n",
" __pyx_t_24 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_24 <code><</code> 0)) __pyx_t_26 = 0;\n",
" } else if (unlikely(__pyx_t_24 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_26 = 0;\n",
" if (__pyx_t_25 <code><</code> 0) {\n",
" __pyx_t_25 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_25 <code><</code> 0)) __pyx_t_26 = 1;\n",
" } else if (unlikely(__pyx_t_25 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_26 = 1;\n",
" if (unlikely(__pyx_t_26 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_26);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_26 = __pyx_v_f1;\n",
" __pyx_t_27 = __pyx_v_j;\n",
" __pyx_t_28 = -1;\n",
" if (__pyx_t_26 <code><</code> 0) {\n",
" __pyx_t_26 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_26 <code><</code> 0)) __pyx_t_28 = 0;\n",
" } else if (unlikely(__pyx_t_26 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_28 = 0;\n",
" if (__pyx_t_27 <code><</code> 0) {\n",
" __pyx_t_27 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_27 <code><</code> 0)) __pyx_t_28 = 1;\n",
" } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_28 = 1;\n",
" if (unlikely(__pyx_t_28 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_28);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_26, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_27, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_24, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_25, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line33\")'> 33: normal[f2, j] += normalf[i, j]</pre>\n",
"<pre id='line33' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":33\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j]\n",
" * normal[f2, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # normalize\n",
" */\n",
" __pyx_t_28 = __pyx_v_i;\n",
" __pyx_t_29 = __pyx_v_j;\n",
" __pyx_t_30 = -1;\n",
" if (__pyx_t_28 <code><</code> 0) {\n",
" __pyx_t_28 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_28 <code><</code> 0)) __pyx_t_30 = 0;\n",
" } else if (unlikely(__pyx_t_28 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_30 = 0;\n",
" if (__pyx_t_29 <code><</code> 0) {\n",
" __pyx_t_29 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_29 <code><</code> 0)) __pyx_t_30 = 1;\n",
" } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_30 = 1;\n",
" if (unlikely(__pyx_t_30 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_30);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_30 = __pyx_v_f2;\n",
" __pyx_t_31 = __pyx_v_j;\n",
" __pyx_t_32 = -1;\n",
" if (__pyx_t_30 <code><</code> 0) {\n",
" __pyx_t_30 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_30 <code><</code> 0)) __pyx_t_32 = 0;\n",
" } else if (unlikely(__pyx_t_30 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_32 = 0;\n",
" if (__pyx_t_31 <code><</code> 0) {\n",
" __pyx_t_31 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_31 <code><</code> 0)) __pyx_t_32 = 1;\n",
" } else if (unlikely(__pyx_t_31 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_32 = 1;\n",
" if (unlikely(__pyx_t_32 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_32);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_30, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_31, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_28, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_29, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
" }\n",
" }\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line34\")'> 34: </pre>\n",
"<pre id='line34' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line35\")'> 35: # normalize</pre>\n",
"<pre id='line35' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line36\")'> 36: normal = cy_normalise_naive(normal)</pre>\n",
"<pre id='line36' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":36\n",
" * \n",
" * # normalize\n",
" * normal = cy_normalise_naive(normal) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # enforce that the normal are outward\n",
" */\n",
" __pyx_t_2 = ((PyObject *)__pyx_f_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_normalise_naive(((PyArrayObject *)__pyx_v_normal)));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_2), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_10, __pyx_t_9, __pyx_t_8);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 36; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line37\")'> 37: </pre>\n",
"<pre id='line37' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line38\")'> 38: # enforce that the normal are outward</pre>\n",
"<pre id='line38' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF2f' onclick='toggleDiv(\"line39\")'> 39: cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]</pre>\n",
"<pre id='line39' class='code' style='background-color: #FFFF2f'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":39\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_5 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__mean);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_vertex));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, ((PyObject *)__pyx_v_vertex));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_vertex));\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_5, ((PyObject *)__pyx_t_2), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_1, ((PyObject *)__pyx_k_tuple_15));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyNumber_Subtract</span>(((PyObject *)__pyx_v_vertex), __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" if (!(likely(((__pyx_t_1) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_1, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_33 = ((PyArrayObject *)__pyx_t_1);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer, (PyObject*)__pyx_t_33, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_v = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_v.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_v.diminfo[0].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_v.diminfo[0].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_v.diminfo[1].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_v.diminfo[1].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_33 = 0;\n",
" __pyx_v_v = ((PyArrayObject *)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":39\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_k_tuple_15 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_15);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_15));\n",
"</pre><pre class='line' style='background-color: #FFFF31' onclick='toggleDiv(\"line40\")'> 40: cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)</pre>\n",
"<pre id='line40' class='code' style='background-color: #FFFF31'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":40\n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyNumber_Multiply</span>(((PyObject *)__pyx_v_v), ((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_5 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_5, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_4 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_5), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_4) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_4, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_34 = ((PyArrayObject *)__pyx_t_4);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer, (PyObject*)__pyx_t_34, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_s = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_s.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_s.diminfo[0].strides = __pyx_pybuffernd_s.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_s.diminfo[0].shape = __pyx_pybuffernd_s.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_34 = 0;\n",
" __pyx_v_s = ((PyArrayObject *)__pyx_t_4);\n",
" __pyx_t_4 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF16' onclick='toggleDiv(\"line41\")'> 41: if np.sum(np.greater(s, 0)) &lt; np.sum(np.less(s, 0)):</pre>\n",
"<pre id='line41' class='code' style='background-color: #FFFF16'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":41\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # flip\n",
" * normal = -normal\n",
" */\n",
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" __pyx_t_5 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s__greater);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_5, ((PyObject *)__pyx_t_4), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\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>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" __pyx_t_5 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_4, __pyx_n_s__less);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_5, ((PyObject *)__pyx_t_4), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\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>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" __pyx_t_4 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_2, __pyx_t_3, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_4);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" __pyx_t_35 = __Pyx_<span class='py_c_api'>PyObject_IsTrue</span>(__pyx_t_4);<span class='error_goto'> if (unlikely(__pyx_t_35 <code><</code> 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 41; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_4); __pyx_t_4 = 0;\n",
" if (__pyx_t_35) {\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line42\")'> 42: # flip</pre>\n",
"<pre id='line42' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line43\")'> 43: normal = -normal</pre>\n",
"<pre id='line43' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":43\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" * normal = -normal # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = -normalf\n",
" * \n",
" */\n",
" __pyx_t_4 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" if (!(likely(((__pyx_t_4) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_4, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_11 = ((PyArrayObject *)__pyx_t_4);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_11, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_10);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_8, __pyx_t_9, __pyx_t_10);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_11 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_4);\n",
" __pyx_t_4 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line44\")'> 44: normalf = -normalf</pre>\n",
"<pre id='line44' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":44\n",
" * # flip\n",
" * normal = -normal\n",
" * normalf = -normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * return normal, normalf\n",
" */\n",
" __pyx_t_4 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normalf));<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" if (!(likely(((__pyx_t_4) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_4, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_4);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_7 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_10, __pyx_t_9, __pyx_t_8);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_6 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_4);\n",
" __pyx_t_4 = 0;\n",
" goto __pyx_L7;\n",
" }\n",
" __pyx_L7:;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line45\")'> 45: </pre>\n",
"<pre id='line45' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1a' onclick='toggleDiv(\"line46\")'> 46: return normal, normalf</pre>\n",
"<pre id='line46' class='code' style='background-color: #FFFF1a'>\n",
" /* \"_cython_magic_e68c2952022b03511661b5dfa01f749b.pyx\":46\n",
" * normalf = -normalf\n",
" * \n",
" * return normal, normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_4 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normal));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, ((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normalf));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 1, ((PyObject *)__pyx_v_normalf));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_r = ((PyObject *)__pyx_t_4);\n",
" __pyx_t_4 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_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",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_e68c2952022b03511661b5dfa01f749b.cy_compute_normal_better\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normalf);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normal);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_v);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_s);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static PyObject *__pyx_pw_46_cython_magic_e68c2952022b03511661b5dfa01f749b_1cy_compute_normal_better(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_pw_46_cython_magic_e68c2952022b03511661b5dfa01f749b_1cy_compute_normal_better(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
" PyArrayObject *__pyx_v_vertex = 0;\n",
" PyArrayObject *__pyx_v_face = 0;\n",
" PyObject *__pyx_r = 0;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal_better (wrapper)\", 0);\n",
" {\n",
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex,&__pyx_n_s__face,0};\n",
" PyObject* values[2] = {0,0};\n",
" if (unlikely(__pyx_kwds)) {\n",
" Py_ssize_t kw_args;\n",
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
" switch (pos_args) {\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
" switch (pos_args) {\n",
" case 0:\n",
" if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__vertex)) != 0)) kw_args--;\n",
" else goto __pyx_L5_argtuple_error;\n",
" case 1:\n",
" if (likely((values[1] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__face)) != 0)) kw_args--;\n",
" else {\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal_better\", 1, 2, 2, 1);<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" }\n",
" if (unlikely(kw_args > 0)) {\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"cy_compute_normal_better\") <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n",
" goto __pyx_L5_argtuple_error;\n",
" } else {\n",
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" }\n",
" __pyx_v_vertex = ((PyArrayObject *)values[0]);\n",
" __pyx_v_face = ((PyArrayObject *)values[1]);\n",
" }\n",
" goto __pyx_L4_argument_unpacking_done;\n",
" __pyx_L5_argtuple_error:;\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal_better\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args));<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" __pyx_L3_error:;\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_e68c2952022b03511661b5dfa01f749b.cy_compute_normal_better\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return NULL;\n",
" __pyx_L4_argument_unpacking_done:;\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_vertex), __pyx_ptype_5numpy_ndarray, 1, \"vertex\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_face), __pyx_ptype_5numpy_ndarray, 1, \"face\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = __pyx_pf_46_cython_magic_e68c2952022b03511661b5dfa01f749b_cy_compute_normal_better(__pyx_self, __pyx_v_vertex, __pyx_v_face);\n",
" int __pyx_lineno = 0;\n",
" const char *__pyx_filename = NULL;\n",
" int __pyx_clineno = 0;\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" __pyx_r = NULL;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre></body></html>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 24,
"text": [
"<IPython.core.display.HTML at 0xbff26d0>"
]
}
],
"prompt_number": 24
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Eureka! By turning lines ``24-36`` to pure C, just by guaranteeing their accesses as C types, we have sped up our function to approximately 80 ms. This represents an approximate 38x speedup from the original! And all we did was partially unwrap a single loop. This is the key when trying to optimise Cython code. You need to ensure that all loops make as few calls in to Python code as possible."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit cy_compute_normal_better(points, tris)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 73 ms per loop\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Diminishing Returns\n",
"-------------------\n",
"So now the game has become trying to turn as much of that Yellow code in to white code. Note that there is certainly a diminishing law of returns going on here. Our previous optimisation was almost certainly the largest jump in performance we will be able to achieve. Given that we don't gave any other loops, we are unlikely to get large 100+% jumps in performance. Numpy calls are already vectorized and manually unrolling them in to loops will not yield a very big performance boost. If we run the magic function ``%prun``, this will give us profiling information about the functions that are called. We use the ``-r`` flag in order to return the profiler object so that we can print it in to the cell. Normally, this need just be called as:\n",
"\n",
"```python\n",
" %prun cy_compute_normal_better(points, tris)\n",
"```\n",
"\n",
"which opens up a seperate window in the notebook."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"p = %prun -r cy_compute_normal_better(points, tris)\n",
"p.print_stats()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 40 function calls in 0.075 seconds\n",
"\n",
" Ordered by: internal time\n",
"\n",
" ncalls tottime percall cumtime percall filename:lineno(function)\n",
" 1 0.043 0.043 0.075 0.075 {_cython_magic_e68c2952022b03511661b5dfa01f749b.cy_compute_normal_better}\n",
" 4 0.028 0.007 0.028 0.007 {numpy.core.multiarray.array}\n",
" 1 0.002 0.002 0.030 0.030 numeric.py:1214(cross)\n",
" 6 0.002 0.000 0.002 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n",
" 5 0.000 0.000 0.002 0.000 fromnumeric.py:1422(sum)\n",
" 1 0.000 0.000 0.000 0.000 _methods.py:42(_mean)\n",
" 5 0.000 0.000 0.002 0.000 _methods.py:16(_sum)\n",
" 1 0.000 0.000 0.000 0.000 _methods.py:32(_count_reduce_items)\n",
" 3 0.000 0.000 0.000 0.000 {method 'swapaxes' of 'numpy.ndarray' objects}\n",
" 2 0.000 0.000 0.000 0.000 numeric.py:252(asarray)\n",
" 7 0.000 0.000 0.000 0.000 {isinstance}\n",
" 1 0.000 0.000 0.075 0.075 <string>:1(<module>)\n",
" 1 0.000 0.000 0.000 0.000 fromnumeric.py:2405(mean)\n",
" 1 0.000 0.000 0.000 0.000 numeric.py:322(asanyarray)\n",
" 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n",
"\n",
"\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 26,
"text": [
"<pstats.Stats instance at 0x96f6290>"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The profiling output tells us that the majority of the time is spent inside the Cython function. However, almost half the time is spent inside the numpy cross product function. Looking at the source code of numpy's cross product shows us that it does a bunch of checks to try and ensure that the shapes of the vectors match. However, we know that are guaranteed to have standard ``Nx3`` vectors. So, what happens if we roll our own cross product method?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%cython -a\n",
"\n",
"import numpy as np\n",
"cimport numpy as np\n",
"cimport cython\n",
"\n",
" \n",
"cdef np.ndarray[np.float64_t, ndim=2] normalise(np.ndarray[np.float64_t, ndim=2] vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" d[d < np.spacing(1)] = 1.0\n",
" return vec / d[..., None]\n",
" \n",
"\n",
"cdef inline np.ndarray[np.float64_t, ndim=2] cross(double[:, :] x, double[:, :] y):\n",
" cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x)\n",
" cdef int n = x.shape[0]\n",
" for i in range(n):\n",
" z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]\n",
" z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]\n",
" \n",
" return z\n",
"\n",
"\n",
"cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" cdef int nface = face.shape[0]\n",
" cdef int nvert = vertex.shape[0]\n",
" \n",
" # unit normals to the faces\n",
" cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" normalf = normalise(normalf)\n",
" \n",
" # unit normal to the vertex\n",
" cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" cdef int f0, f1, f2\n",
" for i in range(nface):\n",
" f0 = face[i, 0]\n",
" f1 = face[i, 1]\n",
" f2 = face[i, 2]\n",
" for j in range(3):\n",
" normal[f0, j] += normalf[i, j] \n",
" normal[f1, j] += normalf[i, j] \n",
" normal[f2, j] += normalf[i, j]\n",
" \n",
" # normalize\n",
" normal = normalise(normal)\n",
" \n",
" # enforce that the normal are outward\n",
" cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" if np.sum(np.greater(s, 0)) < np.sum(np.less(s, 0)):\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
" \n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"<!-- Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013 -->\n",
"<html>\n",
"\n",
"<head>\n",
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n",
"<style type=\"text/css\">\n",
"\n",
"body { font-family: courier; font-size: 12; }\n",
"\n",
".code { font-size: 9; color: #444444; display: none; margin-left: 20px; }\n",
".py_c_api { color: red; }\n",
".py_macro_api { color: #FF7000; }\n",
".pyx_c_api { color: #FF3000; }\n",
".pyx_macro_api { color: #FF7000; }\n",
".refnanny { color: #FFA000; }\n",
"\n",
".error_goto { color: #FFA000; }\n",
"\n",
".tag { }\n",
"\n",
".coerce { color: #008000; border: 1px dotted #008000 }\n",
"\n",
".py_attr { color: #FF0000; font-weight: bold; }\n",
".c_attr { color: #0000FF; }\n",
"\n",
".py_call { color: #FF0000; font-weight: bold; }\n",
".c_call { color: #0000FF; }\n",
"\n",
".line { margin: 0em }\n",
"\n",
"</style>\n",
"<script>\n",
"function toggleDiv(id) {\n",
" theDiv = document.getElementById(id);\n",
" if (theDiv.style.display == 'none') theDiv.style.display = 'block';\n",
" else theDiv.style.display = 'none';\n",
"}\n",
"</script>\n",
"</head>\n",
" <body>\n",
"<p>Generated by Cython 0.19.1 on Fri Aug 16 16:37:23 2013\n",
"<pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line1\")'> 1: </pre>\n",
"<pre id='line1' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line2\")'> 2: import numpy as np</pre>\n",
"<pre id='line2' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":2\n",
" * \n",
" * import numpy as np # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cimport numpy as np\n",
" * cimport cython\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_Import</span>(((PyObject *)__pyx_n_s__numpy), 0, -1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s__np, __pyx_t_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":25\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line3\")'> 3: cimport numpy as np</pre>\n",
"<pre id='line3' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line4\")'> 4: cimport cython</pre>\n",
"<pre id='line4' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line5\")'> 5: </pre>\n",
"<pre id='line5' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line6\")'> 6: </pre>\n",
"<pre id='line6' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line7\")'> 7: cdef np.ndarray[np.float64_t, ndim=2] normalise(np.ndarray[np.float64_t, ndim=2] vec):</pre>\n",
"<pre id='line7' class='code' style='background-color: #FFFFd4'>\n",
"/* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":7\n",
" * \n",
" * \n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalise(np.ndarray[np.float64_t, ndim=2] vec): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" */\n",
"\n",
"static PyArrayObject *__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_normalise(PyArrayObject *__pyx_v_vec) {\n",
" PyArrayObject *__pyx_v_d = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_d;\n",
" __Pyx_Buffer __pyx_pybuffer_d;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vec;\n",
" __Pyx_Buffer __pyx_pybuffer_vec;\n",
" PyArrayObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"normalise\", 0);\n",
" __pyx_pybuffer_d.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_d.refcount = 0;\n",
" __pyx_pybuffernd_d.data = NULL;\n",
" __pyx_pybuffernd_d.rcbuffer = &__pyx_pybuffer_d;\n",
" __pyx_pybuffer_vec.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vec.refcount = 0;\n",
" __pyx_pybuffernd_vec.data = NULL;\n",
" __pyx_pybuffernd_vec.rcbuffer = &__pyx_pybuffer_vec;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer, (PyObject*)__pyx_v_vec, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 7; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vec.diminfo[0].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vec.diminfo[0].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vec.diminfo[1].strides = __pyx_pybuffernd_vec.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vec.diminfo[1].shape = __pyx_pybuffernd_vec.rcbuffer->pybuffer.shape[1];\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line8\")'> 8: # Avoid divisions by almost 0 numbers</pre>\n",
"<pre id='line8' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF22' onclick='toggleDiv(\"line9\")'> 9: cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))</pre>\n",
"<pre id='line9' class='code' style='background-color: #FFFF22'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":9\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalise(np.ndarray[np.float64_t, ndim=2] vec):\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1)) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None]\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sqrt);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_3 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyNumber_Power</span>(((PyObject *)__pyx_v_vec), __pyx_int_2, Py_None);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_4);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_4, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_1));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_1, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_3, ((PyObject *)__pyx_t_4), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\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>(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_5) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_5, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_6 = ((PyArrayObject *)__pyx_t_5);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer, (PyObject*)__pyx_t_6, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_d = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_d.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_d.diminfo[0].strides = __pyx_pybuffernd_d.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_d.diminfo[0].shape = __pyx_pybuffernd_d.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_6 = 0;\n",
" __pyx_v_d = ((PyArrayObject *)__pyx_t_5);\n",
" __pyx_t_5 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF36' onclick='toggleDiv(\"line10\")'> 10: d[d &lt; np.spacing(1)] = 1.0</pre>\n",
"<pre id='line10' class='code' style='background-color: #FFFF36'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_t_5 = <span class='py_c_api'>PyFloat_FromDouble</span>(1.0);<span class='error_goto'> if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__spacing);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_k_tuple_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_RichCompare</span>(((PyObject *)__pyx_v_d), __pyx_t_1, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" if (<span class='py_c_api'>PyObject_SetItem</span>(((PyObject *)__pyx_v_d), __pyx_t_2, __pyx_t_5) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":10\n",
" * # Avoid divisions by almost 0 numbers\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0 # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * return vec / d[..., None]\n",
" * \n",
" */\n",
" __pyx_k_tuple_1 = <span class='py_c_api'>PyTuple_Pack</span>(1, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_1));\n",
"</pre><pre class='line' style='background-color: #FFFF32' onclick='toggleDiv(\"line11\")'> 11: return vec / d[..., None]</pre>\n",
"<pre id='line11' class='code' style='background-color: #FFFF32'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(((PyObject *)__pyx_r));\n",
" __pyx_t_5 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_d), ((PyObject *)__pyx_k_tuple_2));<span class='error_goto'> if (!__pyx_t_5) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_5);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyNumber_Divide</span>(((PyObject *)__pyx_v_vec), __pyx_t_5);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_5); __pyx_t_5 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_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",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.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_637c713b986c525e98b048fef3dc5c09.normalise\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_d.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vec.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_d);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>((PyObject *)__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":11\n",
" * cdef np.ndarray[np.float64_t, ndim=1] d = np.sqrt(np.sum(vec ** 2, axis=1))\n",
" * d[d <code><</code> np.spacing(1)] = 1.0\n",
" * return vec / d[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" __pyx_k_tuple_2 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_2));\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line12\")'> 12: </pre>\n",
"<pre id='line12' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line13\")'> 13: </pre>\n",
"<pre id='line13' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line14\")'> 14: cdef inline np.ndarray[np.float64_t, ndim=2] cross(double[:, :] x, double[:, :] y):</pre>\n",
"<pre id='line14' class='code' style='background-color: #FFFFff'>\n",
"/* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":14\n",
" * \n",
" * \n",
" * cdef inline np.ndarray[np.float64_t, ndim=2] cross(double[:, :] x, double[:, :] y): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x)\n",
" * cdef int n = x.shape[0]\n",
" */\n",
"\n",
"static CYTHON_INLINE PyArrayObject *__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cross(__Pyx_memviewslice __pyx_v_x, __Pyx_memviewslice __pyx_v_y) {\n",
" PyArrayObject *__pyx_v_z = 0;\n",
" int __pyx_v_n;\n",
" int __pyx_v_i;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_z;\n",
" __Pyx_Buffer __pyx_pybuffer_z;\n",
" PyArrayObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cross\", 0);\n",
" __pyx_pybuffer_z.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_z.refcount = 0;\n",
" __pyx_pybuffernd_z.data = NULL;\n",
" __pyx_pybuffernd_z.rcbuffer = &__pyx_pybuffer_z;\n",
"</pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line15\")'> 15: cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x)</pre>\n",
"<pre id='line15' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":15\n",
" * \n",
" * cdef inline np.ndarray[np.float64_t, ndim=2] cross(double[:, :] x, double[:, :] y):\n",
" * cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int n = x.shape[0]\n",
" * for i in range(n):\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__empty_like);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = __pyx_memoryview_fromslice(__pyx_v_x, 2, (PyObject *(*)(char *)) __pyx_memview_get_double, (int (*)(char *, PyObject *)) __pyx_memview_set_double, 0);;<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
" if (!(likely(((__pyx_t_1) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_1, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_4 = ((PyArrayObject *)__pyx_t_1);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_z.rcbuffer->pybuffer, (PyObject*)__pyx_t_4, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_z = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_z.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 15; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_z.diminfo[0].strides = __pyx_pybuffernd_z.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_z.diminfo[0].shape = __pyx_pybuffernd_z.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_z.diminfo[1].strides = __pyx_pybuffernd_z.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_z.diminfo[1].shape = __pyx_pybuffernd_z.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_4 = 0;\n",
" __pyx_v_z = ((PyArrayObject *)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line16\")'> 16: cdef int n = x.shape[0]</pre>\n",
"<pre id='line16' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":16\n",
" * cdef inline np.ndarray[np.float64_t, ndim=2] cross(double[:, :] x, double[:, :] y):\n",
" * cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x)\n",
" * cdef int n = x.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * for i in range(n):\n",
" * z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" */\n",
" __pyx_v_n = (__pyx_v_x.shape[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line17\")'> 17: for i in range(n):</pre>\n",
"<pre id='line17' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":17\n",
" * cdef np.ndarray[np.float64_t, ndim=2] z = np.empty_like(x)\n",
" * cdef int n = x.shape[0]\n",
" * for i in range(n): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" * z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]\n",
" */\n",
" __pyx_t_5 = __pyx_v_n;\n",
" for (__pyx_t_6 = 0; __pyx_t_6 <code><</code> __pyx_t_5; __pyx_t_6+=1) {\n",
" __pyx_v_i = __pyx_t_6;\n",
"</pre><pre class='line' style='background-color: #FFFF7f' onclick='toggleDiv(\"line18\")'> 18: z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]</pre>\n",
"<pre id='line18' class='code' style='background-color: #FFFF7f'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":18\n",
" * cdef int n = x.shape[0]\n",
" * for i in range(n):\n",
" * z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]\n",
" * z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]\n",
" */\n",
" __pyx_t_7 = __pyx_v_i;\n",
" __pyx_t_8 = 1;\n",
" __pyx_t_9 = -1;\n",
" if (__pyx_t_7 <code><</code> 0) {\n",
" __pyx_t_7 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_7 <code><</code> 0)) __pyx_t_9 = 0;\n",
" } else if (unlikely(__pyx_t_7 >= __pyx_v_x.shape[0])) __pyx_t_9 = 0;\n",
" if (__pyx_t_8 <code><</code> 0) {\n",
" __pyx_t_8 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_8 <code><</code> 0)) __pyx_t_9 = 1;\n",
" } else if (unlikely(__pyx_t_8 >= __pyx_v_x.shape[1])) __pyx_t_9 = 1;\n",
" if (unlikely(__pyx_t_9 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_9);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_9 = __pyx_v_i;\n",
" __pyx_t_10 = 2;\n",
" __pyx_t_11 = -1;\n",
" if (__pyx_t_9 <code><</code> 0) {\n",
" __pyx_t_9 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_9 <code><</code> 0)) __pyx_t_11 = 0;\n",
" } else if (unlikely(__pyx_t_9 >= __pyx_v_y.shape[0])) __pyx_t_11 = 0;\n",
" if (__pyx_t_10 <code><</code> 0) {\n",
" __pyx_t_10 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_10 <code><</code> 0)) __pyx_t_11 = 1;\n",
" } else if (unlikely(__pyx_t_10 >= __pyx_v_y.shape[1])) __pyx_t_11 = 1;\n",
" if (unlikely(__pyx_t_11 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_11);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_11 = __pyx_v_i;\n",
" __pyx_t_12 = 2;\n",
" __pyx_t_13 = -1;\n",
" if (__pyx_t_11 <code><</code> 0) {\n",
" __pyx_t_11 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_11 <code><</code> 0)) __pyx_t_13 = 0;\n",
" } else if (unlikely(__pyx_t_11 >= __pyx_v_x.shape[0])) __pyx_t_13 = 0;\n",
" if (__pyx_t_12 <code><</code> 0) {\n",
" __pyx_t_12 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_12 <code><</code> 0)) __pyx_t_13 = 1;\n",
" } else if (unlikely(__pyx_t_12 >= __pyx_v_x.shape[1])) __pyx_t_13 = 1;\n",
" if (unlikely(__pyx_t_13 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_13);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_13 = __pyx_v_i;\n",
" __pyx_t_14 = 1;\n",
" __pyx_t_15 = -1;\n",
" if (__pyx_t_13 <code><</code> 0) {\n",
" __pyx_t_13 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_13 <code><</code> 0)) __pyx_t_15 = 0;\n",
" } else if (unlikely(__pyx_t_13 >= __pyx_v_y.shape[0])) __pyx_t_15 = 0;\n",
" if (__pyx_t_14 <code><</code> 0) {\n",
" __pyx_t_14 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_14 <code><</code> 0)) __pyx_t_15 = 1;\n",
" } else if (unlikely(__pyx_t_14 >= __pyx_v_y.shape[1])) __pyx_t_15 = 1;\n",
" if (unlikely(__pyx_t_15 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_15);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_15 = __pyx_v_i;\n",
" __pyx_t_16 = 0;\n",
" __pyx_t_17 = -1;\n",
" if (__pyx_t_15 <code><</code> 0) {\n",
" __pyx_t_15 += __pyx_pybuffernd_z.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_15 <code><</code> 0)) __pyx_t_17 = 0;\n",
" } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_z.diminfo[0].shape)) __pyx_t_17 = 0;\n",
" if (__pyx_t_16 <code><</code> 0) {\n",
" __pyx_t_16 += __pyx_pybuffernd_z.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_16 <code><</code> 0)) __pyx_t_17 = 1;\n",
" } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_z.diminfo[1].shape)) __pyx_t_17 = 1;\n",
" if (unlikely(__pyx_t_17 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_17);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 18; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_z.rcbuffer->pybuffer.buf, __pyx_t_15, __pyx_pybuffernd_z.diminfo[0].strides, __pyx_t_16, __pyx_pybuffernd_z.diminfo[1].strides) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_7 * __pyx_v_x.strides[0]) ) + __pyx_t_8 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_9 * __pyx_v_y.strides[0]) ) + __pyx_t_10 * __pyx_v_y.strides[1]) )))) - ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_11 * __pyx_v_x.strides[0]) ) + __pyx_t_12 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_13 * __pyx_v_y.strides[0]) ) + __pyx_t_14 * __pyx_v_y.strides[1]) )))));\n",
"</pre><pre class='line' style='background-color: #FFFF7f' onclick='toggleDiv(\"line19\")'> 19: z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]</pre>\n",
"<pre id='line19' class='code' style='background-color: #FFFF7f'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":19\n",
" * for i in range(n):\n",
" * z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" * z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]\n",
" * \n",
" */\n",
" __pyx_t_17 = __pyx_v_i;\n",
" __pyx_t_18 = 2;\n",
" __pyx_t_19 = -1;\n",
" if (__pyx_t_17 <code><</code> 0) {\n",
" __pyx_t_17 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_17 <code><</code> 0)) __pyx_t_19 = 0;\n",
" } else if (unlikely(__pyx_t_17 >= __pyx_v_x.shape[0])) __pyx_t_19 = 0;\n",
" if (__pyx_t_18 <code><</code> 0) {\n",
" __pyx_t_18 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_18 <code><</code> 0)) __pyx_t_19 = 1;\n",
" } else if (unlikely(__pyx_t_18 >= __pyx_v_x.shape[1])) __pyx_t_19 = 1;\n",
" if (unlikely(__pyx_t_19 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_19);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_19 = __pyx_v_i;\n",
" __pyx_t_20 = 0;\n",
" __pyx_t_21 = -1;\n",
" if (__pyx_t_19 <code><</code> 0) {\n",
" __pyx_t_19 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_19 <code><</code> 0)) __pyx_t_21 = 0;\n",
" } else if (unlikely(__pyx_t_19 >= __pyx_v_y.shape[0])) __pyx_t_21 = 0;\n",
" if (__pyx_t_20 <code><</code> 0) {\n",
" __pyx_t_20 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_20 <code><</code> 0)) __pyx_t_21 = 1;\n",
" } else if (unlikely(__pyx_t_20 >= __pyx_v_y.shape[1])) __pyx_t_21 = 1;\n",
" if (unlikely(__pyx_t_21 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_21);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_21 = __pyx_v_i;\n",
" __pyx_t_22 = 0;\n",
" __pyx_t_23 = -1;\n",
" if (__pyx_t_21 <code><</code> 0) {\n",
" __pyx_t_21 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_21 <code><</code> 0)) __pyx_t_23 = 0;\n",
" } else if (unlikely(__pyx_t_21 >= __pyx_v_x.shape[0])) __pyx_t_23 = 0;\n",
" if (__pyx_t_22 <code><</code> 0) {\n",
" __pyx_t_22 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_22 <code><</code> 0)) __pyx_t_23 = 1;\n",
" } else if (unlikely(__pyx_t_22 >= __pyx_v_x.shape[1])) __pyx_t_23 = 1;\n",
" if (unlikely(__pyx_t_23 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_23);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_23 = __pyx_v_i;\n",
" __pyx_t_24 = 2;\n",
" __pyx_t_25 = -1;\n",
" if (__pyx_t_23 <code><</code> 0) {\n",
" __pyx_t_23 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_23 <code><</code> 0)) __pyx_t_25 = 0;\n",
" } else if (unlikely(__pyx_t_23 >= __pyx_v_y.shape[0])) __pyx_t_25 = 0;\n",
" if (__pyx_t_24 <code><</code> 0) {\n",
" __pyx_t_24 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_24 <code><</code> 0)) __pyx_t_25 = 1;\n",
" } else if (unlikely(__pyx_t_24 >= __pyx_v_y.shape[1])) __pyx_t_25 = 1;\n",
" if (unlikely(__pyx_t_25 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_25);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_25 = __pyx_v_i;\n",
" __pyx_t_26 = 1;\n",
" __pyx_t_27 = -1;\n",
" if (__pyx_t_25 <code><</code> 0) {\n",
" __pyx_t_25 += __pyx_pybuffernd_z.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_25 <code><</code> 0)) __pyx_t_27 = 0;\n",
" } else if (unlikely(__pyx_t_25 >= __pyx_pybuffernd_z.diminfo[0].shape)) __pyx_t_27 = 0;\n",
" if (__pyx_t_26 <code><</code> 0) {\n",
" __pyx_t_26 += __pyx_pybuffernd_z.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_26 <code><</code> 0)) __pyx_t_27 = 1;\n",
" } else if (unlikely(__pyx_t_26 >= __pyx_pybuffernd_z.diminfo[1].shape)) __pyx_t_27 = 1;\n",
" if (unlikely(__pyx_t_27 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_27);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 19; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_z.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_z.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_z.diminfo[1].strides) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_17 * __pyx_v_x.strides[0]) ) + __pyx_t_18 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_19 * __pyx_v_y.strides[0]) ) + __pyx_t_20 * __pyx_v_y.strides[1]) )))) - ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_21 * __pyx_v_x.strides[0]) ) + __pyx_t_22 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_23 * __pyx_v_y.strides[0]) ) + __pyx_t_24 * __pyx_v_y.strides[1]) )))));\n",
"</pre><pre class='line' style='background-color: #FFFF7f' onclick='toggleDiv(\"line20\")'> 20: z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]</pre>\n",
"<pre id='line20' class='code' style='background-color: #FFFF7f'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":20\n",
" * z[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" * z[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]\n",
" * z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * return z\n",
" */\n",
" __pyx_t_27 = __pyx_v_i;\n",
" __pyx_t_28 = 0;\n",
" __pyx_t_29 = -1;\n",
" if (__pyx_t_27 <code><</code> 0) {\n",
" __pyx_t_27 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_27 <code><</code> 0)) __pyx_t_29 = 0;\n",
" } else if (unlikely(__pyx_t_27 >= __pyx_v_x.shape[0])) __pyx_t_29 = 0;\n",
" if (__pyx_t_28 <code><</code> 0) {\n",
" __pyx_t_28 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_28 <code><</code> 0)) __pyx_t_29 = 1;\n",
" } else if (unlikely(__pyx_t_28 >= __pyx_v_x.shape[1])) __pyx_t_29 = 1;\n",
" if (unlikely(__pyx_t_29 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_29);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_29 = __pyx_v_i;\n",
" __pyx_t_30 = 1;\n",
" __pyx_t_31 = -1;\n",
" if (__pyx_t_29 <code><</code> 0) {\n",
" __pyx_t_29 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_29 <code><</code> 0)) __pyx_t_31 = 0;\n",
" } else if (unlikely(__pyx_t_29 >= __pyx_v_y.shape[0])) __pyx_t_31 = 0;\n",
" if (__pyx_t_30 <code><</code> 0) {\n",
" __pyx_t_30 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_30 <code><</code> 0)) __pyx_t_31 = 1;\n",
" } else if (unlikely(__pyx_t_30 >= __pyx_v_y.shape[1])) __pyx_t_31 = 1;\n",
" if (unlikely(__pyx_t_31 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_31);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_31 = __pyx_v_i;\n",
" __pyx_t_32 = 1;\n",
" __pyx_t_33 = -1;\n",
" if (__pyx_t_31 <code><</code> 0) {\n",
" __pyx_t_31 += __pyx_v_x.shape[0];\n",
" if (unlikely(__pyx_t_31 <code><</code> 0)) __pyx_t_33 = 0;\n",
" } else if (unlikely(__pyx_t_31 >= __pyx_v_x.shape[0])) __pyx_t_33 = 0;\n",
" if (__pyx_t_32 <code><</code> 0) {\n",
" __pyx_t_32 += __pyx_v_x.shape[1];\n",
" if (unlikely(__pyx_t_32 <code><</code> 0)) __pyx_t_33 = 1;\n",
" } else if (unlikely(__pyx_t_32 >= __pyx_v_x.shape[1])) __pyx_t_33 = 1;\n",
" if (unlikely(__pyx_t_33 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_33);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_33 = __pyx_v_i;\n",
" __pyx_t_34 = 0;\n",
" __pyx_t_35 = -1;\n",
" if (__pyx_t_33 <code><</code> 0) {\n",
" __pyx_t_33 += __pyx_v_y.shape[0];\n",
" if (unlikely(__pyx_t_33 <code><</code> 0)) __pyx_t_35 = 0;\n",
" } else if (unlikely(__pyx_t_33 >= __pyx_v_y.shape[0])) __pyx_t_35 = 0;\n",
" if (__pyx_t_34 <code><</code> 0) {\n",
" __pyx_t_34 += __pyx_v_y.shape[1];\n",
" if (unlikely(__pyx_t_34 <code><</code> 0)) __pyx_t_35 = 1;\n",
" } else if (unlikely(__pyx_t_34 >= __pyx_v_y.shape[1])) __pyx_t_35 = 1;\n",
" if (unlikely(__pyx_t_35 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_35);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_35 = __pyx_v_i;\n",
" __pyx_t_36 = 2;\n",
" __pyx_t_37 = -1;\n",
" if (__pyx_t_35 <code><</code> 0) {\n",
" __pyx_t_35 += __pyx_pybuffernd_z.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_35 <code><</code> 0)) __pyx_t_37 = 0;\n",
" } else if (unlikely(__pyx_t_35 >= __pyx_pybuffernd_z.diminfo[0].shape)) __pyx_t_37 = 0;\n",
" if (__pyx_t_36 <code><</code> 0) {\n",
" __pyx_t_36 += __pyx_pybuffernd_z.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_36 <code><</code> 0)) __pyx_t_37 = 1;\n",
" } else if (unlikely(__pyx_t_36 >= __pyx_pybuffernd_z.diminfo[1].shape)) __pyx_t_37 = 1;\n",
" if (unlikely(__pyx_t_37 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_37);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_z.rcbuffer->pybuffer.buf, __pyx_t_35, __pyx_pybuffernd_z.diminfo[0].strides, __pyx_t_36, __pyx_pybuffernd_z.diminfo[1].strides) = (((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_27 * __pyx_v_x.strides[0]) ) + __pyx_t_28 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_29 * __pyx_v_y.strides[0]) ) + __pyx_t_30 * __pyx_v_y.strides[1]) )))) - ((*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_x.data + __pyx_t_31 * __pyx_v_x.strides[0]) ) + __pyx_t_32 * __pyx_v_x.strides[1]) ))) * (*((double *) ( /* dim=1 */ (( /* dim=0 */ (__pyx_v_y.data + __pyx_t_33 * __pyx_v_y.strides[0]) ) + __pyx_t_34 * __pyx_v_y.strides[1]) )))));\n",
" }\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line21\")'> 21: </pre>\n",
"<pre id='line21' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF5b' onclick='toggleDiv(\"line22\")'> 22: return z</pre>\n",
"<pre id='line22' class='code' style='background-color: #FFFF5b'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":22\n",
" * z[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]\n",
" * \n",
" * return z # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * \n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(((PyObject *)__pyx_r));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_z));\n",
" __pyx_r = ((PyArrayObject *)__pyx_v_z);\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_z.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_637c713b986c525e98b048fef3dc5c09.cross\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_z.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_z);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>((PyObject *)__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line23\")'> 23: </pre>\n",
"<pre id='line23' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line24\")'> 24: </pre>\n",
"<pre id='line24' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF44' onclick='toggleDiv(\"line25\")'> 25: cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):</pre>\n",
"<pre id='line25' class='code' style='background-color: #FFFF44'>\n",
"/* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":25\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pw_46_cython_magic_637c713b986c525e98b048fef3dc5c09_1cy_compute_normal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cy_compute_normal(PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face, CYTHON_UNUSED int __pyx_skip_dispatch) {\n",
" int __pyx_v_nface;\n",
" int __pyx_v_nvert;\n",
" PyArrayObject *__pyx_v_normalf = 0;\n",
" PyArrayObject *__pyx_v_normal = 0;\n",
" int __pyx_v_f0;\n",
" int __pyx_v_f1;\n",
" int __pyx_v_f2;\n",
" int __pyx_v_i;\n",
" long __pyx_v_j;\n",
" PyArrayObject *__pyx_v_v = 0;\n",
" PyArrayObject *__pyx_v_s = 0;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normal;\n",
" __Pyx_Buffer __pyx_pybuffer_normal;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_normalf;\n",
" __Pyx_Buffer __pyx_pybuffer_normalf;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_s;\n",
" __Pyx_Buffer __pyx_pybuffer_s;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_v;\n",
" __Pyx_Buffer __pyx_pybuffer_v;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal\", 0);\n",
" __pyx_pybuffer_normalf.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normalf.refcount = 0;\n",
" __pyx_pybuffernd_normalf.data = NULL;\n",
" __pyx_pybuffernd_normalf.rcbuffer = &__pyx_pybuffer_normalf;\n",
" __pyx_pybuffer_normal.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_normal.refcount = 0;\n",
" __pyx_pybuffernd_normal.data = NULL;\n",
" __pyx_pybuffernd_normal.rcbuffer = &__pyx_pybuffer_normal;\n",
" __pyx_pybuffer_v.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_v.refcount = 0;\n",
" __pyx_pybuffernd_v.data = NULL;\n",
" __pyx_pybuffernd_v.rcbuffer = &__pyx_pybuffer_v;\n",
" __pyx_pybuffer_s.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_s.refcount = 0;\n",
" __pyx_pybuffernd_s.data = NULL;\n",
" __pyx_pybuffernd_s.rcbuffer = &__pyx_pybuffer_s;\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
"\n",
"/* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":25\n",
" * \n",
" * \n",
" * cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0]\n",
" */\n",
"\n",
"static PyObject *__pyx_pf_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cy_compute_normal(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_vertex, PyArrayObject *__pyx_v_face) {\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_face;\n",
" __Pyx_Buffer __pyx_pybuffer_face;\n",
" __Pyx_LocalBuf_ND __pyx_pybuffernd_vertex;\n",
" __Pyx_Buffer __pyx_pybuffer_vertex;\n",
" PyObject *__pyx_r = NULL;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal\", 0);\n",
" __pyx_pybuffer_vertex.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_vertex.refcount = 0;\n",
" __pyx_pybuffernd_vertex.data = NULL;\n",
" __pyx_pybuffernd_vertex.rcbuffer = &__pyx_pybuffer_vertex;\n",
" __pyx_pybuffer_face.pybuffer.buf = NULL;\n",
" __pyx_pybuffer_face.refcount = 0;\n",
" __pyx_pybuffernd_face.data = NULL;\n",
" __pyx_pybuffernd_face.rcbuffer = &__pyx_pybuffer_face;\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer, (PyObject*)__pyx_v_vertex, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_vertex.diminfo[0].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_vertex.diminfo[0].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_vertex.diminfo[1].strides = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_vertex.diminfo[1].shape = __pyx_pybuffernd_vertex.rcbuffer->pybuffer.shape[1];\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer, (PyObject*)__pyx_v_face, &__Pyx_TypeInfo_int, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_pybuffernd_face.diminfo[0].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_face.diminfo[0].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_face.diminfo[1].strides = __pyx_pybuffernd_face.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_face.diminfo[1].shape = __pyx_pybuffernd_face.rcbuffer->pybuffer.shape[1];\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_1 = __pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cy_compute_normal(__pyx_v_vertex, __pyx_v_face, 0);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_r = __pyx_t_1;\n",
" __pyx_t_1 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_1);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_637c713b986c525e98b048fef3dc5c09.cy_compute_normal\", __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_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/\n",
"static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) {\n",
" int __pyx_r;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"__getbuffer__ (wrapper)\", 0);\n",
" __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags));\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line26\")'> 26: cdef int nface = face.shape[0]</pre>\n",
"<pre id='line26' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":26\n",
" * \n",
" * cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int nvert = vertex.shape[0]\n",
" * \n",
" */\n",
" __pyx_v_nface = (__pyx_v_face->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line27\")'> 27: cdef int nvert = vertex.shape[0]</pre>\n",
"<pre id='line27' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":27\n",
" * cpdef cy_compute_normal(np.ndarray[np.float64_t, ndim=2] vertex, np.ndarray[int, ndim=2] face):\n",
" * cdef int nface = face.shape[0]\n",
" * cdef int nvert = vertex.shape[0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normals to the faces\n",
" */\n",
" __pyx_v_nvert = (__pyx_v_vertex->dimensions[0]);\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line28\")'> 28: </pre>\n",
"<pre id='line28' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line29\")'> 29: # unit normals to the faces</pre>\n",
"<pre id='line29' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1c' onclick='toggleDiv(\"line30\")'> 30: cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],</pre>\n",
"<pre id='line30' class='code' style='background-color: #FFFF1c'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":30\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = normalise(normalf)\n",
" */\n",
" __pyx_k_slice_3 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_3);\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":30\n",
" * \n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :], # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = normalise(normalf)\n",
" */\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_4));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_k_tuple_4 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_3, __pyx_int_1);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_4);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_4));\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_5);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_2));<span class='error_goto'> if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_k_slice_5 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_5);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_5);\n",
" __pyx_k_slice_6 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_6);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_6);\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_7));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_k_tuple_7 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_6, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_7);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_7));\n",
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_8);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 1, __pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_3));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_1, __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\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",
" __pyx_t_4 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double</span>(__pyx_t_3);\n",
" if (unlikely(!__pyx_t_4.memview))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" __pyx_k_slice_8 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_8);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_8);\n",
"</pre><pre class='line' style='background-color: #FFFF1c' onclick='toggleDiv(\"line31\")'> 31: vertex[face[:, 2], :] - vertex[face[:, 0], :])</pre>\n",
"<pre id='line31' class='code' style='background-color: #FFFF1c'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":31\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = normalise(normalf)\n",
" * \n",
" */\n",
" __pyx_k_slice_9 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_9);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_9);\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":31\n",
" * # unit normals to the faces\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = normalise(normalf)\n",
" * \n",
" */\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_10));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_k_tuple_10 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_9, __pyx_int_2);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_10);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_10));\n",
" __pyx_t_2 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_11);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_2, 1, __pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_2));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" __pyx_k_slice_11 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_11);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_11);\n",
" __pyx_k_slice_12 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_12);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_12);\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_face), ((PyObject *)__pyx_k_tuple_13));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_k_tuple_13 = <span class='py_c_api'>PyTuple_Pack</span>(2, __pyx_k_slice_12, __pyx_int_0);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_13);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_13));\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_k_slice_14);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 1, __pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_GetItem</span>(((PyObject *)__pyx_v_vertex), ((PyObject *)__pyx_t_1));<span class='error_goto'> if (!__pyx_t_2) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyNumber_Subtract</span>(__pyx_t_3, __pyx_t_2);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\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_2); __pyx_t_2 = 0;\n",
" __pyx_t_5 = <span class='pyx_c_api'>__Pyx_PyObject_to_MemoryviewSlice_dsds_double</span>(__pyx_t_1);\n",
" if (unlikely(!__pyx_t_5.memview))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_1); __pyx_t_1 = 0;\n",
" __pyx_t_1 = ((PyObject *)__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cross(__pyx_t_4, __pyx_t_5));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __PYX_XDEC_MEMVIEW(&__pyx_t_4, 1);\n",
" __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normalf = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 30; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
" __pyx_k_slice_14 = <span class='py_c_api'>PySlice_New</span>(Py_None, Py_None, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_slice_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 31; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_slice_14);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_k_slice_14);\n",
"</pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line32\")'> 32: normalf = normalise(normalf)</pre>\n",
"<pre id='line32' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":32\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normalf = cross(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" * vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" * normalf = normalise(normalf) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # unit normal to the vertex\n",
" */\n",
" __pyx_t_1 = ((PyObject *)__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_normalise(((PyArrayObject *)__pyx_v_normalf)));<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_1), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_6 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_7, __pyx_t_8, __pyx_t_9);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_6 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_1);\n",
" __pyx_t_1 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line33\")'> 33: </pre>\n",
"<pre id='line33' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line34\")'> 34: # unit normal to the vertex</pre>\n",
"<pre id='line34' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF34' onclick='toggleDiv(\"line35\")'> 35: cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])</pre>\n",
"<pre id='line35' class='code' style='background-color: #FFFF34'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":35\n",
" * \n",
" * # unit normal to the vertex\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3]) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface):\n",
" */\n",
" __pyx_t_1 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_1, __pyx_n_s__zeros);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></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='py_c_api'>PyInt_FromLong</span>(__pyx_v_nvert);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" __pyx_t_3 = <span class='py_c_api'>PyList_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_3, 0, __pyx_t_1);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_3);\n",
" <span class='py_macro_api'>PyList_SET_ITEM</span>(__pyx_t_3, 1, __pyx_int_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_3);\n",
" __pyx_t_1 = 0;\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, ((PyObject *)__pyx_t_3));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_t_3));\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" if (!(likely(((__pyx_t_3) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_3, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_10 = ((PyArrayObject *)__pyx_t_3);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_normal = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_10 = 0;\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_3);\n",
" __pyx_t_3 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line36\")'> 36: cdef int f0, f1, f2</pre>\n",
"<pre id='line36' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line37\")'> 37: for i in range(nface):</pre>\n",
"<pre id='line37' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":37\n",
" * cdef np.ndarray[np.float64_t, ndim=2] normal = np.zeros([nvert, 3])\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1]\n",
" */\n",
" __pyx_t_6 = __pyx_v_nface;\n",
" for (__pyx_t_11 = 0; __pyx_t_11 <code><</code> __pyx_t_6; __pyx_t_11+=1) {\n",
" __pyx_v_i = __pyx_t_11;\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line38\")'> 38: f0 = face[i, 0]</pre>\n",
"<pre id='line38' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":38\n",
" * cdef int f0, f1, f2\n",
" * for i in range(nface):\n",
" * f0 = face[i, 0] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2]\n",
" */\n",
" __pyx_t_12 = __pyx_v_i;\n",
" __pyx_t_13 = 0;\n",
" __pyx_t_14 = -1;\n",
" if (__pyx_t_12 <code><</code> 0) {\n",
" __pyx_t_12 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_12 <code><</code> 0)) __pyx_t_14 = 0;\n",
" } else if (unlikely(__pyx_t_12 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_14 = 0;\n",
" if (__pyx_t_13 <code><</code> 0) {\n",
" __pyx_t_13 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_13 <code><</code> 0)) __pyx_t_14 = 1;\n",
" } else if (unlikely(__pyx_t_13 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_14 = 1;\n",
" if (unlikely(__pyx_t_14 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_14);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f0 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_12, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_13, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line39\")'> 39: f1 = face[i, 1]</pre>\n",
"<pre id='line39' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":39\n",
" * for i in range(nface):\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * f2 = face[i, 2]\n",
" * for j in range(3):\n",
" */\n",
" __pyx_t_14 = __pyx_v_i;\n",
" __pyx_t_15 = 1;\n",
" __pyx_t_16 = -1;\n",
" if (__pyx_t_14 <code><</code> 0) {\n",
" __pyx_t_14 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_14 <code><</code> 0)) __pyx_t_16 = 0;\n",
" } else if (unlikely(__pyx_t_14 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_16 = 0;\n",
" if (__pyx_t_15 <code><</code> 0) {\n",
" __pyx_t_15 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_15 <code><</code> 0)) __pyx_t_16 = 1;\n",
" } else if (unlikely(__pyx_t_15 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_16 = 1;\n",
" if (unlikely(__pyx_t_16 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_16);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 39; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f1 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_14, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_15, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFd4' onclick='toggleDiv(\"line40\")'> 40: f2 = face[i, 2]</pre>\n",
"<pre id='line40' class='code' style='background-color: #FFFFd4'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":40\n",
" * f0 = face[i, 0]\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j]\n",
" */\n",
" __pyx_t_16 = __pyx_v_i;\n",
" __pyx_t_17 = 2;\n",
" __pyx_t_18 = -1;\n",
" if (__pyx_t_16 <code><</code> 0) {\n",
" __pyx_t_16 += __pyx_pybuffernd_face.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_16 <code><</code> 0)) __pyx_t_18 = 0;\n",
" } else if (unlikely(__pyx_t_16 >= __pyx_pybuffernd_face.diminfo[0].shape)) __pyx_t_18 = 0;\n",
" if (__pyx_t_17 <code><</code> 0) {\n",
" __pyx_t_17 += __pyx_pybuffernd_face.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_17 <code><</code> 0)) __pyx_t_18 = 1;\n",
" } else if (unlikely(__pyx_t_17 >= __pyx_pybuffernd_face.diminfo[1].shape)) __pyx_t_18 = 1;\n",
" if (unlikely(__pyx_t_18 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_18);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 40; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_v_f2 = (*__Pyx_BufPtrStrided2d(int *, __pyx_pybuffernd_face.rcbuffer->pybuffer.buf, __pyx_t_16, __pyx_pybuffernd_face.diminfo[0].strides, __pyx_t_17, __pyx_pybuffernd_face.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line41\")'> 41: for j in range(3):</pre>\n",
"<pre id='line41' class='code' style='background-color: #FFFFff'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":41\n",
" * f1 = face[i, 1]\n",
" * f2 = face[i, 2]\n",
" * for j in range(3): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j]\n",
" */\n",
" for (__pyx_t_19 = 0; __pyx_t_19 <code><</code> 3; __pyx_t_19+=1) {\n",
" __pyx_v_j = __pyx_t_19;\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line42\")'> 42: normal[f0, j] += normalf[i, j]</pre>\n",
"<pre id='line42' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":42\n",
" * f2 = face[i, 2]\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f1, j] += normalf[i, j]\n",
" * normal[f2, j] += normalf[i, j]\n",
" */\n",
" __pyx_t_18 = __pyx_v_i;\n",
" __pyx_t_20 = __pyx_v_j;\n",
" __pyx_t_21 = -1;\n",
" if (__pyx_t_18 <code><</code> 0) {\n",
" __pyx_t_18 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_18 <code><</code> 0)) __pyx_t_21 = 0;\n",
" } else if (unlikely(__pyx_t_18 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_21 = 0;\n",
" if (__pyx_t_20 <code><</code> 0) {\n",
" __pyx_t_20 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_20 <code><</code> 0)) __pyx_t_21 = 1;\n",
" } else if (unlikely(__pyx_t_20 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_21 = 1;\n",
" if (unlikely(__pyx_t_21 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_21);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_21 = __pyx_v_f0;\n",
" __pyx_t_22 = __pyx_v_j;\n",
" __pyx_t_23 = -1;\n",
" if (__pyx_t_21 <code><</code> 0) {\n",
" __pyx_t_21 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_21 <code><</code> 0)) __pyx_t_23 = 0;\n",
" } else if (unlikely(__pyx_t_21 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_23 = 0;\n",
" if (__pyx_t_22 <code><</code> 0) {\n",
" __pyx_t_22 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_22 <code><</code> 0)) __pyx_t_23 = 1;\n",
" } else if (unlikely(__pyx_t_22 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_23 = 1;\n",
" if (unlikely(__pyx_t_23 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_23);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_21, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_22, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_18, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_20, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line43\")'> 43: normal[f1, j] += normalf[i, j]</pre>\n",
"<pre id='line43' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":43\n",
" * for j in range(3):\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normal[f2, j] += normalf[i, j]\n",
" * \n",
" */\n",
" __pyx_t_23 = __pyx_v_i;\n",
" __pyx_t_24 = __pyx_v_j;\n",
" __pyx_t_25 = -1;\n",
" if (__pyx_t_23 <code><</code> 0) {\n",
" __pyx_t_23 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_23 <code><</code> 0)) __pyx_t_25 = 0;\n",
" } else if (unlikely(__pyx_t_23 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_25 = 0;\n",
" if (__pyx_t_24 <code><</code> 0) {\n",
" __pyx_t_24 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_24 <code><</code> 0)) __pyx_t_25 = 1;\n",
" } else if (unlikely(__pyx_t_24 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_25 = 1;\n",
" if (unlikely(__pyx_t_25 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_25);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_25 = __pyx_v_f1;\n",
" __pyx_t_26 = __pyx_v_j;\n",
" __pyx_t_27 = -1;\n",
" if (__pyx_t_25 <code><</code> 0) {\n",
" __pyx_t_25 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_25 <code><</code> 0)) __pyx_t_27 = 0;\n",
" } else if (unlikely(__pyx_t_25 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_27 = 0;\n",
" if (__pyx_t_26 <code><</code> 0) {\n",
" __pyx_t_26 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_26 <code><</code> 0)) __pyx_t_27 = 1;\n",
" } else if (unlikely(__pyx_t_26 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_27 = 1;\n",
" if (unlikely(__pyx_t_27 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_27);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 43; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_25, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_26, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_23, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_24, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
"</pre><pre class='line' style='background-color: #FFFFb6' onclick='toggleDiv(\"line44\")'> 44: normal[f2, j] += normalf[i, j]</pre>\n",
"<pre id='line44' class='code' style='background-color: #FFFFb6'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":44\n",
" * normal[f0, j] += normalf[i, j]\n",
" * normal[f1, j] += normalf[i, j]\n",
" * normal[f2, j] += normalf[i, j] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # normalize\n",
" */\n",
" __pyx_t_27 = __pyx_v_i;\n",
" __pyx_t_28 = __pyx_v_j;\n",
" __pyx_t_29 = -1;\n",
" if (__pyx_t_27 <code><</code> 0) {\n",
" __pyx_t_27 += __pyx_pybuffernd_normalf.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_27 <code><</code> 0)) __pyx_t_29 = 0;\n",
" } else if (unlikely(__pyx_t_27 >= __pyx_pybuffernd_normalf.diminfo[0].shape)) __pyx_t_29 = 0;\n",
" if (__pyx_t_28 <code><</code> 0) {\n",
" __pyx_t_28 += __pyx_pybuffernd_normalf.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_28 <code><</code> 0)) __pyx_t_29 = 1;\n",
" } else if (unlikely(__pyx_t_28 >= __pyx_pybuffernd_normalf.diminfo[1].shape)) __pyx_t_29 = 1;\n",
" if (unlikely(__pyx_t_29 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_29);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_29 = __pyx_v_f2;\n",
" __pyx_t_30 = __pyx_v_j;\n",
" __pyx_t_31 = -1;\n",
" if (__pyx_t_29 <code><</code> 0) {\n",
" __pyx_t_29 += __pyx_pybuffernd_normal.diminfo[0].shape;\n",
" if (unlikely(__pyx_t_29 <code><</code> 0)) __pyx_t_31 = 0;\n",
" } else if (unlikely(__pyx_t_29 >= __pyx_pybuffernd_normal.diminfo[0].shape)) __pyx_t_31 = 0;\n",
" if (__pyx_t_30 <code><</code> 0) {\n",
" __pyx_t_30 += __pyx_pybuffernd_normal.diminfo[1].shape;\n",
" if (unlikely(__pyx_t_30 <code><</code> 0)) __pyx_t_31 = 1;\n",
" } else if (unlikely(__pyx_t_30 >= __pyx_pybuffernd_normal.diminfo[1].shape)) __pyx_t_31 = 1;\n",
" if (unlikely(__pyx_t_31 != -1)) {\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferIndexError</span>(__pyx_t_31);\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normal.rcbuffer->pybuffer.buf, __pyx_t_29, __pyx_pybuffernd_normal.diminfo[0].strides, __pyx_t_30, __pyx_pybuffernd_normal.diminfo[1].strides) += (*__Pyx_BufPtrStrided2d(__pyx_t_5numpy_float64_t *, __pyx_pybuffernd_normalf.rcbuffer->pybuffer.buf, __pyx_t_27, __pyx_pybuffernd_normalf.diminfo[0].strides, __pyx_t_28, __pyx_pybuffernd_normalf.diminfo[1].strides));\n",
" }\n",
" }\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line45\")'> 45: </pre>\n",
"<pre id='line45' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line46\")'> 46: # normalize</pre>\n",
"<pre id='line46' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF57' onclick='toggleDiv(\"line47\")'> 47: normal = normalise(normal)</pre>\n",
"<pre id='line47' class='code' style='background-color: #FFFF57'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":47\n",
" * \n",
" * # normalize\n",
" * normal = normalise(normal) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * # enforce that the normal are outward\n",
" */\n",
" __pyx_t_3 = ((PyObject *)__pyx_f_46_cython_magic_637c713b986c525e98b048fef3dc5c09_normalise(((PyArrayObject *)__pyx_v_normal)));<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)((PyArrayObject *)__pyx_t_3), &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_6 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_9, __pyx_t_8, __pyx_t_7);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_6 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_3);\n",
" __pyx_t_3 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line48\")'> 48: </pre>\n",
"<pre id='line48' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line49\")'> 49: # enforce that the normal are outward</pre>\n",
"<pre id='line49' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF2f' onclick='toggleDiv(\"line50\")'> 50: cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]</pre>\n",
"<pre id='line50' class='code' style='background-color: #FFFF2f'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":50\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_t_3 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_3, __pyx_n_s__mean);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_vertex));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_3, 0, ((PyObject *)__pyx_v_vertex));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_vertex));\n",
" __pyx_t_2 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\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>(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_GetItem</span>(__pyx_t_2, ((PyObject *)__pyx_k_tuple_15));<span class='error_goto'> if (!__pyx_t_3) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyNumber_Subtract</span>(((PyObject *)__pyx_v_vertex), __pyx_t_3);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" if (!(likely(((__pyx_t_2) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_2, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_32 = ((PyArrayObject *)__pyx_t_2);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer, (PyObject*)__pyx_t_32, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_v = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_v.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_v.diminfo[0].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_v.diminfo[0].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_v.diminfo[1].strides = __pyx_pybuffernd_v.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_v.diminfo[1].shape = __pyx_pybuffernd_v.rcbuffer->pybuffer.shape[1];\n",
" }\n",
" }\n",
" __pyx_t_32 = 0;\n",
" __pyx_v_v = ((PyArrayObject *)__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
"\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":50\n",
" * \n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None] # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" */\n",
" __pyx_k_tuple_15 = <span class='py_c_api'>PyTuple_Pack</span>(2, Py_Ellipsis, Py_None);<span class='error_goto'> if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_k_tuple_15);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_k_tuple_15));\n",
"</pre><pre class='line' style='background-color: #FFFF31' onclick='toggleDiv(\"line51\")'> 51: cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)</pre>\n",
"<pre id='line51' class='code' style='background-color: #FFFF31'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":51\n",
" * # enforce that the normal are outward\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1) # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" */\n",
" __pyx_t_2 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_3 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_2, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyNumber_Multiply</span>(((PyObject *)__pyx_v_v), ((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" __pyx_t_1 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_1, 0, __pyx_t_2);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_2);\n",
" __pyx_t_2 = 0;\n",
" __pyx_t_2 = <span class='py_c_api'>PyDict_New</span>();<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(((PyObject *)__pyx_t_2));\n",
" if (<span class='py_c_api'>PyDict_SetItem</span>(__pyx_t_2, ((PyObject *)__pyx_n_s__axis), __pyx_int_1) <code><</code> 0)<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_33 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_3, ((PyObject *)__pyx_t_1), ((PyObject *)__pyx_t_2));<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\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>(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;\n",
" if (!(likely(((__pyx_t_33) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_33, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_34 = ((PyArrayObject *)__pyx_t_33);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer, (PyObject*)__pyx_t_34, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 1, 0, __pyx_stack) == -1)) {\n",
" __pyx_v_s = ((PyArrayObject *)Py_None); <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None); __pyx_pybuffernd_s.rcbuffer->pybuffer.buf = NULL;\n",
" <span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" } else {__pyx_pybuffernd_s.diminfo[0].strides = __pyx_pybuffernd_s.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_s.diminfo[0].shape = __pyx_pybuffernd_s.rcbuffer->pybuffer.shape[0];\n",
" }\n",
" }\n",
" __pyx_t_34 = 0;\n",
" __pyx_v_s = ((PyArrayObject *)__pyx_t_33);\n",
" __pyx_t_33 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF16' onclick='toggleDiv(\"line52\")'> 52: if np.sum(np.greater(s, 0)) &lt; np.sum(np.less(s, 0)):</pre>\n",
"<pre id='line52' class='code' style='background-color: #FFFF16'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":52\n",
" * cdef np.ndarray[np.float64_t, ndim=2] v = vertex - np.mean(vertex)[..., None]\n",
" * cdef np.ndarray[np.float64_t, ndim=1] s = np.sum(v * normal, axis=1)\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)): # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * # flip\n",
" * normal = -normal\n",
" */\n",
" __pyx_t_33 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_33, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_33); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_33, __pyx_n_s__greater);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_33); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_33), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\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>(((PyObject *)__pyx_t_33)); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 0, __pyx_t_3);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_3);\n",
" __pyx_t_3 = 0;\n",
" __pyx_t_3 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_33), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_3);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_33)); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" __pyx_t_2 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_33, __pyx_n_s__sum);<span class='error_goto'> if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_2);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_33); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='pyx_c_api'>__Pyx_GetModuleGlobalName</span>(__pyx_n_s__np);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" __pyx_t_1 = __Pyx_<span class='py_c_api'>PyObject_GetAttrStr</span>(__pyx_t_33, __pyx_n_s__less);<span class='error_goto'> if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_1);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_33); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_s));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 0, ((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_s));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(__pyx_int_0);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 1, __pyx_int_0);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_int_0);\n",
" __pyx_t_35 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_1, ((PyObject *)__pyx_t_33), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_35);\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>(((PyObject *)__pyx_t_33)); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='py_c_api'>PyTuple_New</span>(1);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 0, __pyx_t_35);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(__pyx_t_35);\n",
" __pyx_t_35 = 0;\n",
" __pyx_t_35 = <span class='py_c_api'>PyObject_Call</span>(__pyx_t_2, ((PyObject *)__pyx_t_33), NULL);<span class='error_goto'> if (unlikely(!__pyx_t_35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_35);\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_2); __pyx_t_2 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_t_33)); __pyx_t_33 = 0;\n",
" __pyx_t_33 = <span class='py_c_api'>PyObject_RichCompare</span>(__pyx_t_3, __pyx_t_35, Py_LT); <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGOTREF</span></span>(__pyx_t_33);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_3); __pyx_t_3 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_35); __pyx_t_35 = 0;\n",
" __pyx_t_36 = __Pyx_<span class='py_c_api'>PyObject_IsTrue</span>(__pyx_t_33);<span class='error_goto'> if (unlikely(__pyx_t_36 <code><</code> 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(__pyx_t_33); __pyx_t_33 = 0;\n",
" if (__pyx_t_36) {\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line53\")'> 53: # flip</pre>\n",
"<pre id='line53' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line54\")'> 54: normal = -normal</pre>\n",
"<pre id='line54' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":54\n",
" * if np.sum(np.greater(s, 0)) <code><</code> np.sum(np.less(s, 0)):\n",
" * # flip\n",
" * normal = -normal # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * normalf = -normalf\n",
" * \n",
" */\n",
" __pyx_t_33 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normal));<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" if (!(likely(((__pyx_t_33) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_33, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_10 = ((PyArrayObject *)__pyx_t_33);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_t_10, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_6 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_7, &__pyx_t_8, &__pyx_t_9);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer, (PyObject*)__pyx_v_normal, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES| PyBUF_WRITABLE, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_7); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_9);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_7, __pyx_t_8, __pyx_t_9);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normal.diminfo[0].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normal.diminfo[0].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normal.diminfo[1].strides = __pyx_pybuffernd_normal.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normal.diminfo[1].shape = __pyx_pybuffernd_normal.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_6 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 54; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_10 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normal));\n",
" __pyx_v_normal = ((PyArrayObject *)__pyx_t_33);\n",
" __pyx_t_33 = 0;\n",
"</pre><pre class='line' style='background-color: #FFFF46' onclick='toggleDiv(\"line55\")'> 55: normalf = -normalf</pre>\n",
"<pre id='line55' class='code' style='background-color: #FFFF46'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":55\n",
" * # flip\n",
" * normal = -normal\n",
" * normalf = -normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" * \n",
" * return normal, normalf\n",
" */\n",
" __pyx_t_33 = <span class='py_c_api'>PyNumber_Negative</span>(((PyObject *)__pyx_v_normalf));<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" if (!(likely(((__pyx_t_33) == Py_None) || likely(<span class='pyx_c_api'>__Pyx_TypeTest</span>(__pyx_t_33, __pyx_ptype_5numpy_ndarray)))))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_t_37 = ((PyArrayObject *)__pyx_t_33);\n",
" {\n",
" __Pyx_BufFmt_StackElem __pyx_stack[1];\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" __pyx_t_6 = <span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_t_37, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack);\n",
" if (unlikely(__pyx_t_6 <code><</code> 0)) {\n",
" <span class='py_c_api'>PyErr_Fetch</span>(&__pyx_t_9, &__pyx_t_8, &__pyx_t_7);\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_GetBufferAndValidate</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer, (PyObject*)__pyx_v_normalf, &__Pyx_TypeInfo_nn___pyx_t_5numpy_float64_t, PyBUF_FORMAT| PyBUF_STRIDES, 2, 0, __pyx_stack) == -1)) {\n",
" Py_XDECREF(__pyx_t_9); Py_XDECREF(__pyx_t_8); Py_XDECREF(__pyx_t_7);\n",
" <span class='pyx_c_api'>__Pyx_RaiseBufferFallbackError</span>();\n",
" } else {\n",
" <span class='py_c_api'>PyErr_Restore</span>(__pyx_t_9, __pyx_t_8, __pyx_t_7);\n",
" }\n",
" }\n",
" __pyx_pybuffernd_normalf.diminfo[0].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_normalf.diminfo[0].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[0]; __pyx_pybuffernd_normalf.diminfo[1].strides = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.strides[1]; __pyx_pybuffernd_normalf.diminfo[1].shape = __pyx_pybuffernd_normalf.rcbuffer->pybuffer.shape[1];\n",
" if (unlikely(__pyx_t_6 <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 55; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" }\n",
" __pyx_t_37 = 0;\n",
" <span class='pyx_macro_api'>__Pyx_DECREF</span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_v_normalf = ((PyArrayObject *)__pyx_t_33);\n",
" __pyx_t_33 = 0;\n",
" goto __pyx_L7;\n",
" }\n",
" __pyx_L7:;\n",
"</pre><pre class='line' style='background-color: #FFFFff' onclick='toggleDiv(\"line56\")'> 56: </pre>\n",
"<pre id='line56' class='code' style='background-color: #FFFFff'></pre><pre class='line' style='background-color: #FFFF1a' onclick='toggleDiv(\"line57\")'> 57: return normal, normalf</pre>\n",
"<pre id='line57' class='code' style='background-color: #FFFF1a'>\n",
" /* \"_cython_magic_637c713b986c525e98b048fef3dc5c09.pyx\":57\n",
" * normalf = -normalf\n",
" * \n",
" * return normal, normalf # <code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code><code><</code>\n",
" */\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_r);\n",
" __pyx_t_33 = <span class='py_c_api'>PyTuple_New</span>(2);<span class='error_goto'> if (unlikely(!__pyx_t_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GOTREF</span></span>(__pyx_t_33);\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normal));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 0, ((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normal));\n",
" <span class='pyx_macro_api'>__Pyx_INCREF</span>(((PyObject *)__pyx_v_normalf));\n",
" <span class='py_macro_api'>PyTuple_SET_ITEM</span>(__pyx_t_33, 1, ((PyObject *)__pyx_v_normalf));\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_GIVEREF</span></span>(((PyObject *)__pyx_v_normalf));\n",
" __pyx_r = ((PyObject *)__pyx_t_33);\n",
" __pyx_t_33 = 0;\n",
" goto __pyx_L0;\n",
"\n",
" __pyx_r = Py_None; <span class='pyx_macro_api'>__Pyx_INCREF</span>(Py_None);\n",
" goto __pyx_L0;\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_macro_api'>__Pyx_XDECREF</span>(__pyx_t_3);\n",
" __PYX_XDEC_MEMVIEW(&__pyx_t_4, 1);\n",
" __PYX_XDEC_MEMVIEW(&__pyx_t_5, 1);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_33);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>(__pyx_t_35);\n",
" { PyObject *__pyx_type, *__pyx_value, *__pyx_tb;\n",
" <span class='pyx_c_api'>__Pyx_ErrFetch</span>(&__pyx_type, &__pyx_value, &__pyx_tb);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.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_637c713b986c525e98b048fef3dc5c09.cy_compute_normal\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" __pyx_r = 0;\n",
" goto __pyx_L2;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_face.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normal.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_normalf.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_s.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_v.rcbuffer->pybuffer);\n",
" <span class='pyx_c_api'>__Pyx_SafeReleaseBuffer</span>(&__pyx_pybuffernd_vertex.rcbuffer->pybuffer);\n",
" __pyx_L2:;\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normalf);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_normal);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_v);\n",
" <span class='pyx_macro_api'>__Pyx_XDECREF</span>((PyObject *)__pyx_v_s);\n",
" <span class='pyx_macro_api'><span class='refnanny'>__Pyx_XGIVEREF</span></span>(__pyx_r);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"\n",
"/* Python wrapper */\n",
"static PyObject *__pyx_pw_46_cython_magic_637c713b986c525e98b048fef3dc5c09_1cy_compute_normal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
"static PyObject *__pyx_pw_46_cython_magic_637c713b986c525e98b048fef3dc5c09_1cy_compute_normal(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
" PyArrayObject *__pyx_v_vertex = 0;\n",
" PyArrayObject *__pyx_v_face = 0;\n",
" PyObject *__pyx_r = 0;\n",
" <span class='refnanny'>__Pyx_RefNannyDeclarations</span>\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannySetupContext</span></span>(\"cy_compute_normal (wrapper)\", 0);\n",
" {\n",
" static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__vertex,&__pyx_n_s__face,0};\n",
" PyObject* values[2] = {0,0};\n",
" if (unlikely(__pyx_kwds)) {\n",
" Py_ssize_t kw_args;\n",
" const Py_ssize_t pos_args = <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args);\n",
" switch (pos_args) {\n",
" case 2: values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" case 1: values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" case 0: break;\n",
" default: goto __pyx_L5_argtuple_error;\n",
" }\n",
" kw_args = <span class='py_c_api'>PyDict_Size</span>(__pyx_kwds);\n",
" switch (pos_args) {\n",
" case 0:\n",
" if (likely((values[0] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__vertex)) != 0)) kw_args--;\n",
" else goto __pyx_L5_argtuple_error;\n",
" case 1:\n",
" if (likely((values[1] = <span class='py_c_api'>PyDict_GetItem</span>(__pyx_kwds, __pyx_n_s__face)) != 0)) kw_args--;\n",
" else {\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal\", 1, 2, 2, 1);<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" }\n",
" if (unlikely(kw_args > 0)) {\n",
" if (unlikely(<span class='pyx_c_api'>__Pyx_ParseOptionalKeywords</span>(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"cy_compute_normal\") <code><</code> 0))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" }\n",
" } else if (<span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args) != 2) {\n",
" goto __pyx_L5_argtuple_error;\n",
" } else {\n",
" values[0] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 0);\n",
" values[1] = <span class='py_macro_api'>PyTuple_GET_ITEM</span>(__pyx_args, 1);\n",
" }\n",
" __pyx_v_vertex = ((PyArrayObject *)values[0]);\n",
" __pyx_v_face = ((PyArrayObject *)values[1]);\n",
" }\n",
" goto __pyx_L4_argument_unpacking_done;\n",
" __pyx_L5_argtuple_error:;\n",
" <span class='pyx_c_api'>__Pyx_RaiseArgtupleInvalid</span>(\"cy_compute_normal\", 1, 2, 2, <span class='py_macro_api'>PyTuple_GET_SIZE</span>(__pyx_args));<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L3_error;}</span>\n",
" __pyx_L3_error:;\n",
" <span class='pyx_c_api'>__Pyx_AddTraceback</span>(\"_cython_magic_637c713b986c525e98b048fef3dc5c09.cy_compute_normal\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return NULL;\n",
" __pyx_L4_argument_unpacking_done:;\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_vertex), __pyx_ptype_5numpy_ndarray, 1, \"vertex\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" if (unlikely(!<span class='pyx_c_api'>__Pyx_ArgTypeTest</span>(((PyObject *)__pyx_v_face), __pyx_ptype_5numpy_ndarray, 1, \"face\", 0)))<span class='error_goto'> {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}</span>\n",
" __pyx_r = __pyx_pf_46_cython_magic_637c713b986c525e98b048fef3dc5c09_cy_compute_normal(__pyx_self, __pyx_v_vertex, __pyx_v_face);\n",
" int __pyx_lineno = 0;\n",
" const char *__pyx_filename = NULL;\n",
" int __pyx_clineno = 0;\n",
" goto __pyx_L0;\n",
" __pyx_L1_error:;\n",
" __pyx_r = NULL;\n",
" __pyx_L0:;\n",
" <span class='pyx_c_api'><span class='refnanny'>__Pyx_RefNannyFinishContext</span></span>();\n",
" return __pyx_r;\n",
"}\n",
"</pre></body></html>"
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 27,
"text": [
"<IPython.core.display.HTML at 0xaab2b50>"
]
}
],
"prompt_number": 27
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit cy_compute_normal(points, tris)\n",
"print \"\"\n",
"p = %prun -r cy_compute_normal(points, tris)\n",
"p.print_stats()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"10 loops, best of 3: 51.7 ms per loop\n",
"\n",
" 39 function calls in 0.045 seconds\n",
"\n",
" Ordered by: internal time\n",
"\n",
" ncalls tottime percall cumtime percall filename:lineno(function)\n",
" 1 0.042 0.042 0.045 0.045 {_cython_magic_637c713b986c525e98b048fef3dc5c09.cy_compute_normal}\n",
" 6 0.003 0.000 0.003 0.000 {method 'reduce' of 'numpy.ufunc' objects}\n",
" 1 0.000 0.000 0.000 0.000 _internal.py:356(_dtype_from_pep3118)\n",
" 5 0.000 0.000 0.003 0.001 fromnumeric.py:1422(sum)\n",
" 1 0.000 0.000 0.000 0.000 _methods.py:42(_mean)\n",
" 5 0.000 0.000 0.003 0.001 _methods.py:16(_sum)\n",
" 1 0.000 0.000 0.000 0.000 _methods.py:32(_count_reduce_items)\n",
" 1 0.000 0.000 0.000 0.000 _internal.py:370(get_dummy_name)\n",
" 7 0.000 0.000 0.000 0.000 {isinstance}\n",
" 1 0.000 0.000 0.045 0.045 <string>:1(<module>)\n",
" 1 0.000 0.000 0.000 0.000 numeric.py:322(asanyarray)\n",
" 1 0.000 0.000 0.000 0.000 {numpy.core.multiarray.array}\n",
" 1 0.000 0.000 0.000 0.000 fromnumeric.py:2405(mean)\n",
" 1 0.000 0.000 0.000 0.000 {method 'isdigit' of 'str' objects}\n",
" 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}\n",
" 1 0.000 0.000 0.000 0.000 {method 'keys' of 'dict' objects}\n",
" 1 0.000 0.000 0.000 0.000 _internal.py:561(_gcd)\n",
" 1 0.000 0.000 0.000 0.000 {method 'get' of 'dict' objects}\n",
" 1 0.000 0.000 0.000 0.000 {len}\n",
" 1 0.000 0.000 0.000 0.000 _internal.py:368(next_dummy_name)\n",
"\n",
"\n"
]
},
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 28,
"text": [
"<pstats.Stats instance at 0xd5cb368>"
]
}
],
"prompt_number": 28
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Basic Results\n",
"-------------\n",
"We've now reduced the execution time by almost a third again. Looking at the profiler output, we see that all of the time is simply spent inside the Cython function. Since all the operations are vectorized, we are unlikely to see anything but very incremental improvements. However, we've gone from nearly 3s down to around 50ms. Looking at the code, we've changed very little from the original Python version. Easily the most difficult part was rolling our own cross product, and even that was not really a necessary optimisation.\n",
"\n",
"Now, just for our own piece of mind, we'll check that our optimised Cython version produces the same output as the original Python implementation."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cy_normal, cy_normalf = cy_compute_normal(points, tris)\n",
"py_normal, py_normalf = py_compute_normal(points, tris)\n",
"\n",
"print np.allclose(cy_normal, py_normal)\n",
"print np.allclose(cy_normalf, py_normalf)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"True\n",
"True\n"
]
}
],
"prompt_number": 29
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Numba\n",
"-----\n",
"By request I have implemented the algorithm as best I could in Numba. I should note that:\n",
"\n",
" - I have no idea what I'm doing using Numba, so this is unlikely to be optimised\n",
" - I had enormous trouble even getting Numba to run on Ubuntu 13.04. I had to build and install my own LLVM-3.2.\n",
" - It took my about 2 hours just to get something to compile, and I had to resort to ``print`` statements because the output is so useless\n",
" \n",
"I've tried to comment why I did certain unrollings, though I don't justify them because I don't really understand them. I assume that specifying the expected type will help the optimisation - but I honestly have no idea. Presumably the ``np.greater`` and ``np.less`` problem is a bug in Numba?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numba\n",
"from numba.decorators import autojit, jit\n",
"from math import sqrt\n",
"\n",
"\n",
"# Had to unroll this otherwise it complained about some strange python object\n",
"# coercion error\n",
"@autojit\n",
"def numba_normalise(vec):\n",
" # Avoid divisions by almost 0 numbers\n",
" # np.spacing(1) is equivalent to Matlab's eps\n",
" n = vec.shape[0]\n",
" for i in range(n):\n",
" d = sqrt(vec[i, 0] * vec[i, 0] +\n",
" vec[i, 1] * vec[i, 1] +\n",
" vec[i, 2] * vec[i, 2])\n",
" if d < np.spacing(1):\n",
" d = 1.0\n",
"\n",
" vec[i, 0] /= d\n",
" vec[i, 1] /= d\n",
" vec[i, 2] /= d\n",
"\n",
"\n",
"# If I didn't roll my own cross product then computing\n",
"# the normals actually takes LONGER than the pure Python implementation\n",
"@jit(argtypes=(numba.double[:, :], numba.double[:, :]))\n",
"def cross_numba(x, y):\n",
" output = np.empty_like(x)\n",
" n = x.shape[0]\n",
" for i in range(n):\n",
" output[i, 0] = x[i, 1] * y[i, 2] - x[i, 2] * y[i, 1]\n",
" output[i, 1] = x[i, 2] * y[i, 0] - x[i, 0] * y[i, 2]\n",
" output[i, 2] = x[i, 0] * y[i, 1] - x[i, 1] * y[i, 0]\n",
" return output\n",
"\n",
"\n",
"@jit(argtypes=(numba.double[:, :], numba.int32[:, :]))\n",
"def numba_compute_normal(vertex, face):\n",
" nface = face.shape[0]\n",
"\n",
" # Calculate the cross product (per-face normal)\n",
" normalf = cross_numba(vertex[face[:, 1], :] - vertex[face[:, 0], :],\n",
" vertex[face[:, 2], :] - vertex[face[:, 0], :])\n",
" numba_normalise(normalf)\n",
"\n",
" # Calculate per-vertex normal\n",
" normal = np.zeros_like(vertex)\n",
" for i in range(nface):\n",
" f = face[i, :]\n",
" for j in range(3):\n",
" normal[f[j], :] += normalf[i, :]\n",
"\n",
" # Normalize\n",
" numba_normalise(normal)\n",
"\n",
" # Enforce that the normal are outward\n",
" v = vertex - np.mean(vertex)[..., None]\n",
" s = np.sum(v * normal, axis=1)\n",
" s_gt_sum = 0\n",
" s_lt_sum = 0\n",
"\n",
" # Had to expand this loop otherwise numba complained:\n",
" # 'only length-1 arrays can be converted to Python scalars'\n",
" # On the calls to np.greater and np.less\n",
" for i in range(s.shape[0]):\n",
" if s[i] > 0:\n",
" s_gt_sum += 1\n",
" elif s[i] < 0:\n",
" s_lt_sum += 1\n",
"\n",
" if s_gt_sum < s_lt_sum:\n",
" # flip\n",
" normal = -normal\n",
" normalf = -normalf\n",
"\n",
" return normal, normalf"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 30
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As for the results, we've gone down to around 800ms, which is definitely an improvement. Interestingly, this is on par with a Matlab implementation that I have (which is known to be jitted). To sanity check we will also check that the output is correct."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%timeit numba_compute_normal(points, tris)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1 loops, best of 3: 783 ms per loop\n"
]
}
],
"prompt_number": 31
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"numba_normal, numba_normalf = numba_compute_normal(points, tris)\n",
"py_normal, py_normalf = py_compute_normal(points, tris)\n",
"\n",
"print np.allclose(numba_normal, py_normal)\n",
"print np.allclose(numba_normalf, py_normalf)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"True\n",
"True\n"
]
}
],
"prompt_number": 32
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment