numpy.vdot
๋ ๋นํ์ค ๋ฐฉ์์ผ๋ก __array__
๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ๋ฉด segfault๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
segfault๋ ๋ค์ ์ฝ๋ ์ค์์ ๋ฐ์ํฉ๋๋ค.
https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2245
PyArray_DescrFromType
๊ฐ ์คํจํ๋ฉด type
๊ฐ NULL
type
๊ฐ ๋ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
import numpy as np
class Foo(object):
def __array__(self, a):
return self
np.vdot(Foo(), Foo())
์ญ ์ถ์ :
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
* frame #0: 0x0000000100cef88e _multiarray_umath.cpython-37m-darwin.so`array_vdot + 126
frame #1: 0x00000001005e0994 python`PyCFunction_Call + 148
frame #2: 0x0000000100c48dc1 _multiarray_umath.cpython-37m-darwin.so`array_implement_array_function + 305
frame #3: 0x00000001005e11b3 python`_PyMethodDef_RawFastCallKeywords + 227
frame #4: 0x00000001005e071c python`_PyCFunction_FastCallKeywords + 44
frame #5: 0x00000001006b6048 python`call_function + 664
frame #6: 0x00000001006b2a18 python`_PyEval_EvalFrameDefault + 27080
frame #7: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
frame #8: 0x00000001005e06d6 python`_PyFunction_FastCallKeywords + 230
frame #9: 0x00000001006b60d9 python`call_function + 809
frame #10: 0x00000001006b2987 python`_PyEval_EvalFrameDefault + 26935
frame #11: 0x00000001006b6e45 python`_PyEval_EvalCodeWithName + 2997
frame #12: 0x00000001006abfb0 python`PyEval_EvalCode + 48
frame #13: 0x00000001006ee677 python`PyRun_InteractiveOneObjectEx + 615
frame #14: 0x00000001006ede4e python`PyRun_InteractiveLoopFlags + 190
frame #15: 0x00000001006edd5c python`PyRun_AnyFileExFlags + 60
frame #16: 0x0000000100710c51 python`pymain_main + 7873
frame #17: 0x000000010071127f python`_Py_UnixMain + 111
frame #18: 0x00007fff5f6e63d5 libdyld.dylib`start + 1
๋๋ ์ด๊ฒ์ Mac OS X์์ ๋ค์๊ณผ ๊ฐ์ด ์ฌํํ์ต๋๋ค.
1.17.0 3.7.2 (default, Jan 16 2019, 11:36:28)
[Clang 10.0.0 (clang-1000.11.45.2)]
๋ด๋ถ Linux ๋น๋์์.
์ด ๋ฌธ์ ๋ ์๋ https://github.com/google/jax/issues/1162 ๋ก๋ณด๊ณ ๋์์ต๋๋ค.
ํ , vdot
๋ ์ถ๋ ฅ dtype์ด ๋ฏธ๋ฆฌ ๋ฌด์์ธ์ง ํ์ธํฉ๋๋ค (๋ด๊ฐ ์๊ฐํ๊ธฐ์ ๊ด์ฐฎ์ต๋๋ค). ๊ทธ๋ฌ๋์ด ํจ์๋ ์คํจํ๊ณ NPY_NOTYPE
๋ฐํ ํ ์ ์์ผ๋ฏ๋ก NPY_NOTYPE
์ด ๋ฐํ ๋ ๋ ์ค๋ฅ๋ฅผ ๋ฐํํด์ผํฉ๋๋ค. ์ด๊ฒ์ https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/multiarraymodule.c#L2241 (๋ฐ ๋ค์ ์ค)์ ์์ผ๋ฉฐ, ํ์๋๋ ์ค๋ฅ๋ ๋์ค์ ์ค๋ฅ ๋ฐํ์
๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ ํจ์๊ฐ ์ค์ ๋ก ์ค๋ฅ๋ฅผ ๋ฐํํด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค (์ค๋ฅ ๊ฒ์ฌ๋ ์ถ๊ฐํด๋ ๊ด์ฐฎ์ต๋๋ค).
ํ๋ณดํ๊ณ ์ถ์ต๋๊น?
(์ค๋ฅ ๊ฒ์ฌ๊ฐ ๋๋ฝ ๋ ์ ์ฌํ ์ฉ๋๊ฐ ๋ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.)
์๋
ํ์ธ์,
์ ๋ ์ ๊ท ์ด๋ฏผ์์ด๋ฉฐ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค. ์ด๋์๋ถํฐ ์์ํด์ผํ๋์?
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๊ฐ๋ฐ ์ํฌ ํ๋ก์ฐ ์ ๋ํด ์ฝ์ด๋ณด์ญ์์ค. ๊ทธ๋ฐ ๋ค์ master
์ง์ ( git checkout master; git clean -xfd; python runtests.py
)์์ python runtests.py
์คํํ ์์๋ ์ง์ ์ ๋๋ฌํด์ผํฉ๋๋ค.
์ค์ ์ด ์๋ฃ๋๋ฉด ํดํน์ ์์ํ ์ ์์ต๋๋ค. ๋ธ๋์น ์์ฑ, ์คํจํ ํ
์คํธ ์ถ๊ฐ ( numpy/core/tests/teste_multiarray.py
์ TestVDot
๊ฐ ์ข์ ๊ณณ), ์์ ํํธ์์ C ์ฝ๋๋ฅผ ์์ ํด๋ณด์ธ์. . ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ธ์ ๋ ์ง ๋์์ ์์ฒญํ๋ฉด ๋ฌธ์๋ฅผ ๋ฐ๋ฅด๊ณ ํํธ๋ฅผ ๋ฐ๋ฅด๊ธฐ ์ํด ์ง์ ์ผ๋ก ๋
ธ๋ ฅํ์์ ๋ ๋ง์ด ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
@ Soniyanayak51 ํ์ํฉ๋๋ค!
@mattip์ ๋ง์
@rgommers @mattip PyArray_DescrFromType ()์์ ์ป์ ์ ํ์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. PyArray_DESCR ()์ ๋ํด์๋ ์ถ๊ฐํด์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ test_multiarray.py์ ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ test_PyArrayType์ ์ถ๊ฐํ๊ณ ์ ํ์ด NULL ์ธ ํ
์คํธ๋ฅผ ์ถ๊ฐํด์ผํฉ๋๊น? ํ
์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@rgommers @mattip PyArray_DescrFromType ()์์ ์ป์ ์ ํ์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ์ต๋๋ค. PyArray_DESCR ()์ ๋ํด์๋ ์ถ๊ฐํด์ผํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ํ test_multiarray.py์ ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ test_PyArrayType์ ์ถ๊ฐํ๊ณ ์ ํ์ด NULL ์ธ ํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผํฉ๋๊น? ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@mattip ์ด PR์์ ๋ถ๋ถ์ ์ผ๋ก ๋๋ต ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ๋ฅผ ๊ณ์ ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
test_PyArrayType์ ์ถ๊ฐํ๊ณ ์ ํ์ด NULL ์ธ ํ ์คํธ๋ฅผ ์ถ๊ฐํด์ผํฉ๋๊น?
์ฝ๊ฐ ์ถ๊ฐํ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํ ์คํธ๋ฅผ ์ถ๊ฐํ๋ ์์น์ ๊ณต์ฉ API ๋ง ํ ์คํธํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋น์ ์
...
np.vdot(Foo(), Foo())
์์ ๋ฌธ์ ์ค๋ช ์์ ํ ์คํธ๋ก ์ถ๊ฐํ์ญ์์ค. C API๋ฅผ ๋ณ๋๋ก ํ ์คํธ ํ ํ์๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.