Skip to content

SciPy v1.16.0 #141

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft

Conversation

agriyakhetarpal
Copy link
Member

@agriyakhetarpal agriyakhetarpal commented Jun 29, 2025

Description

This PR bumps SciPy to version 1.16.0, released on 22nd June, 2025: https://github.com/scipy/scipy/releases/tag/v1.16.0. Here are a few points:

  • The number of patches has been reduced; we now have fourteen patches from the previous eighteen (although there is always scope to add a few more once this is implemented).
  • The problem of not being able to use the f2py entry point directly via Meson generators remains, and we have to resort to using python -m numpy.f2py and custom targets until Stop excluding unisolated packages from build dependencies pyodide-build#21 is resolved.
  • Many new C-rewritten packages also have the same problem of alternate returns, which means that we need to patch their signatures to match the ones coming from OpenBLAS, which means voids are transformed to ints in the code for the ARPACK, the _matfuncs family, FITPACK, SLSQP, NNLS, and the L-BFGS-B extension modules.
  • Most of the diff of 50K lines added here comes from the ARPACK code; and the patch is more or less the same as the aforementioned upstream PR with hardly any differences. The removal of 20K lines comes from dropping the id_dist patch,
  • Unfortunately, I tried testing the previous tests that we used to run via scipy-pytest.js, but the tests always hang on my macOS machine locally at the ~14-15% stage at various points, despite skipping many of them. I suggest that we leave the extra testing for another PR, as the necessary infrastructure to get those tests up and running is a follow-up task that I'd be happy to assign myself to.

Tip

This PR depends on https://github.com/pyodide/pyodide-recipes#140, which, at the time of writing, contains a patch that allows compilation to proceed to completion and succeed. That PR also depends on another PR (pyodide/pyodide-build#168). Please review those PRs first (starting with the latter) before coming back to this one, as this will reduce the diff to the relevant files. Thank you!

PR stack

Please review the following PRs in the order listed below:

Additional context

SciPy was previously updated in pyodide/pyodide#5031 to version 1.14.1.

Follow-up tasks after this PR:


Tagging the recipe maintainers and our previous collaborators here, like I've done in the past: @lesteve, @steppi, and @rgommers

Thank you for your time!

Copy link

github-actions bot commented Jun 29, 2025

Package Build Results

Total packages built: 33
Total build time: 0:18:31

Package Build Times (click to expand)
Package Build Time
scipy 9m 34s
openblas 7m 19s
openssl 5m 43s
boost-cpp 5m 7s
numpy 5m 5s
sqlite3 1m 52s
liblzma 1m 3s
test 37s
libf2c 32s
regex 22s
lzma 9s
ssl 9s
MarkupSafe 7s
hashlib 7s
pydecimal 6s
pydoc_data 6s
atomicwrites 5s
packaging 4s
pytz 2s
py 2s
setuptools 2s
pyparsing 2s
Jinja2 1s
attrs 1s
tblib 1s
more-itertools 1s
six 1s
pytest-asyncio 1s
pytest 1s
micropip 1s
exceptiongroup 1s
iniconfig 1s
pluggy 1s

Longest build: scipy (9m 34s)
Packages built in more than 10 minutes: 0

@agriyakhetarpal
Copy link
Member Author

Hi @rgommers, I experimented a bit with the f2py generator definition code to make find_program() use python -m numpy.f2py instead of just f2py, but I didn't get very far with this – I thought that would be good to get done with to drop one more patch (patch 0014) here to get to thirteen patches in total. Would it make sense to add a fallback of sorts? The comment at https://github.com/scipy/scipy/blob/07942c2a8222a6169a7e69c6935541f8c5430cb3/scipy/meson.build#L205-L212 already suggests the possibility of adding one. I could put together a PR for this if yes, or explore this further if there are any other options (xref scipy/scipy#14812).

Either way, it's not a blocker here, so this PR is ready for review. Thanks!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am so happy that we are removing this giant patch.

@agriyakhetarpal
Copy link
Member Author

Thanks for your super quick reviews on the prerequisite PRs and this PR, @ryanking13! I've rebased the PR to reduce the diff's size, as mentioned.

Also, I have changed my mind here, slightly – I'll be working on #144 and adding the full SciPy test suite back, as it should pass on the current SciPy 1.14.1. We will then be able to test any incumbent issues more effectively with this update, rather than relying on a limited set of tests. (That is, we can try and see if it works, at least. I'm still facing the problem of the tests hanging on my macOS machine 😅).

@rgommers
Copy link

Hi @rgommers, I experimented a bit with the f2py generator definition code to make find_program() use python -m numpy.f2py instead of just f2py, but I didn't get very far with this – I thought that would be good to get done with to drop one more patch (patch 0014) here to get to thirteen patches in total.

If it's working now for Pyodide, I'd prefer to not touch this at all right now and keeping the patch, because we're close to proper cross-compilation support in meson-python and then we should be able to get it right at once.

@rgommers
Copy link

Many new C-rewritten packages also have the same problem of alternate returns,

Can you elaborate? The link says that alternate returns are a Fortran feature with no equivalent in C.

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jun 30, 2025

Hi @rgommers, I experimented a bit with the f2py generator definition code to make find_program() use python -m numpy.f2py instead of just f2py, but I didn't get very far with this – I thought that would be good to get done with to drop one more patch (patch 0014) here to get to thirteen patches in total.

If it's working now for Pyodide, I'd prefer to not touch this at all right now and keeping the patch, because we're close to proper cross-compilation support in meson-python and then we should be able to get it right at once.

Makes sense to me, thanks Ralf!

Many new C-rewritten packages also have the same problem of alternate returns,

Can you elaborate? The link says that alternate returns are a Fortran feature with no equivalent in C.

Ah, I should have phrased that better – alternate returns are why we convert voids to ints in Fortran code for SciPy and for its prerequisite recipes such as OpenBLAS and CLAPACK, and this requirement persists in the C-rewritten packages that depend on OpenBLAS – I just wanted to convey that this is somewhat analogous to that Fortran feature, because the linker finds i32s for symbols from libopenblas.so, and we need to convert the corresponding type definitions away from voids in SciPy's subpackages (whether Fortran or C-rewritten, etc.) to match them. Otherwise, we run into link-time mismatches in function signatures.

@agriyakhetarpal
Copy link
Member Author

I'll mark this as a draft until we get #148 in. Thanks!

@agriyakhetarpal agriyakhetarpal marked this pull request as draft June 30, 2025 18:11
@rgommers
Copy link

Okay thanks, that is clearer. So it's not that the new C code in SciPy is problematic, but that the OpenBLAS signatures have already been changed and hence the corresponding SciPy code that calls into OpenBLAS needs changing as well.

It seems to me that that's a problem inherent in using LAPACK interfaces in Pyodide, and the only way around it is to use LAPACKE instead. Might be worth revisiting at some point after we've finished removing all Fortran code in SciPy.

@agriyakhetarpal
Copy link
Member Author

Okay thanks, that is clearer. So it's not that the new C code in SciPy is problematic, but that the OpenBLAS signatures have already been changed and hence the corresponding SciPy code that calls into OpenBLAS needs changing as well.

Yes, indeed!

It seems to me that that's a problem inherent in using LAPACK interfaces in Pyodide, and the only way around it is to use LAPACKE instead. Might be worth revisiting at some point after we've finished removing all Fortran code in SciPy.

I think so too. Until we can explore LAPACKE, LLVM Flang from v20 and up is our best bet as a direct Fortran-to-WASM compiler; pyodide/pyodide#5268 has a few details about previous (partially successful/not yet successful) efforts.

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jun 30, 2025

Okay, the full test suite is back now via #148 – I'm going to trigger it and see what new test failures show up. I hope there won't be too many :)

@agriyakhetarpal agriyakhetarpal added the scipy This label is used to run the full SciPy test suite for any pull requests to which it is applied label Jun 30, 2025
@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jun 30, 2025

Yes, unfortunately, https://github.com/pyodide/pyodide-recipes/actions/runs/15982819048/job/45082284069?pr=141 has been stuck at this test for the past six minutes (at the time of writing):

tests/test_differentiate.py::TestDerivative::test_accuracy[numpy-case51]

which I can also replicate locally. We're running the "not slow" tests. The CI job hangs at 3%, but at least I can get to 15% on my end. I wonder if using a pyodide venv will be of any help to us here. I think it will be quite challenging to determine the reason for such hangs, as I am unsure if there are any methods at our disposal to access any debugging information.

When I encountered this case locally, I skipped this test case; however, many more hangs subsequently appeared and were difficult to debug, as it is not possible to determine ahead of time which tests will produce them. I had eventually given up on running the entire test suite at about 15% completion.

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jun 30, 2025

If I run the tests using a pyodide venv, it reveals this:

Failed to load lib  /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so
Error: Failed to load dynamic library /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so: 0
    at Z.loadDynlib (/Users/agriyakhetarpal/Library/Caches/.pyodide-xbuildenv-0.30.6.dev3+g5b5bfc7/https_github_com_pyodide_pyodide-build-environment-nightly_releases_download_20250626_xbuildenv_tar_bz2/xbuildenv/pyodide-root/dist/pyodide.asm.js:8:658225)
    at async main (file:///Users/agriyakhetarpal/Library/Caches/.pyodide-xbuildenv-0.30.6.dev3+g5b5bfc7/https_github_com_pyodide_pyodide-build-environment-nightly_releases_download_20250626_xbuildenv_tar_bz2/xbuildenv/pyodide-root/dist/python_cli_entry.mjs:91:7)
=================================================================================== test session starts ====================================================================================
platform emscripten -- Python 3.13.2, pytest-8.4.1, pluggy-1.6.0 -- /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/bin/python
cachedir: .pytest_cache
hypothesis profile 'default'
rootdir: /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy
plugins: hypothesis-6.135.20
collected 0 items / 2 errors                                                                                                                                                               

========================================================================================== ERRORS ==========================================================================================
___________________________________________________ ERROR collecting .venv-pyodide/lib/python3.13/site-packages/scipy/stats/_bws_test.py ___________________________________________________
ImportError while importing test module '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_bws_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/lib/python313.zip/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/__init__.py:626: in <module>
    from ._stats_py import *
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_stats_py.py:52: in <module>
    from . import distributions
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/distributions.py:10: in <module>
    from . import _continuous_distns
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_continuous_distns.py:13: in <module>
    from scipy.interpolate import BSpline
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/__init__.py:192: in <module>
    from ._interpolate import *
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_interpolate.py:12: in <module>
    from . import _fitpack_py
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_fitpack_py.py:10: in <module>
    from ._bsplines import BSpline
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_bsplines.py:10: in <module>
    from . import _dierckx
E   ImportError: dynamic module does not define module export function (PyInit__dierckx)
_______________________________________________ ERROR collecting .venv-pyodide/lib/python3.13/site-packages/scipy/stats/_page_trend_test.py ________________________________________________
ImportError while importing test module '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_page_trend_test.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/lib/python313.zip/importlib/__init__.py:88: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/__init__.py:626: in <module>
    from ._stats_py import *
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_stats_py.py:52: in <module>
    from . import distributions
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/distributions.py:10: in <module>
    from . import _continuous_distns
.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_continuous_distns.py:13: in <module>
    from scipy.interpolate import BSpline
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/__init__.py:192: in <module>
    from ._interpolate import *
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_interpolate.py:12: in <module>
    from . import _fitpack_py
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_fitpack_py.py:10: in <module>
    from ._bsplines import BSpline
.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_bsplines.py:10: in <module>
    from . import _dierckx
E   ImportError: dynamic module does not define module export function (PyInit__dierckx)
================================================================================= short test summary info ==================================================================================
ERROR .venv-pyodide/lib/python3.13/site-packages/scipy/stats/_bws_test.py
ERROR .venv-pyodide/lib/python3.13/site-packages/scipy/stats/_page_trend_test.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
==================================================================================== 2 errors in 2.80s =====================================================================================

Which suggests that _dierckx is the culprit; FITPACK hasn't been compiled properly. However, this is not revealed in the Node.js tests, which hang, so perhaps we aren't reporting missing symbols for Node.js the same way we do for the CLI runner?

I suppose this might also be the reason why I encountered more hangs in the test suite – some more subpackages other than FITPACK may not have been compiled correctly.

@agriyakhetarpal
Copy link
Member Author

All the errors in the test suite are coming from _dierckx.cpython-313-wasm32-emscripten.so, so I guess it's now time to perform some surgery on it and get some diagnostics.

@agriyakhetarpal
Copy link
Member Author

wasm-objdump /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so -j Export -x

suggests that the symbol does exist:

_dierckx.cpython-313-wasm32-emscripten.so:      file format wasm 0x1

Section Details:

Export[4]:
 - func[39] <__wasm_call_ctors> -> "__wasm_call_ctors"
 - func[42] <PyInit__dierckx> -> "PyInit__dierckx"
 - func[59] <_ZNSt3__212__tuple_implINS_15__tuple_indicesIJLm0ELm1EEEEJNS_6vectorIdNS_9allocatorIdEEEENS3_IxNS4_IxEEEEEEC2B8ne190106IJLm0ELm1EEJS6_S8_ETpTnmJEJEJRS6_RS8_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3_> -> "_ZNSt3__212__tuple_implINS_15__tuple_indicesIJLm0ELm1EEEEJNS_6vectorIdNS_9allocatorIdEEEENS3_IxNS4_IxEEEEEEC2B8ne190106IJLm0ELm1EEJS6_S8_ETpTnmJEJEJRS6_RS8_EEENS1_IJXspT_EEEENS_13__tuple_typesIJDpT0_EEENS1_IJXspT1_EEEENSE_IJDpT2_EEEDpOT3_"
 - func[40] <__wasm_apply_data_relocs> -> "__wasm_apply_data_relocs"

and from the Type section dump:

type[2] () -> nil
type[4] () -> i32

And from the Function section:

func[42] sig=4 <PyInit__dierckx>

So PyInit__dierckx has signature type[4] which is () -> i32. This is correct.

Perhaps I missed patching a DLARTG somewhere?

@ryanking13
Copy link
Member

ryanking13 commented Jul 1, 2025

Thanks for the investigation, @agriyakhetarpal. The error happens while loading the library,

Failed to load lib  /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so
Error: Failed to load dynamic library /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so: 0

Because of the error during the loading step, the symbols will not be filled out in the GOT table. That's why the

ImportError: dynamic module does not define module export function (PyInit__dierckx)

error happens.

So I think we'll need to investigate why the library loading fails in the test (It ddidn't fail when I tried to load scipy locally in my browser). To see a more helpful error log, try with a debug build of Pyodide, which is available by passing the following flag PYODIDE_SYMBOLS=1 when building the Pyodide runtime. It will show a much richer message in the library loading process.

@agriyakhetarpal
Copy link
Member Author

Thanks, @ryanking13! I wonder if we could also release an xbuildenv-debug.tar.bz2 in the same GitHub nightly/scheduled release, so that we won't have to compile it ourselves? We could also expand to debugoptimized, debug, and release builds (but only document the released ones for now, like we've been doing).

@ryanking13
Copy link
Member

ryanking13 commented Jul 1, 2025

Failed to load lib /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so
Error: Failed to load dynamic library /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so: 0

But I think this error only happens in the pyodide venv environment, so the hang in the unittest might have a different reason. pyodide venv has its own issues such as (pyodide/pyodide#5709), which isn't related to individual packages I guess.

@ryanking13
Copy link
Member

Thanks, @ryanking13! I wonder if we could also release an xbuildenv-debug.tar.bz2 in the same GitHub nightly/scheduled release, so that we won't have to compile it ourselves? We could also expand to debugoptimized, debug, and release builds (but only document the released ones for now, like we've been doing).

Sounds good to me. Would you like to update https://github.com/pyodide/pyodide-build-environment-nightly to support that feature?

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jul 1, 2025

Failed to load lib /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so
Error: Failed to load dynamic library /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so: 0

But I think this error only happens in the pyodide venv environment, so the hang in the unittest might have a different reason.

Oh, actually, another test in TestBSplines (when I was running the test suite locally) was hanging for the same reason (when I skipped this test to allow the test suite to proceed), so I think it must be related to _dierckx – it goes through the same code paths. So the scipy-pytest.js script with node also likely has the same error with loading this lib, but the error is not being reported in stdout/stderr and the script is not crashing/halting execution/failing here when it should.

Thanks, @ryanking13! I wonder if we could also release an xbuildenv-debug.tar.bz2 in the same GitHub nightly/scheduled release, so that we won't have to compile it ourselves? We could also expand to debugoptimized, debug, and release builds (but only document the released ones for now, like we've been doing).

Sounds good to me. Would you like to update pyodide/pyodide-build-environment-nightly to support that feature?

Yes, I'll put together a PR!

@ryanking13
Copy link
Member

ryanking13 commented Jul 1, 2025

Meanwhile, I ran the hanging test locally and was able to reproduce it in my browser:

from scipy import stats
from scipy.differentiate import derivative
from js import console

distcont = stats._distr_params.distcont
for idx, case in enumerate(distcont):
	distname, params = case
	console.log("handling case: ", idx, distname, params)
	dist = getattr(stats, distname)(*params)
	x = dist.median() + 0.1
	res = derivative(dist.cdf, x)
	ref = dist.pdf(x)

The derivative function (which was introduced in scipy 1.15) hangs when it the case is

    ['irwinhall', (10,)],

@agriyakhetarpal
Copy link
Member Author

Thanks! Yes, there might be a few more broken libraries besides _dierckx, as I had at least 6-7 test cases that were hanging. However, I didn't check if they were all going through _dierckx, as it is the only one being reported right now.

Perhaps we could test individual test modules (scipy.stats, scipy.io, scipy.special, etc.) in the test suite to isolate this issue more effectively.

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jul 3, 2025

With the new debug xbuildenv from https://github.com/pyodide/pyodide-build-environment-nightly/releases/tag/20250703 that we added, I can see this when I try to run a reproducer:

Tap to expand logs
dlsym_js: PyInit__pocketfft_umath
dlsym_js: PyInit__pocketfft_umath getting table slot for: function 46() { [native code] }
symbol already exists in table: PyInit__pocketfft_umath
dlsym_js: PyInit__pocketfft_umath -> 38050
dlsym_js: PyInit__bounded_integers
dlsym_js: PyInit__bounded_integers getting table slot for: function 83() { [native code] }
symbol already exists in table: PyInit__bounded_integers
dlsym_js: PyInit__bounded_integers -> 38145
dlsym_js: PyInit_bit_generator
dlsym_js: PyInit_bit_generator getting table slot for: function 142() { [native code] }
symbol already exists in table: PyInit_bit_generator
dlsym_js: PyInit_bit_generator -> 38677
dlsym_js: PyInit__common
dlsym_js: PyInit__common getting table slot for: function 127() { [native code] }
symbol already exists in table: PyInit__common
dlsym_js: PyInit__common -> 38188
dlsym_js: PyInit__generator
dlsym_js: PyInit__generator getting table slot for: function 184() { [native code] }
symbol already exists in table: PyInit__generator
dlsym_js: PyInit__generator -> 38344
dlsym_js: PyInit__pcg64
dlsym_js: PyInit__pcg64 getting table slot for: function 112() { [native code] }
symbol already exists in table: PyInit__pcg64
dlsym_js: PyInit__pcg64 -> 38493
dlsym_js: PyInit__mt19937
dlsym_js: PyInit__mt19937 getting table slot for: function 112() { [native code] }
symbol already exists in table: PyInit__mt19937
dlsym_js: PyInit__mt19937 -> 38430
dlsym_js: PyInit__philox
dlsym_js: PyInit__philox getting table slot for: function 113() { [native code] }
symbol already exists in table: PyInit__philox
dlsym_js: PyInit__philox -> 38541
dlsym_js: PyInit__sfc64
dlsym_js: PyInit__sfc64 getting table slot for: function 101() { [native code] }
symbol already exists in table: PyInit__sfc64
dlsym_js: PyInit__sfc64 -> 38586
dlsym_js: PyInit_mtrand
dlsym_js: PyInit_mtrand getting table slot for: function 143() { [native code] }
symbol already exists in table: PyInit_mtrand
dlsym_js: PyInit_mtrand -> 38811
dlsym_js: PyInit__sparsetools
dlsym_js: PyInit__sparsetools getting table slot for: function 5660() { [native code] }
symbol already exists in table: PyInit__sparsetools
dlsym_js: PyInit__sparsetools -> 22462
dlsym_js: PyInit__csparsetools
dlsym_js: PyInit__csparsetools getting table slot for: function 142() { [native code] }
symbol already exists in table: PyInit__csparsetools
dlsym_js: PyInit__csparsetools -> 19878
dlsym_js: PyInit__cyutility
dlsym_js: PyInit__cyutility getting table slot for: function 131() { [native code] }
symbol already exists in table: PyInit__cyutility
dlsym_js: PyInit__cyutility -> 11903
dlsym_js: PyInit__ckdtree
dlsym_js: PyInit__ckdtree getting table slot for: function 172() { [native code] }
symbol already exists in table: PyInit__ckdtree
dlsym_js: PyInit__ckdtree -> 22573
dlsym_js: PyInit__qhull
dlsym_js: PyInit__qhull getting table slot for: function 182() { [native code] }
symbol already exists in table: PyInit__qhull
dlsym_js: PyInit__qhull -> 22900
dlsym_js: PyInit_messagestream
dlsym_js: PyInit_messagestream getting table slot for: function 110() { [native code] }
symbol already exists in table: PyInit_messagestream
dlsym_js: PyInit_messagestream -> 12036
dlsym_js: PyInit__fblas
dlsym_js: PyInit__fblas getting table slot for: function 64() { [native code] }
symbol already exists in table: PyInit__fblas
dlsym_js: PyInit__fblas -> 16669
dlsym_js: PyInit__flapack
dlsym_js: PyInit__flapack getting table slot for: function 73() { [native code] }
symbol already exists in table: PyInit__flapack
dlsym_js: PyInit__flapack -> 17311
dlsym_js: PyInit__cythonized_array_utils
dlsym_js: PyInit__cythonized_array_utils getting table slot for: function 128() { [native code] }
symbol already exists in table: PyInit__cythonized_array_utils
dlsym_js: PyInit__cythonized_array_utils -> 16371
dlsym_js: PyInit_cython_lapack
dlsym_js: PyInit_cython_lapack getting table slot for: function 1573() { [native code] }
symbol already exists in table: PyInit_cython_lapack
dlsym_js: PyInit_cython_lapack -> 19145
dlsym_js: PyInit__solve_toeplitz
dlsym_js: PyInit__solve_toeplitz getting table slot for: function 118() { [native code] }
symbol already exists in table: PyInit__solve_toeplitz
dlsym_js: PyInit__solve_toeplitz -> 17415
dlsym_js: PyInit__decomp_lu_cython
dlsym_js: PyInit__decomp_lu_cython getting table slot for: function 99() { [native code] }
symbol already exists in table: PyInit__decomp_lu_cython
dlsym_js: PyInit__decomp_lu_cython -> 16476
dlsym_js: PyInit__matfuncs_schur_sqrtm
dlsym_js: PyInit__matfuncs_schur_sqrtm getting table slot for: function 43() { [native code] }
symbol already exists in table: PyInit__matfuncs_schur_sqrtm
dlsym_js: PyInit__matfuncs_schur_sqrtm -> 17319
dlsym_js: PyInit__matfuncs_expm
dlsym_js: PyInit__matfuncs_expm getting table slot for: function 66() { [native code] }
symbol already exists in table: PyInit__matfuncs_expm
dlsym_js: PyInit__matfuncs_expm -> 17317
dlsym_js: PyInit__linalg_pythran
dlsym_js: PyInit__linalg_pythran getting table slot for: function 64() { [native code] }
symbol already exists in table: PyInit__linalg_pythran
dlsym_js: PyInit__linalg_pythran -> 17314
dlsym_js: PyInit__decomp_update
dlsym_js: PyInit__decomp_update getting table slot for: function 113() { [native code] }
symbol already exists in table: PyInit__decomp_update
dlsym_js: PyInit__decomp_update -> 16512
dlsym_js: PyInit_cython_blas
dlsym_js: PyInit_cython_blas getting table slot for: function 238() { [native code] }
symbol already exists in table: PyInit_cython_blas
dlsym_js: PyInit_cython_blas -> 17614
dlsym_js: PyInit__voronoi
dlsym_js: PyInit__voronoi getting table slot for: function 99() { [native code] }
symbol already exists in table: PyInit__voronoi
dlsym_js: PyInit__voronoi -> 22941
dlsym_js: PyInit__ufuncs
dlsym_js: PyInit__ufuncs getting table slot for: function 163() { [native code] }
symbol already exists in table: PyInit__ufuncs
dlsym_js: PyInit__ufuncs -> 24370
dlsym_js: PyInit__ufuncs_cxx
dlsym_js: PyInit__ufuncs_cxx getting table slot for: function 900() { [native code] }
symbol already exists in table: PyInit__ufuncs_cxx
dlsym_js: PyInit__ufuncs_cxx -> 24637
dlsym_js: PyInit__ellip_harm_2
dlsym_js: PyInit__ellip_harm_2 getting table slot for: function 101() { [native code] }
symbol already exists in table: PyInit__ellip_harm_2
dlsym_js: PyInit__ellip_harm_2 -> 23014
dlsym_js: PyInit__special_ufuncs
dlsym_js: PyInit__special_ufuncs getting table slot for: function 397() { [native code] }
symbol already exists in table: PyInit__special_ufuncs
dlsym_js: PyInit__special_ufuncs -> 23783
dlsym_js: PyInit__gufuncs
dlsym_js: PyInit__gufuncs getting table slot for: function 275() { [native code] }
symbol already exists in table: PyInit__gufuncs
dlsym_js: PyInit__gufuncs -> 23131
dlsym_js: PyInit__specfun
dlsym_js: PyInit__specfun getting table slot for: function 119() { [native code] }
symbol already exists in table: PyInit__specfun
dlsym_js: PyInit__specfun -> 23364
dlsym_js: PyInit__comb
dlsym_js: PyInit__comb getting table slot for: function 86() { [native code] }
symbol already exists in table: PyInit__comb
dlsym_js: PyInit__comb -> 22974
dlsym_js: PyInit__hausdorff
dlsym_js: PyInit__hausdorff getting table slot for: function 101() { [native code] }
symbol already exists in table: PyInit__hausdorff
dlsym_js: PyInit__hausdorff -> 22793
dlsym_js: PyInit__distance_pybind
dlsym_js: PyInit__distance_pybind getting table slot for: function 176() { [native code] }
symbol already exists in table: PyInit__distance_pybind
dlsym_js: PyInit__distance_pybind -> 22707
dlsym_js: PyInit__distance_wrap
dlsym_js: PyInit__distance_wrap getting table slot for: function 23() { [native code] }
symbol already exists in table: PyInit__distance_wrap
dlsym_js: PyInit__distance_wrap -> 22759
dlsym_js: PyInit__rigid_transform
dlsym_js: PyInit__rigid_transform getting table slot for: function 154() { [native code] }
symbol already exists in table: PyInit__rigid_transform
dlsym_js: PyInit__rigid_transform -> 26745
dlsym_js: PyInit__rotation
dlsym_js: PyInit__rotation getting table slot for: function 169() { [native code] }
symbol already exists in table: PyInit__rotation
dlsym_js: PyInit__rotation -> 26862
growMemory: 90439680 (+15073280 bytes / 230 pages)
dlsym_js: PyInit__superlu
dlsym_js: PyInit__superlu getting table slot for: function 102() { [native code] }
symbol already exists in table: PyInit__superlu
dlsym_js: PyInit__superlu -> 27212
dlsym_js: PyInit__arpacklib
dlsym_js: PyInit__arpacklib getting table slot for: function 122() { [native code] }
symbol already exists in table: PyInit__arpacklib
dlsym_js: PyInit__arpacklib -> 27313
dlsym_js: PyInit__spropack
dlsym_js: PyInit__spropack getting table slot for: function 90() { [native code] }
symbol already exists in table: PyInit__spropack
dlsym_js: PyInit__spropack -> 27252
dlsym_js: PyInit__dpropack
dlsym_js: PyInit__dpropack getting table slot for: function 90() { [native code] }
symbol already exists in table: PyInit__dpropack
dlsym_js: PyInit__dpropack -> 27238
dlsym_js: PyInit__cpropack
dlsym_js: PyInit__cpropack getting table slot for: function 90() { [native code] }
symbol already exists in table: PyInit__cpropack
dlsym_js: PyInit__cpropack -> 27224
dlsym_js: PyInit__zpropack
dlsym_js: PyInit__zpropack getting table slot for: function 90() { [native code] }
symbol already exists in table: PyInit__zpropack
dlsym_js: PyInit__zpropack -> 27266
dlsym_js: PyInit__group_columns
dlsym_js: PyInit__group_columns getting table slot for: function 57() { [native code] }
symbol already exists in table: PyInit__group_columns
dlsym_js: PyInit__group_columns -> 19456
dlsym_js: PyInit__trlib
dlsym_js: PyInit__trlib getting table slot for: function 135() { [native code] }
symbol already exists in table: PyInit__trlib
dlsym_js: PyInit__trlib -> 30636
dlsym_js: PyInit__lbfgsb
dlsym_js: PyInit__lbfgsb getting table slot for: function 26() { [native code] }
symbol already exists in table: PyInit__lbfgsb
dlsym_js: PyInit__lbfgsb -> 19458
dlsym_js: PyInit__moduleTNC
dlsym_js: PyInit__moduleTNC getting table slot for: function 99() { [native code] }
symbol already exists in table: PyInit__moduleTNC
dlsym_js: PyInit__moduleTNC -> 19507
dlsym_js: PyInit__slsqplib
dlsym_js: PyInit__slsqplib getting table slot for: function 45() { [native code] }
symbol already exists in table: PyInit__slsqplib
dlsym_js: PyInit__slsqplib -> 19543
dlsym_js: PyInit__minpack
dlsym_js: PyInit__minpack getting table slot for: function 41() { [native code] }
symbol already exists in table: PyInit__minpack
dlsym_js: PyInit__minpack -> 19472
dlsym_js: PyInit_givens_elimination
dlsym_js: PyInit_givens_elimination getting table slot for: function 84() { [native code] }
symbol already exists in table: PyInit_givens_elimination
dlsym_js: PyInit_givens_elimination -> 30602
dlsym_js: PyInit__zeros
dlsym_js: PyInit__zeros getting table slot for: function 16() { [native code] }
symbol already exists in table: PyInit__zeros
dlsym_js: PyInit__zeros -> 19549
dlsym_js: PyInit__core
dlsym_js: PyInit__core getting table slot for: function 524() { [native code] }
symbol already exists in table: PyInit__core
dlsym_js: PyInit__core -> 30290
dlsym_js: PyInit__highs_options
dlsym_js: PyInit__highs_options getting table slot for: function 200() { [native code] }
symbol already exists in table: PyInit__highs_options
dlsym_js: PyInit__highs_options -> 30567
dlsym_js: PyInit__decomp_interpolative
dlsym_js: PyInit__decomp_interpolative getting table slot for: function 129() { [native code] }
symbol already exists in table: PyInit__decomp_interpolative
dlsym_js: PyInit__decomp_interpolative -> 16443
dlsym_js: PyInit__uarray
dlsym_js: PyInit__uarray getting table slot for: function 83() { [native code] }
symbol already exists in table: PyInit__uarray
dlsym_js: PyInit__uarray -> 32520
dlsym_js: PyInit_pypocketfft
dlsym_js: PyInit_pypocketfft getting table slot for: function 285() { [native code] }
symbol already exists in table: PyInit_pypocketfft
dlsym_js: PyInit_pypocketfft -> 32372
dlsym_js: PyInit__bglu_dense
dlsym_js: PyInit__bglu_dense getting table slot for: function 127() { [native code] }
symbol already exists in table: PyInit__bglu_dense
dlsym_js: PyInit__bglu_dense -> 19447
dlsym_js: PyInit__lsap
dlsym_js: PyInit__lsap getting table slot for: function 26() { [native code] }
symbol already exists in table: PyInit__lsap
dlsym_js: PyInit__lsap -> 19460
dlsym_js: PyInit__pava_pybind
dlsym_js: PyInit__pava_pybind getting table slot for: function 144() { [native code] }
symbol already exists in table: PyInit__pava_pybind
dlsym_js: PyInit__pava_pybind -> 19540
dlsym_js: PyInit__direct
dlsym_js: PyInit__direct getting table slot for: function 33() { [native code] }
symbol already exists in table: PyInit__direct
dlsym_js: PyInit__direct -> 19449
dlsym_js: PyInit__odepack
dlsym_js: PyInit__odepack getting table slot for: function 44() { [native code] }
symbol already exists in table: PyInit__odepack
dlsym_js: PyInit__odepack -> 15930
dlsym_js: PyInit__quadpack
dlsym_js: PyInit__quadpack getting table slot for: function 48() { [native code] }
symbol already exists in table: PyInit__quadpack
dlsym_js: PyInit__quadpack -> 15941
dlsym_js: PyInit__vode
dlsym_js: PyInit__vode getting table slot for: function 86() { [native code] }
symbol already exists in table: PyInit__vode
dlsym_js: PyInit__vode -> 15964
dlsym_js: PyInit__dop
dlsym_js: PyInit__dop getting table slot for: function 71() { [native code] }
symbol already exists in table: PyInit__dop
dlsym_js: PyInit__dop -> 15909
dlsym_js: PyInit__lsoda
dlsym_js: PyInit__lsoda getting table slot for: function 76() { [native code] }
symbol already exists in table: PyInit__lsoda
dlsym_js: PyInit__lsoda -> 15923
dlsym_js: PyInit__fitpack
dlsym_js: PyInit__fitpack getting table slot for: function 26() { [native code] }
symbol already exists in table: PyInit__fitpack
dlsym_js: PyInit__fitpack -> 16025
dlsym_js: PyInit__dfitpack
dlsym_js: PyInit__dfitpack getting table slot for: function 72() { [native code] }
symbol already exists in table: PyInit__dfitpack
dlsym_js: PyInit__dfitpack -> 16003
dlopenInternal: /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so
loadDynamicLibrary: /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so handle: 81710104
existing: [
  '__main__',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_cyutility.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/_ccallback_c.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/_fpumode.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/_test_ccallback.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/_test_deprecation_call.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/_test_deprecation_def.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/_lib/messagestream.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/cluster/_hierarchy.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/cluster/_optimal_leaf_ordering.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/cluster/_vq.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/fftpack/convolve.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_dop.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/.libs/lib/libopenblas.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_lsoda.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_odepack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_quadpack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_test_multivariate.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/integrate/_vode.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dfitpack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so',
  'libopenblas.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_fitpack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_interpnd.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_ppoly.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_rbfinterp_pythran.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_rgi_cython.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_cythonized_array_utils.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_decomp_interpolative.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_decomp_lu_cython.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_decomp_update.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_fblas.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_flapack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_linalg_pythran.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_matfuncs_expm.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_matfuncs_schur_sqrtm.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_matfuncs_sqrtm_triu.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/_solve_toeplitz.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/cython_blas.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/linalg/cython_lapack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/ndimage/_ctest.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/ndimage/_cytest.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/ndimage/_nd_image.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/ndimage/_ni_label.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/ndimage/_rank_filter_1d.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/odr/__odrpack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_bglu_dense.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_direct.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_group_columns.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_lbfgsb.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_lsap.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_minpack.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_moduleTNC.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_pava_pybind.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_slsqplib.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/optimize/_zeros.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_max_len_seq_inner.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_peak_finding_utils.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_sigtools.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_sosfilt.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_spline.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/signal/_upfirdn_apply.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/_csparsetools.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/_sparsetools.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_ckdtree.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_distance_pybind.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_distance_wrap.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_hausdorff.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_qhull.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/_voronoi.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_comb.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_ellip_harm_2.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_gufuncs.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_specfun.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_special_ufuncs.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_test_internal.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_ufuncs.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/_ufuncs_cxx.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/special/cython_special.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_ansari_swilk_statistics.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_biasedurn.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_qmc_cy.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_qmvnt_cy.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_sobol.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_stats.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_stats_pythran.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_levy_stable/levyst.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_rcont/rcont.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/stats/_unuran/unuran_wrapper.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/transform/_rigid_transform.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/spatial/transform/_rotation.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_flow.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_matching.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_min_spanning_tree.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_reordering.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_shortest_path.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_tools.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/csgraph/_traversal.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/linalg/_dsolve/_superlu.cpython-313-wasm32-emscripten.so',
  '/Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/sparse/linalg/_propack/_cpropack.cpython-313-wasm32-emscripten.so',
  ... 28 more items
]
dlsym_js: PyInit__dierckx
dlSetError: Tried to lookup unknown symbol "PyInit__dierckx" in dynamic lib: /Users/agriyakhetarpal/Desktop/pyodide-recipes/packages/scipy/.venv-pyodide/lib/python3.13/site-packages/scipy/interpolate/_dierckx.cpython-313-wasm32-emscripten.so

When I check the output from wasm-objdump, I see that the symbol PyInit__dierckx definitely exists in /_dierckx.cpython-313-wasm32-emscripten.so and is exported by it as well. I checked for dlartg_, and it imports it as expected: - func[35] sig=8 <env.dlartg_> <- env.dlartg_. libopenblas.so exports dlartg_ as well.

I'm going to try with a slightly older xbuildenv from May and see if something turns up, or if we will have the same issue. Older xbuildenvs have NumPy 2.0.2 which fails to compile with newer AppleClang, never mind. Trying with 20250601 🤞🏻

Update: 20250601 has the same issue, unfortunately.

@agriyakhetarpal
Copy link
Member Author

In the meantime, I pushed a commit to build from 20250703-debug so that we can both have artifacts to examine.

@agriyakhetarpal
Copy link
Member Author

agriyakhetarpal commented Jul 3, 2025

Also, may I ask how you are testing SciPy in your browser? When I copy the Pyodide runtime using the provided script and copy the OpenBLAS libs and other libs from the .libs/ directory into dist/, and run Pyodide through a basic test.html file in the dist/ directory, it complains about not being able to find the OpenBLAS lib in the directory. Subsequently, it fails to load the _dop module (much earlier than attempting to load _dierckx). I'm sure that I'm doing something wrong there!

@ryanking13
Copy link
Member

ryanking13 commented Jul 3, 2025

Also, may I ask how you are testing SciPy in your browser? When I copy the Pyodide runtime using the provided script and copy the OpenBLAS libs and other libs from the .libs/ directory into dist/, and run Pyodide through a basic test.html file in the dist/ directory, it complains about not being able to find the OpenBLAS lib in the directory. Subsequently, it fails to load the _dop module (much earlier than attempting to load _dierckx). I'm sure that I'm doing something wrong there!

For pyodide venv I think it is because the nightly buildenv does not have corresponding packages in the CDN. When running Pyodide in node, we dynamically download the package from the CDN (1, 2) when the package is not available in the filesystem using the version number in the Pyodide runtime, but for nightly buildenv, the version number would be something like 0.28.0dev0 so it probably fails to download packages like openblas.

If you are using the browser, copying the pyodide runtime to the dist directory containing the packages, and running the server in that directory will work (similar to how we do in our CI)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
scipy This label is used to run the full SciPy test suite for any pull requests to which it is applied
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants