scipy 1.16.1__cp314-cp314-macosx_10_14_x86_64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy/.dylibs/libgcc_s.1.1.dylib +0 -0
- scipy/.dylibs/libgfortran.5.dylib +0 -0
- scipy/.dylibs/libquadmath.0.dylib +0 -0
- scipy/.dylibs/libscipy_openblas.dylib +0 -0
- scipy/__config__.py +161 -0
- scipy/__init__.py +138 -0
- scipy/_cyutility.cpython-314-darwin.so +0 -0
- scipy/_distributor_init.py +18 -0
- scipy/_lib/__init__.py +14 -0
- scipy/_lib/_array_api.py +931 -0
- scipy/_lib/_array_api_compat_vendor.py +9 -0
- scipy/_lib/_array_api_no_0d.py +103 -0
- scipy/_lib/_bunch.py +229 -0
- scipy/_lib/_ccallback.py +251 -0
- scipy/_lib/_ccallback_c.cpython-314-darwin.so +0 -0
- scipy/_lib/_disjoint_set.py +254 -0
- scipy/_lib/_docscrape.py +761 -0
- scipy/_lib/_elementwise_iterative_method.py +346 -0
- scipy/_lib/_fpumode.cpython-314-darwin.so +0 -0
- scipy/_lib/_gcutils.py +105 -0
- scipy/_lib/_pep440.py +487 -0
- scipy/_lib/_sparse.py +41 -0
- scipy/_lib/_test_ccallback.cpython-314-darwin.so +0 -0
- scipy/_lib/_test_deprecation_call.cpython-314-darwin.so +0 -0
- scipy/_lib/_test_deprecation_def.cpython-314-darwin.so +0 -0
- scipy/_lib/_testutils.py +373 -0
- scipy/_lib/_threadsafety.py +58 -0
- scipy/_lib/_tmpdirs.py +86 -0
- scipy/_lib/_uarray/LICENSE +29 -0
- scipy/_lib/_uarray/__init__.py +116 -0
- scipy/_lib/_uarray/_backend.py +707 -0
- scipy/_lib/_uarray/_uarray.cpython-314-darwin.so +0 -0
- scipy/_lib/_util.py +1283 -0
- scipy/_lib/array_api_compat/__init__.py +22 -0
- scipy/_lib/array_api_compat/_internal.py +59 -0
- scipy/_lib/array_api_compat/common/__init__.py +1 -0
- scipy/_lib/array_api_compat/common/_aliases.py +727 -0
- scipy/_lib/array_api_compat/common/_fft.py +213 -0
- scipy/_lib/array_api_compat/common/_helpers.py +1058 -0
- scipy/_lib/array_api_compat/common/_linalg.py +232 -0
- scipy/_lib/array_api_compat/common/_typing.py +192 -0
- scipy/_lib/array_api_compat/cupy/__init__.py +13 -0
- scipy/_lib/array_api_compat/cupy/_aliases.py +156 -0
- scipy/_lib/array_api_compat/cupy/_info.py +336 -0
- scipy/_lib/array_api_compat/cupy/_typing.py +31 -0
- scipy/_lib/array_api_compat/cupy/fft.py +36 -0
- scipy/_lib/array_api_compat/cupy/linalg.py +49 -0
- scipy/_lib/array_api_compat/dask/__init__.py +0 -0
- scipy/_lib/array_api_compat/dask/array/__init__.py +12 -0
- scipy/_lib/array_api_compat/dask/array/_aliases.py +376 -0
- scipy/_lib/array_api_compat/dask/array/_info.py +416 -0
- scipy/_lib/array_api_compat/dask/array/fft.py +21 -0
- scipy/_lib/array_api_compat/dask/array/linalg.py +72 -0
- scipy/_lib/array_api_compat/numpy/__init__.py +28 -0
- scipy/_lib/array_api_compat/numpy/_aliases.py +190 -0
- scipy/_lib/array_api_compat/numpy/_info.py +366 -0
- scipy/_lib/array_api_compat/numpy/_typing.py +30 -0
- scipy/_lib/array_api_compat/numpy/fft.py +35 -0
- scipy/_lib/array_api_compat/numpy/linalg.py +143 -0
- scipy/_lib/array_api_compat/torch/__init__.py +22 -0
- scipy/_lib/array_api_compat/torch/_aliases.py +855 -0
- scipy/_lib/array_api_compat/torch/_info.py +369 -0
- scipy/_lib/array_api_compat/torch/_typing.py +3 -0
- scipy/_lib/array_api_compat/torch/fft.py +85 -0
- scipy/_lib/array_api_compat/torch/linalg.py +121 -0
- scipy/_lib/array_api_extra/__init__.py +38 -0
- scipy/_lib/array_api_extra/_delegation.py +171 -0
- scipy/_lib/array_api_extra/_lib/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_at.py +463 -0
- scipy/_lib/array_api_extra/_lib/_backends.py +46 -0
- scipy/_lib/array_api_extra/_lib/_funcs.py +937 -0
- scipy/_lib/array_api_extra/_lib/_lazy.py +357 -0
- scipy/_lib/array_api_extra/_lib/_testing.py +278 -0
- scipy/_lib/array_api_extra/_lib/_utils/__init__.py +1 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.py +74 -0
- scipy/_lib/array_api_extra/_lib/_utils/_compat.pyi +45 -0
- scipy/_lib/array_api_extra/_lib/_utils/_helpers.py +559 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.py +10 -0
- scipy/_lib/array_api_extra/_lib/_utils/_typing.pyi +105 -0
- scipy/_lib/array_api_extra/testing.py +359 -0
- scipy/_lib/cobyqa/__init__.py +20 -0
- scipy/_lib/cobyqa/framework.py +1240 -0
- scipy/_lib/cobyqa/main.py +1506 -0
- scipy/_lib/cobyqa/models.py +1529 -0
- scipy/_lib/cobyqa/problem.py +1296 -0
- scipy/_lib/cobyqa/settings.py +132 -0
- scipy/_lib/cobyqa/subsolvers/__init__.py +14 -0
- scipy/_lib/cobyqa/subsolvers/geometry.py +387 -0
- scipy/_lib/cobyqa/subsolvers/optim.py +1203 -0
- scipy/_lib/cobyqa/utils/__init__.py +18 -0
- scipy/_lib/cobyqa/utils/exceptions.py +22 -0
- scipy/_lib/cobyqa/utils/math.py +77 -0
- scipy/_lib/cobyqa/utils/versions.py +67 -0
- scipy/_lib/decorator.py +399 -0
- scipy/_lib/deprecation.py +274 -0
- scipy/_lib/doccer.py +366 -0
- scipy/_lib/messagestream.cpython-314-darwin.so +0 -0
- scipy/_lib/pyprima/__init__.py +212 -0
- scipy/_lib/pyprima/cobyla/__init__.py +0 -0
- scipy/_lib/pyprima/cobyla/cobyla.py +559 -0
- scipy/_lib/pyprima/cobyla/cobylb.py +714 -0
- scipy/_lib/pyprima/cobyla/geometry.py +226 -0
- scipy/_lib/pyprima/cobyla/initialize.py +215 -0
- scipy/_lib/pyprima/cobyla/trustregion.py +492 -0
- scipy/_lib/pyprima/cobyla/update.py +289 -0
- scipy/_lib/pyprima/common/__init__.py +0 -0
- scipy/_lib/pyprima/common/_bounds.py +34 -0
- scipy/_lib/pyprima/common/_linear_constraints.py +46 -0
- scipy/_lib/pyprima/common/_nonlinear_constraints.py +54 -0
- scipy/_lib/pyprima/common/_project.py +173 -0
- scipy/_lib/pyprima/common/checkbreak.py +93 -0
- scipy/_lib/pyprima/common/consts.py +47 -0
- scipy/_lib/pyprima/common/evaluate.py +99 -0
- scipy/_lib/pyprima/common/history.py +38 -0
- scipy/_lib/pyprima/common/infos.py +30 -0
- scipy/_lib/pyprima/common/linalg.py +435 -0
- scipy/_lib/pyprima/common/message.py +290 -0
- scipy/_lib/pyprima/common/powalg.py +131 -0
- scipy/_lib/pyprima/common/preproc.py +277 -0
- scipy/_lib/pyprima/common/present.py +5 -0
- scipy/_lib/pyprima/common/ratio.py +54 -0
- scipy/_lib/pyprima/common/redrho.py +47 -0
- scipy/_lib/pyprima/common/selectx.py +296 -0
- scipy/_lib/tests/__init__.py +0 -0
- scipy/_lib/tests/test__gcutils.py +110 -0
- scipy/_lib/tests/test__pep440.py +67 -0
- scipy/_lib/tests/test__testutils.py +32 -0
- scipy/_lib/tests/test__threadsafety.py +51 -0
- scipy/_lib/tests/test__util.py +641 -0
- scipy/_lib/tests/test_array_api.py +322 -0
- scipy/_lib/tests/test_bunch.py +169 -0
- scipy/_lib/tests/test_ccallback.py +196 -0
- scipy/_lib/tests/test_config.py +45 -0
- scipy/_lib/tests/test_deprecation.py +10 -0
- scipy/_lib/tests/test_doccer.py +143 -0
- scipy/_lib/tests/test_import_cycles.py +18 -0
- scipy/_lib/tests/test_public_api.py +482 -0
- scipy/_lib/tests/test_scipy_version.py +28 -0
- scipy/_lib/tests/test_tmpdirs.py +48 -0
- scipy/_lib/tests/test_warnings.py +137 -0
- scipy/_lib/uarray.py +31 -0
- scipy/cluster/__init__.py +31 -0
- scipy/cluster/_hierarchy.cpython-314-darwin.so +0 -0
- scipy/cluster/_optimal_leaf_ordering.cpython-314-darwin.so +0 -0
- scipy/cluster/_vq.cpython-314-darwin.so +0 -0
- scipy/cluster/hierarchy.py +4348 -0
- scipy/cluster/tests/__init__.py +0 -0
- scipy/cluster/tests/hierarchy_test_data.py +145 -0
- scipy/cluster/tests/test_disjoint_set.py +202 -0
- scipy/cluster/tests/test_hierarchy.py +1238 -0
- scipy/cluster/tests/test_vq.py +434 -0
- scipy/cluster/vq.py +832 -0
- scipy/conftest.py +683 -0
- scipy/constants/__init__.py +358 -0
- scipy/constants/_codata.py +2266 -0
- scipy/constants/_constants.py +369 -0
- scipy/constants/codata.py +21 -0
- scipy/constants/constants.py +53 -0
- scipy/constants/tests/__init__.py +0 -0
- scipy/constants/tests/test_codata.py +78 -0
- scipy/constants/tests/test_constants.py +83 -0
- scipy/datasets/__init__.py +90 -0
- scipy/datasets/_download_all.py +71 -0
- scipy/datasets/_fetchers.py +225 -0
- scipy/datasets/_registry.py +26 -0
- scipy/datasets/_utils.py +81 -0
- scipy/datasets/tests/__init__.py +0 -0
- scipy/datasets/tests/test_data.py +128 -0
- scipy/differentiate/__init__.py +27 -0
- scipy/differentiate/_differentiate.py +1129 -0
- scipy/differentiate/tests/__init__.py +0 -0
- scipy/differentiate/tests/test_differentiate.py +694 -0
- scipy/fft/__init__.py +114 -0
- scipy/fft/_backend.py +196 -0
- scipy/fft/_basic.py +1650 -0
- scipy/fft/_basic_backend.py +197 -0
- scipy/fft/_debug_backends.py +22 -0
- scipy/fft/_fftlog.py +223 -0
- scipy/fft/_fftlog_backend.py +200 -0
- scipy/fft/_helper.py +348 -0
- scipy/fft/_pocketfft/LICENSE.md +25 -0
- scipy/fft/_pocketfft/__init__.py +9 -0
- scipy/fft/_pocketfft/basic.py +251 -0
- scipy/fft/_pocketfft/helper.py +249 -0
- scipy/fft/_pocketfft/pypocketfft.cpython-314-darwin.so +0 -0
- scipy/fft/_pocketfft/realtransforms.py +109 -0
- scipy/fft/_pocketfft/tests/__init__.py +0 -0
- scipy/fft/_pocketfft/tests/test_basic.py +1011 -0
- scipy/fft/_pocketfft/tests/test_real_transforms.py +505 -0
- scipy/fft/_realtransforms.py +706 -0
- scipy/fft/_realtransforms_backend.py +63 -0
- scipy/fft/tests/__init__.py +0 -0
- scipy/fft/tests/mock_backend.py +96 -0
- scipy/fft/tests/test_backend.py +98 -0
- scipy/fft/tests/test_basic.py +504 -0
- scipy/fft/tests/test_fftlog.py +215 -0
- scipy/fft/tests/test_helper.py +558 -0
- scipy/fft/tests/test_multithreading.py +84 -0
- scipy/fft/tests/test_real_transforms.py +247 -0
- scipy/fftpack/__init__.py +103 -0
- scipy/fftpack/_basic.py +428 -0
- scipy/fftpack/_helper.py +115 -0
- scipy/fftpack/_pseudo_diffs.py +554 -0
- scipy/fftpack/_realtransforms.py +598 -0
- scipy/fftpack/basic.py +20 -0
- scipy/fftpack/convolve.cpython-314-darwin.so +0 -0
- scipy/fftpack/helper.py +19 -0
- scipy/fftpack/pseudo_diffs.py +22 -0
- scipy/fftpack/realtransforms.py +19 -0
- scipy/fftpack/tests/__init__.py +0 -0
- scipy/fftpack/tests/fftw_double_ref.npz +0 -0
- scipy/fftpack/tests/fftw_longdouble_ref.npz +0 -0
- scipy/fftpack/tests/fftw_single_ref.npz +0 -0
- scipy/fftpack/tests/test.npz +0 -0
- scipy/fftpack/tests/test_basic.py +877 -0
- scipy/fftpack/tests/test_helper.py +54 -0
- scipy/fftpack/tests/test_import.py +33 -0
- scipy/fftpack/tests/test_pseudo_diffs.py +388 -0
- scipy/fftpack/tests/test_real_transforms.py +836 -0
- scipy/integrate/__init__.py +122 -0
- scipy/integrate/_bvp.py +1160 -0
- scipy/integrate/_cubature.py +729 -0
- scipy/integrate/_dop.cpython-314-darwin.so +0 -0
- scipy/integrate/_ivp/__init__.py +8 -0
- scipy/integrate/_ivp/base.py +290 -0
- scipy/integrate/_ivp/bdf.py +478 -0
- scipy/integrate/_ivp/common.py +451 -0
- scipy/integrate/_ivp/dop853_coefficients.py +193 -0
- scipy/integrate/_ivp/ivp.py +755 -0
- scipy/integrate/_ivp/lsoda.py +224 -0
- scipy/integrate/_ivp/radau.py +572 -0
- scipy/integrate/_ivp/rk.py +601 -0
- scipy/integrate/_ivp/tests/__init__.py +0 -0
- scipy/integrate/_ivp/tests/test_ivp.py +1287 -0
- scipy/integrate/_ivp/tests/test_rk.py +37 -0
- scipy/integrate/_lebedev.py +5450 -0
- scipy/integrate/_lsoda.cpython-314-darwin.so +0 -0
- scipy/integrate/_ode.py +1395 -0
- scipy/integrate/_odepack.cpython-314-darwin.so +0 -0
- scipy/integrate/_odepack_py.py +273 -0
- scipy/integrate/_quad_vec.py +674 -0
- scipy/integrate/_quadpack.cpython-314-darwin.so +0 -0
- scipy/integrate/_quadpack_py.py +1283 -0
- scipy/integrate/_quadrature.py +1336 -0
- scipy/integrate/_rules/__init__.py +12 -0
- scipy/integrate/_rules/_base.py +518 -0
- scipy/integrate/_rules/_gauss_kronrod.py +202 -0
- scipy/integrate/_rules/_gauss_legendre.py +62 -0
- scipy/integrate/_rules/_genz_malik.py +210 -0
- scipy/integrate/_tanhsinh.py +1385 -0
- scipy/integrate/_test_multivariate.cpython-314-darwin.so +0 -0
- scipy/integrate/_test_odeint_banded.cpython-314-darwin.so +0 -0
- scipy/integrate/_vode.cpython-314-darwin.so +0 -0
- scipy/integrate/dop.py +15 -0
- scipy/integrate/lsoda.py +15 -0
- scipy/integrate/odepack.py +17 -0
- scipy/integrate/quadpack.py +23 -0
- scipy/integrate/tests/__init__.py +0 -0
- scipy/integrate/tests/test__quad_vec.py +211 -0
- scipy/integrate/tests/test_banded_ode_solvers.py +305 -0
- scipy/integrate/tests/test_bvp.py +714 -0
- scipy/integrate/tests/test_cubature.py +1375 -0
- scipy/integrate/tests/test_integrate.py +840 -0
- scipy/integrate/tests/test_odeint_jac.py +74 -0
- scipy/integrate/tests/test_quadpack.py +680 -0
- scipy/integrate/tests/test_quadrature.py +730 -0
- scipy/integrate/tests/test_tanhsinh.py +1171 -0
- scipy/integrate/vode.py +15 -0
- scipy/interpolate/__init__.py +228 -0
- scipy/interpolate/_bary_rational.py +715 -0
- scipy/interpolate/_bsplines.py +2469 -0
- scipy/interpolate/_cubic.py +973 -0
- scipy/interpolate/_dfitpack.cpython-314-darwin.so +0 -0
- scipy/interpolate/_dierckx.cpython-314-darwin.so +0 -0
- scipy/interpolate/_fitpack.cpython-314-darwin.so +0 -0
- scipy/interpolate/_fitpack2.py +2397 -0
- scipy/interpolate/_fitpack_impl.py +811 -0
- scipy/interpolate/_fitpack_py.py +898 -0
- scipy/interpolate/_fitpack_repro.py +996 -0
- scipy/interpolate/_interpnd.cpython-314-darwin.so +0 -0
- scipy/interpolate/_interpolate.py +2266 -0
- scipy/interpolate/_ndbspline.py +415 -0
- scipy/interpolate/_ndgriddata.py +329 -0
- scipy/interpolate/_pade.py +67 -0
- scipy/interpolate/_polyint.py +1025 -0
- scipy/interpolate/_ppoly.cpython-314-darwin.so +0 -0
- scipy/interpolate/_rbf.py +290 -0
- scipy/interpolate/_rbfinterp.py +550 -0
- scipy/interpolate/_rbfinterp_pythran.cpython-314-darwin.so +0 -0
- scipy/interpolate/_rgi.py +764 -0
- scipy/interpolate/_rgi_cython.cpython-314-darwin.so +0 -0
- scipy/interpolate/dfitpack.py +24 -0
- scipy/interpolate/fitpack.py +31 -0
- scipy/interpolate/fitpack2.py +29 -0
- scipy/interpolate/interpnd.py +24 -0
- scipy/interpolate/interpolate.py +30 -0
- scipy/interpolate/ndgriddata.py +23 -0
- scipy/interpolate/polyint.py +24 -0
- scipy/interpolate/rbf.py +18 -0
- scipy/interpolate/tests/__init__.py +0 -0
- scipy/interpolate/tests/data/bug-1310.npz +0 -0
- scipy/interpolate/tests/data/estimate_gradients_hang.npy +0 -0
- scipy/interpolate/tests/data/gcvspl.npz +0 -0
- scipy/interpolate/tests/test_bary_rational.py +368 -0
- scipy/interpolate/tests/test_bsplines.py +3754 -0
- scipy/interpolate/tests/test_fitpack.py +519 -0
- scipy/interpolate/tests/test_fitpack2.py +1431 -0
- scipy/interpolate/tests/test_gil.py +64 -0
- scipy/interpolate/tests/test_interpnd.py +452 -0
- scipy/interpolate/tests/test_interpolate.py +2630 -0
- scipy/interpolate/tests/test_ndgriddata.py +308 -0
- scipy/interpolate/tests/test_pade.py +107 -0
- scipy/interpolate/tests/test_polyint.py +972 -0
- scipy/interpolate/tests/test_rbf.py +246 -0
- scipy/interpolate/tests/test_rbfinterp.py +534 -0
- scipy/interpolate/tests/test_rgi.py +1151 -0
- scipy/io/__init__.py +116 -0
- scipy/io/_fast_matrix_market/__init__.py +600 -0
- scipy/io/_fast_matrix_market/_fmm_core.cpython-314-darwin.so +0 -0
- scipy/io/_fortran.py +354 -0
- scipy/io/_harwell_boeing/__init__.py +7 -0
- scipy/io/_harwell_boeing/_fortran_format_parser.py +316 -0
- scipy/io/_harwell_boeing/hb.py +571 -0
- scipy/io/_harwell_boeing/tests/__init__.py +0 -0
- scipy/io/_harwell_boeing/tests/test_fortran_format.py +74 -0
- scipy/io/_harwell_boeing/tests/test_hb.py +70 -0
- scipy/io/_idl.py +917 -0
- scipy/io/_mmio.py +968 -0
- scipy/io/_netcdf.py +1104 -0
- scipy/io/_test_fortran.cpython-314-darwin.so +0 -0
- scipy/io/arff/__init__.py +28 -0
- scipy/io/arff/_arffread.py +873 -0
- scipy/io/arff/arffread.py +19 -0
- scipy/io/arff/tests/__init__.py +0 -0
- scipy/io/arff/tests/data/iris.arff +225 -0
- scipy/io/arff/tests/data/missing.arff +8 -0
- scipy/io/arff/tests/data/nodata.arff +11 -0
- scipy/io/arff/tests/data/quoted_nominal.arff +13 -0
- scipy/io/arff/tests/data/quoted_nominal_spaces.arff +13 -0
- scipy/io/arff/tests/data/test1.arff +10 -0
- scipy/io/arff/tests/data/test10.arff +8 -0
- scipy/io/arff/tests/data/test11.arff +11 -0
- scipy/io/arff/tests/data/test2.arff +15 -0
- scipy/io/arff/tests/data/test3.arff +6 -0
- scipy/io/arff/tests/data/test4.arff +11 -0
- scipy/io/arff/tests/data/test5.arff +26 -0
- scipy/io/arff/tests/data/test6.arff +12 -0
- scipy/io/arff/tests/data/test7.arff +15 -0
- scipy/io/arff/tests/data/test8.arff +12 -0
- scipy/io/arff/tests/data/test9.arff +14 -0
- scipy/io/arff/tests/test_arffread.py +421 -0
- scipy/io/harwell_boeing.py +17 -0
- scipy/io/idl.py +17 -0
- scipy/io/matlab/__init__.py +66 -0
- scipy/io/matlab/_byteordercodes.py +75 -0
- scipy/io/matlab/_mio.py +375 -0
- scipy/io/matlab/_mio4.py +632 -0
- scipy/io/matlab/_mio5.py +901 -0
- scipy/io/matlab/_mio5_params.py +281 -0
- scipy/io/matlab/_mio5_utils.cpython-314-darwin.so +0 -0
- scipy/io/matlab/_mio_utils.cpython-314-darwin.so +0 -0
- scipy/io/matlab/_miobase.py +435 -0
- scipy/io/matlab/_streams.cpython-314-darwin.so +0 -0
- scipy/io/matlab/byteordercodes.py +17 -0
- scipy/io/matlab/mio.py +16 -0
- scipy/io/matlab/mio4.py +17 -0
- scipy/io/matlab/mio5.py +19 -0
- scipy/io/matlab/mio5_params.py +18 -0
- scipy/io/matlab/mio5_utils.py +17 -0
- scipy/io/matlab/mio_utils.py +17 -0
- scipy/io/matlab/miobase.py +16 -0
- scipy/io/matlab/streams.py +16 -0
- scipy/io/matlab/tests/__init__.py +0 -0
- scipy/io/matlab/tests/data/bad_miuint32.mat +0 -0
- scipy/io/matlab/tests/data/bad_miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/big_endian.mat +0 -0
- scipy/io/matlab/tests/data/broken_utf8.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_checksum.mat +0 -0
- scipy/io/matlab/tests/data/corrupted_zlib_data.mat +0 -0
- scipy/io/matlab/tests/data/debigged_m4.mat +0 -0
- scipy/io/matlab/tests/data/japanese_utf8.txt +5 -0
- scipy/io/matlab/tests/data/little_endian.mat +0 -0
- scipy/io/matlab/tests/data/logical_sparse.mat +0 -0
- scipy/io/matlab/tests/data/malformed1.mat +0 -0
- scipy/io/matlab/tests/data/miuint32_for_miint32.mat +0 -0
- scipy/io/matlab/tests/data/miutf8_array_name.mat +0 -0
- scipy/io/matlab/tests/data/nasty_duplicate_fieldnames.mat +0 -0
- scipy/io/matlab/tests/data/one_by_zero_char.mat +0 -0
- scipy/io/matlab/tests/data/parabola.mat +0 -0
- scipy/io/matlab/tests/data/single_empty_string.mat +0 -0
- scipy/io/matlab/tests/data/some_functions.mat +0 -0
- scipy/io/matlab/tests/data/sqr.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test3dmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/test_empty_struct.mat +0 -0
- scipy/io/matlab/tests/data/test_mat4_le_floats.mat +0 -0
- scipy/io/matlab/tests/data/test_skip_variable.mat +0 -0
- scipy/io/matlab/tests/data/testbool_8_WIN64.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcellnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testcomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testdouble_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_5.3_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testemptycell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testfunc_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testhdf5_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmatrix_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testminus_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testminus_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testmulti_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testobject_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testobject_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testonechar_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testscalarcell_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsimplecell.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparse_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsecomplex_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testsparsefloat_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststring_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststring_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_4.2c_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststringarray_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststruct_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructarr_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.1_SOL2.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_6.5.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/teststructnest_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.1_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testunicode_7.4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/data/testvec_4_GLNX86.mat +0 -0
- scipy/io/matlab/tests/test_byteordercodes.py +29 -0
- scipy/io/matlab/tests/test_mio.py +1399 -0
- scipy/io/matlab/tests/test_mio5_utils.py +179 -0
- scipy/io/matlab/tests/test_mio_funcs.py +51 -0
- scipy/io/matlab/tests/test_mio_utils.py +45 -0
- scipy/io/matlab/tests/test_miobase.py +32 -0
- scipy/io/matlab/tests/test_pathological.py +33 -0
- scipy/io/matlab/tests/test_streams.py +241 -0
- scipy/io/mmio.py +17 -0
- scipy/io/netcdf.py +17 -0
- scipy/io/tests/__init__.py +0 -0
- scipy/io/tests/data/Transparent Busy.ani +0 -0
- scipy/io/tests/data/array_float32_1d.sav +0 -0
- scipy/io/tests/data/array_float32_2d.sav +0 -0
- scipy/io/tests/data/array_float32_3d.sav +0 -0
- scipy/io/tests/data/array_float32_4d.sav +0 -0
- scipy/io/tests/data/array_float32_5d.sav +0 -0
- scipy/io/tests/data/array_float32_6d.sav +0 -0
- scipy/io/tests/data/array_float32_7d.sav +0 -0
- scipy/io/tests/data/array_float32_8d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_1d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_2d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_3d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_4d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_5d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_6d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_7d.sav +0 -0
- scipy/io/tests/data/array_float32_pointer_8d.sav +0 -0
- scipy/io/tests/data/example_1.nc +0 -0
- scipy/io/tests/data/example_2.nc +0 -0
- scipy/io/tests/data/example_3_maskedvals.nc +0 -0
- scipy/io/tests/data/fortran-3x3d-2i.dat +0 -0
- scipy/io/tests/data/fortran-mixed.dat +0 -0
- scipy/io/tests/data/fortran-sf8-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-sf8-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-sf8-1x3x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-11x1x10.dat +0 -0
- scipy/io/tests/data/fortran-si4-15x10x22.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x1.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x5.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x1x7.dat +0 -0
- scipy/io/tests/data/fortran-si4-1x3x5.dat +0 -0
- scipy/io/tests/data/invalid_pointer.sav +0 -0
- scipy/io/tests/data/null_pointer.sav +0 -0
- scipy/io/tests/data/scalar_byte.sav +0 -0
- scipy/io/tests/data/scalar_byte_descr.sav +0 -0
- scipy/io/tests/data/scalar_complex32.sav +0 -0
- scipy/io/tests/data/scalar_complex64.sav +0 -0
- scipy/io/tests/data/scalar_float32.sav +0 -0
- scipy/io/tests/data/scalar_float64.sav +0 -0
- scipy/io/tests/data/scalar_heap_pointer.sav +0 -0
- scipy/io/tests/data/scalar_int16.sav +0 -0
- scipy/io/tests/data/scalar_int32.sav +0 -0
- scipy/io/tests/data/scalar_int64.sav +0 -0
- scipy/io/tests/data/scalar_string.sav +0 -0
- scipy/io/tests/data/scalar_uint16.sav +0 -0
- scipy/io/tests/data/scalar_uint32.sav +0 -0
- scipy/io/tests/data/scalar_uint64.sav +0 -0
- scipy/io/tests/data/struct_arrays.sav +0 -0
- scipy/io/tests/data/struct_arrays_byte_idl80.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_inherit.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointer_arrays_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_pointers.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated.sav +0 -0
- scipy/io/tests/data/struct_pointers_replicated_3d.sav +0 -0
- scipy/io/tests/data/struct_scalars.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated.sav +0 -0
- scipy/io/tests/data/struct_scalars_replicated_3d.sav +0 -0
- scipy/io/tests/data/test-1234Hz-le-1ch-10S-20bit-extra.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-be.wav +0 -0
- scipy/io/tests/data/test-44100Hz-2ch-32bit-float-le.wav +0 -0
- scipy/io/tests/data/test-44100Hz-be-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof-no-data.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-early-eof.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-incomplete-chunk.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes-rf64.wav +0 -0
- scipy/io/tests/data/test-44100Hz-le-1ch-4bytes.wav +0 -0
- scipy/io/tests/data/test-48000Hz-2ch-64bit-float-le-wavex.wav +0 -0
- scipy/io/tests/data/test-8000Hz-be-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-1ch-1byte-ulaw.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-2ch-1byteu.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-inconsistent.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit-rf64.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-24bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-36bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-45bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-53bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-3ch-5S-64bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-4ch-9S-12bit.wav +0 -0
- scipy/io/tests/data/test-8000Hz-le-5ch-9S-5bit.wav +0 -0
- scipy/io/tests/data/various_compressed.sav +0 -0
- scipy/io/tests/test_fortran.py +264 -0
- scipy/io/tests/test_idl.py +483 -0
- scipy/io/tests/test_mmio.py +831 -0
- scipy/io/tests/test_netcdf.py +550 -0
- scipy/io/tests/test_paths.py +93 -0
- scipy/io/tests/test_wavfile.py +501 -0
- scipy/io/wavfile.py +938 -0
- scipy/linalg/__init__.pxd +1 -0
- scipy/linalg/__init__.py +236 -0
- scipy/linalg/_basic.py +2146 -0
- scipy/linalg/_blas_subroutines.h +164 -0
- scipy/linalg/_cythonized_array_utils.cpython-314-darwin.so +0 -0
- scipy/linalg/_cythonized_array_utils.pxd +40 -0
- scipy/linalg/_cythonized_array_utils.pyi +16 -0
- scipy/linalg/_decomp.py +1645 -0
- scipy/linalg/_decomp_cholesky.py +413 -0
- scipy/linalg/_decomp_cossin.py +236 -0
- scipy/linalg/_decomp_interpolative.cpython-314-darwin.so +0 -0
- scipy/linalg/_decomp_ldl.py +356 -0
- scipy/linalg/_decomp_lu.py +401 -0
- scipy/linalg/_decomp_lu_cython.cpython-314-darwin.so +0 -0
- scipy/linalg/_decomp_lu_cython.pyi +6 -0
- scipy/linalg/_decomp_polar.py +113 -0
- scipy/linalg/_decomp_qr.py +494 -0
- scipy/linalg/_decomp_qz.py +452 -0
- scipy/linalg/_decomp_schur.py +336 -0
- scipy/linalg/_decomp_svd.py +545 -0
- scipy/linalg/_decomp_update.cpython-314-darwin.so +0 -0
- scipy/linalg/_expm_frechet.py +417 -0
- scipy/linalg/_fblas.cpython-314-darwin.so +0 -0
- scipy/linalg/_flapack.cpython-314-darwin.so +0 -0
- scipy/linalg/_lapack_subroutines.h +1521 -0
- scipy/linalg/_linalg_pythran.cpython-314-darwin.so +0 -0
- scipy/linalg/_matfuncs.py +1050 -0
- scipy/linalg/_matfuncs_expm.cpython-314-darwin.so +0 -0
- scipy/linalg/_matfuncs_expm.pyi +6 -0
- scipy/linalg/_matfuncs_inv_ssq.py +886 -0
- scipy/linalg/_matfuncs_schur_sqrtm.cpython-314-darwin.so +0 -0
- scipy/linalg/_matfuncs_sqrtm.py +107 -0
- scipy/linalg/_matfuncs_sqrtm_triu.cpython-314-darwin.so +0 -0
- scipy/linalg/_misc.py +191 -0
- scipy/linalg/_procrustes.py +113 -0
- scipy/linalg/_sketches.py +189 -0
- scipy/linalg/_solve_toeplitz.cpython-314-darwin.so +0 -0
- scipy/linalg/_solvers.py +862 -0
- scipy/linalg/_special_matrices.py +1322 -0
- scipy/linalg/_testutils.py +65 -0
- scipy/linalg/basic.py +23 -0
- scipy/linalg/blas.py +495 -0
- scipy/linalg/cython_blas.cpython-314-darwin.so +0 -0
- scipy/linalg/cython_blas.pxd +169 -0
- scipy/linalg/cython_blas.pyx +1432 -0
- scipy/linalg/cython_lapack.cpython-314-darwin.so +0 -0
- scipy/linalg/cython_lapack.pxd +1528 -0
- scipy/linalg/cython_lapack.pyx +12045 -0
- scipy/linalg/decomp.py +23 -0
- scipy/linalg/decomp_cholesky.py +21 -0
- scipy/linalg/decomp_lu.py +21 -0
- scipy/linalg/decomp_qr.py +20 -0
- scipy/linalg/decomp_schur.py +21 -0
- scipy/linalg/decomp_svd.py +21 -0
- scipy/linalg/interpolative.py +989 -0
- scipy/linalg/lapack.py +1081 -0
- scipy/linalg/matfuncs.py +23 -0
- scipy/linalg/misc.py +21 -0
- scipy/linalg/special_matrices.py +22 -0
- scipy/linalg/tests/__init__.py +0 -0
- scipy/linalg/tests/_cython_examples/extending.pyx +23 -0
- scipy/linalg/tests/_cython_examples/meson.build +34 -0
- scipy/linalg/tests/data/carex_15_data.npz +0 -0
- scipy/linalg/tests/data/carex_18_data.npz +0 -0
- scipy/linalg/tests/data/carex_19_data.npz +0 -0
- scipy/linalg/tests/data/carex_20_data.npz +0 -0
- scipy/linalg/tests/data/carex_6_data.npz +0 -0
- scipy/linalg/tests/data/gendare_20170120_data.npz +0 -0
- scipy/linalg/tests/test_basic.py +2074 -0
- scipy/linalg/tests/test_batch.py +588 -0
- scipy/linalg/tests/test_blas.py +1127 -0
- scipy/linalg/tests/test_cython_blas.py +118 -0
- scipy/linalg/tests/test_cython_lapack.py +22 -0
- scipy/linalg/tests/test_cythonized_array_utils.py +130 -0
- scipy/linalg/tests/test_decomp.py +3189 -0
- scipy/linalg/tests/test_decomp_cholesky.py +268 -0
- scipy/linalg/tests/test_decomp_cossin.py +314 -0
- scipy/linalg/tests/test_decomp_ldl.py +137 -0
- scipy/linalg/tests/test_decomp_lu.py +308 -0
- scipy/linalg/tests/test_decomp_polar.py +110 -0
- scipy/linalg/tests/test_decomp_update.py +1701 -0
- scipy/linalg/tests/test_extending.py +46 -0
- scipy/linalg/tests/test_fblas.py +607 -0
- scipy/linalg/tests/test_interpolative.py +232 -0
- scipy/linalg/tests/test_lapack.py +3616 -0
- scipy/linalg/tests/test_matfuncs.py +1125 -0
- scipy/linalg/tests/test_matmul_toeplitz.py +136 -0
- scipy/linalg/tests/test_procrustes.py +214 -0
- scipy/linalg/tests/test_sketches.py +118 -0
- scipy/linalg/tests/test_solve_toeplitz.py +150 -0
- scipy/linalg/tests/test_solvers.py +844 -0
- scipy/linalg/tests/test_special_matrices.py +636 -0
- scipy/misc/__init__.py +6 -0
- scipy/misc/common.py +6 -0
- scipy/misc/doccer.py +6 -0
- scipy/ndimage/__init__.py +174 -0
- scipy/ndimage/_ctest.cpython-314-darwin.so +0 -0
- scipy/ndimage/_cytest.cpython-314-darwin.so +0 -0
- scipy/ndimage/_delegators.py +303 -0
- scipy/ndimage/_filters.py +2422 -0
- scipy/ndimage/_fourier.py +306 -0
- scipy/ndimage/_interpolation.py +1033 -0
- scipy/ndimage/_measurements.py +1689 -0
- scipy/ndimage/_morphology.py +2634 -0
- scipy/ndimage/_nd_image.cpython-314-darwin.so +0 -0
- scipy/ndimage/_ndimage_api.py +16 -0
- scipy/ndimage/_ni_docstrings.py +214 -0
- scipy/ndimage/_ni_label.cpython-314-darwin.so +0 -0
- scipy/ndimage/_ni_support.py +139 -0
- scipy/ndimage/_rank_filter_1d.cpython-314-darwin.so +0 -0
- scipy/ndimage/_support_alternative_backends.py +84 -0
- scipy/ndimage/filters.py +27 -0
- scipy/ndimage/fourier.py +21 -0
- scipy/ndimage/interpolation.py +22 -0
- scipy/ndimage/measurements.py +24 -0
- scipy/ndimage/morphology.py +27 -0
- scipy/ndimage/tests/__init__.py +12 -0
- scipy/ndimage/tests/data/label_inputs.txt +21 -0
- scipy/ndimage/tests/data/label_results.txt +294 -0
- scipy/ndimage/tests/data/label_strels.txt +42 -0
- scipy/ndimage/tests/dots.png +0 -0
- scipy/ndimage/tests/test_c_api.py +102 -0
- scipy/ndimage/tests/test_datatypes.py +67 -0
- scipy/ndimage/tests/test_filters.py +3083 -0
- scipy/ndimage/tests/test_fourier.py +187 -0
- scipy/ndimage/tests/test_interpolation.py +1491 -0
- scipy/ndimage/tests/test_measurements.py +1592 -0
- scipy/ndimage/tests/test_morphology.py +2950 -0
- scipy/ndimage/tests/test_ni_support.py +78 -0
- scipy/ndimage/tests/test_splines.py +70 -0
- scipy/odr/__init__.py +131 -0
- scipy/odr/__odrpack.cpython-314-darwin.so +0 -0
- scipy/odr/_add_newdocs.py +34 -0
- scipy/odr/_models.py +315 -0
- scipy/odr/_odrpack.py +1154 -0
- scipy/odr/models.py +20 -0
- scipy/odr/odrpack.py +21 -0
- scipy/odr/tests/__init__.py +0 -0
- scipy/odr/tests/test_odr.py +607 -0
- scipy/optimize/__init__.pxd +1 -0
- scipy/optimize/__init__.py +460 -0
- scipy/optimize/_basinhopping.py +741 -0
- scipy/optimize/_bglu_dense.cpython-314-darwin.so +0 -0
- scipy/optimize/_bracket.py +706 -0
- scipy/optimize/_chandrupatla.py +551 -0
- scipy/optimize/_cobyla_py.py +297 -0
- scipy/optimize/_cobyqa_py.py +72 -0
- scipy/optimize/_constraints.py +598 -0
- scipy/optimize/_dcsrch.py +728 -0
- scipy/optimize/_differentiable_functions.py +835 -0
- scipy/optimize/_differentialevolution.py +1970 -0
- scipy/optimize/_direct.cpython-314-darwin.so +0 -0
- scipy/optimize/_direct_py.py +280 -0
- scipy/optimize/_dual_annealing.py +732 -0
- scipy/optimize/_elementwise.py +798 -0
- scipy/optimize/_group_columns.cpython-314-darwin.so +0 -0
- scipy/optimize/_hessian_update_strategy.py +479 -0
- scipy/optimize/_highspy/__init__.py +0 -0
- scipy/optimize/_highspy/_core.cpython-314-darwin.so +0 -0
- scipy/optimize/_highspy/_highs_options.cpython-314-darwin.so +0 -0
- scipy/optimize/_highspy/_highs_wrapper.py +338 -0
- scipy/optimize/_isotonic.py +157 -0
- scipy/optimize/_lbfgsb.cpython-314-darwin.so +0 -0
- scipy/optimize/_lbfgsb_py.py +634 -0
- scipy/optimize/_linesearch.py +896 -0
- scipy/optimize/_linprog.py +733 -0
- scipy/optimize/_linprog_doc.py +1434 -0
- scipy/optimize/_linprog_highs.py +422 -0
- scipy/optimize/_linprog_ip.py +1141 -0
- scipy/optimize/_linprog_rs.py +572 -0
- scipy/optimize/_linprog_simplex.py +663 -0
- scipy/optimize/_linprog_util.py +1521 -0
- scipy/optimize/_lsap.cpython-314-darwin.so +0 -0
- scipy/optimize/_lsq/__init__.py +5 -0
- scipy/optimize/_lsq/bvls.py +183 -0
- scipy/optimize/_lsq/common.py +731 -0
- scipy/optimize/_lsq/dogbox.py +345 -0
- scipy/optimize/_lsq/givens_elimination.cpython-314-darwin.so +0 -0
- scipy/optimize/_lsq/least_squares.py +1044 -0
- scipy/optimize/_lsq/lsq_linear.py +361 -0
- scipy/optimize/_lsq/trf.py +587 -0
- scipy/optimize/_lsq/trf_linear.py +249 -0
- scipy/optimize/_milp.py +394 -0
- scipy/optimize/_minimize.py +1199 -0
- scipy/optimize/_minpack.cpython-314-darwin.so +0 -0
- scipy/optimize/_minpack_py.py +1178 -0
- scipy/optimize/_moduleTNC.cpython-314-darwin.so +0 -0
- scipy/optimize/_nnls.py +96 -0
- scipy/optimize/_nonlin.py +1634 -0
- scipy/optimize/_numdiff.py +963 -0
- scipy/optimize/_optimize.py +4169 -0
- scipy/optimize/_pava_pybind.cpython-314-darwin.so +0 -0
- scipy/optimize/_qap.py +760 -0
- scipy/optimize/_remove_redundancy.py +522 -0
- scipy/optimize/_root.py +732 -0
- scipy/optimize/_root_scalar.py +538 -0
- scipy/optimize/_shgo.py +1606 -0
- scipy/optimize/_shgo_lib/__init__.py +0 -0
- scipy/optimize/_shgo_lib/_complex.py +1225 -0
- scipy/optimize/_shgo_lib/_vertex.py +460 -0
- scipy/optimize/_slsqp_py.py +603 -0
- scipy/optimize/_slsqplib.cpython-314-darwin.so +0 -0
- scipy/optimize/_spectral.py +260 -0
- scipy/optimize/_tnc.py +438 -0
- scipy/optimize/_trlib/__init__.py +12 -0
- scipy/optimize/_trlib/_trlib.cpython-314-darwin.so +0 -0
- scipy/optimize/_trustregion.py +318 -0
- scipy/optimize/_trustregion_constr/__init__.py +6 -0
- scipy/optimize/_trustregion_constr/canonical_constraint.py +390 -0
- scipy/optimize/_trustregion_constr/equality_constrained_sqp.py +231 -0
- scipy/optimize/_trustregion_constr/minimize_trustregion_constr.py +584 -0
- scipy/optimize/_trustregion_constr/projections.py +411 -0
- scipy/optimize/_trustregion_constr/qp_subproblem.py +637 -0
- scipy/optimize/_trustregion_constr/report.py +49 -0
- scipy/optimize/_trustregion_constr/tests/__init__.py +0 -0
- scipy/optimize/_trustregion_constr/tests/test_canonical_constraint.py +296 -0
- scipy/optimize/_trustregion_constr/tests/test_nested_minimize.py +39 -0
- scipy/optimize/_trustregion_constr/tests/test_projections.py +214 -0
- scipy/optimize/_trustregion_constr/tests/test_qp_subproblem.py +645 -0
- scipy/optimize/_trustregion_constr/tests/test_report.py +34 -0
- scipy/optimize/_trustregion_constr/tr_interior_point.py +361 -0
- scipy/optimize/_trustregion_dogleg.py +122 -0
- scipy/optimize/_trustregion_exact.py +437 -0
- scipy/optimize/_trustregion_krylov.py +65 -0
- scipy/optimize/_trustregion_ncg.py +126 -0
- scipy/optimize/_tstutils.py +972 -0
- scipy/optimize/_zeros.cpython-314-darwin.so +0 -0
- scipy/optimize/_zeros_py.py +1475 -0
- scipy/optimize/cobyla.py +19 -0
- scipy/optimize/cython_optimize/__init__.py +133 -0
- scipy/optimize/cython_optimize/_zeros.cpython-314-darwin.so +0 -0
- scipy/optimize/cython_optimize/_zeros.pxd +33 -0
- scipy/optimize/cython_optimize/c_zeros.pxd +26 -0
- scipy/optimize/cython_optimize.pxd +11 -0
- scipy/optimize/elementwise.py +38 -0
- scipy/optimize/lbfgsb.py +23 -0
- scipy/optimize/linesearch.py +18 -0
- scipy/optimize/minpack.py +27 -0
- scipy/optimize/minpack2.py +17 -0
- scipy/optimize/moduleTNC.py +19 -0
- scipy/optimize/nonlin.py +29 -0
- scipy/optimize/optimize.py +40 -0
- scipy/optimize/slsqp.py +22 -0
- scipy/optimize/tests/__init__.py +0 -0
- scipy/optimize/tests/_cython_examples/extending.pyx +43 -0
- scipy/optimize/tests/_cython_examples/meson.build +32 -0
- scipy/optimize/tests/test__basinhopping.py +535 -0
- scipy/optimize/tests/test__differential_evolution.py +1703 -0
- scipy/optimize/tests/test__dual_annealing.py +416 -0
- scipy/optimize/tests/test__linprog_clean_inputs.py +312 -0
- scipy/optimize/tests/test__numdiff.py +885 -0
- scipy/optimize/tests/test__remove_redundancy.py +228 -0
- scipy/optimize/tests/test__root.py +124 -0
- scipy/optimize/tests/test__shgo.py +1164 -0
- scipy/optimize/tests/test__spectral.py +226 -0
- scipy/optimize/tests/test_bracket.py +896 -0
- scipy/optimize/tests/test_chandrupatla.py +982 -0
- scipy/optimize/tests/test_cobyla.py +195 -0
- scipy/optimize/tests/test_cobyqa.py +252 -0
- scipy/optimize/tests/test_constraint_conversion.py +286 -0
- scipy/optimize/tests/test_constraints.py +255 -0
- scipy/optimize/tests/test_cython_optimize.py +92 -0
- scipy/optimize/tests/test_differentiable_functions.py +1025 -0
- scipy/optimize/tests/test_direct.py +321 -0
- scipy/optimize/tests/test_extending.py +28 -0
- scipy/optimize/tests/test_hessian_update_strategy.py +300 -0
- scipy/optimize/tests/test_isotonic_regression.py +167 -0
- scipy/optimize/tests/test_lbfgsb_hessinv.py +65 -0
- scipy/optimize/tests/test_lbfgsb_setulb.py +122 -0
- scipy/optimize/tests/test_least_squares.py +986 -0
- scipy/optimize/tests/test_linear_assignment.py +116 -0
- scipy/optimize/tests/test_linesearch.py +328 -0
- scipy/optimize/tests/test_linprog.py +2577 -0
- scipy/optimize/tests/test_lsq_common.py +297 -0
- scipy/optimize/tests/test_lsq_linear.py +287 -0
- scipy/optimize/tests/test_milp.py +459 -0
- scipy/optimize/tests/test_minimize_constrained.py +845 -0
- scipy/optimize/tests/test_minpack.py +1194 -0
- scipy/optimize/tests/test_nnls.py +469 -0
- scipy/optimize/tests/test_nonlin.py +572 -0
- scipy/optimize/tests/test_optimize.py +3335 -0
- scipy/optimize/tests/test_quadratic_assignment.py +455 -0
- scipy/optimize/tests/test_regression.py +40 -0
- scipy/optimize/tests/test_slsqp.py +645 -0
- scipy/optimize/tests/test_tnc.py +345 -0
- scipy/optimize/tests/test_trustregion.py +110 -0
- scipy/optimize/tests/test_trustregion_exact.py +351 -0
- scipy/optimize/tests/test_trustregion_krylov.py +170 -0
- scipy/optimize/tests/test_zeros.py +998 -0
- scipy/optimize/tnc.py +22 -0
- scipy/optimize/zeros.py +26 -0
- scipy/signal/__init__.py +316 -0
- scipy/signal/_arraytools.py +264 -0
- scipy/signal/_czt.py +575 -0
- scipy/signal/_delegators.py +568 -0
- scipy/signal/_filter_design.py +5893 -0
- scipy/signal/_fir_filter_design.py +1458 -0
- scipy/signal/_lti_conversion.py +534 -0
- scipy/signal/_ltisys.py +3546 -0
- scipy/signal/_max_len_seq.py +139 -0
- scipy/signal/_max_len_seq_inner.cpython-314-darwin.so +0 -0
- scipy/signal/_peak_finding.py +1310 -0
- scipy/signal/_peak_finding_utils.cpython-314-darwin.so +0 -0
- scipy/signal/_polyutils.py +172 -0
- scipy/signal/_savitzky_golay.py +357 -0
- scipy/signal/_short_time_fft.py +2187 -0
- scipy/signal/_signal_api.py +30 -0
- scipy/signal/_signaltools.py +5309 -0
- scipy/signal/_sigtools.cpython-314-darwin.so +0 -0
- scipy/signal/_sosfilt.cpython-314-darwin.so +0 -0
- scipy/signal/_spectral_py.py +2471 -0
- scipy/signal/_spline.cpython-314-darwin.so +0 -0
- scipy/signal/_spline.pyi +34 -0
- scipy/signal/_spline_filters.py +848 -0
- scipy/signal/_support_alternative_backends.py +73 -0
- scipy/signal/_upfirdn.py +219 -0
- scipy/signal/_upfirdn_apply.cpython-314-darwin.so +0 -0
- scipy/signal/_waveforms.py +687 -0
- scipy/signal/_wavelets.py +29 -0
- scipy/signal/bsplines.py +21 -0
- scipy/signal/filter_design.py +28 -0
- scipy/signal/fir_filter_design.py +21 -0
- scipy/signal/lti_conversion.py +20 -0
- scipy/signal/ltisys.py +25 -0
- scipy/signal/signaltools.py +27 -0
- scipy/signal/spectral.py +21 -0
- scipy/signal/spline.py +18 -0
- scipy/signal/tests/__init__.py +0 -0
- scipy/signal/tests/_scipy_spectral_test_shim.py +311 -0
- scipy/signal/tests/mpsig.py +122 -0
- scipy/signal/tests/test_array_tools.py +111 -0
- scipy/signal/tests/test_bsplines.py +365 -0
- scipy/signal/tests/test_cont2discrete.py +424 -0
- scipy/signal/tests/test_czt.py +221 -0
- scipy/signal/tests/test_dltisys.py +599 -0
- scipy/signal/tests/test_filter_design.py +4744 -0
- scipy/signal/tests/test_fir_filter_design.py +851 -0
- scipy/signal/tests/test_ltisys.py +1225 -0
- scipy/signal/tests/test_max_len_seq.py +71 -0
- scipy/signal/tests/test_peak_finding.py +915 -0
- scipy/signal/tests/test_result_type.py +51 -0
- scipy/signal/tests/test_savitzky_golay.py +363 -0
- scipy/signal/tests/test_short_time_fft.py +1098 -0
- scipy/signal/tests/test_signaltools.py +4729 -0
- scipy/signal/tests/test_spectral.py +2103 -0
- scipy/signal/tests/test_splines.py +427 -0
- scipy/signal/tests/test_upfirdn.py +322 -0
- scipy/signal/tests/test_waveforms.py +400 -0
- scipy/signal/tests/test_wavelets.py +59 -0
- scipy/signal/tests/test_windows.py +987 -0
- scipy/signal/waveforms.py +20 -0
- scipy/signal/wavelets.py +17 -0
- scipy/signal/windows/__init__.py +52 -0
- scipy/signal/windows/_windows.py +2513 -0
- scipy/signal/windows/windows.py +23 -0
- scipy/sparse/__init__.py +350 -0
- scipy/sparse/_base.py +1613 -0
- scipy/sparse/_bsr.py +880 -0
- scipy/sparse/_compressed.py +1328 -0
- scipy/sparse/_construct.py +1454 -0
- scipy/sparse/_coo.py +1581 -0
- scipy/sparse/_csc.py +367 -0
- scipy/sparse/_csparsetools.cpython-314-darwin.so +0 -0
- scipy/sparse/_csr.py +558 -0
- scipy/sparse/_data.py +569 -0
- scipy/sparse/_dia.py +677 -0
- scipy/sparse/_dok.py +669 -0
- scipy/sparse/_extract.py +178 -0
- scipy/sparse/_index.py +444 -0
- scipy/sparse/_lil.py +632 -0
- scipy/sparse/_matrix.py +169 -0
- scipy/sparse/_matrix_io.py +167 -0
- scipy/sparse/_sparsetools.cpython-314-darwin.so +0 -0
- scipy/sparse/_spfuncs.py +76 -0
- scipy/sparse/_sputils.py +632 -0
- scipy/sparse/base.py +24 -0
- scipy/sparse/bsr.py +22 -0
- scipy/sparse/compressed.py +20 -0
- scipy/sparse/construct.py +38 -0
- scipy/sparse/coo.py +23 -0
- scipy/sparse/csc.py +22 -0
- scipy/sparse/csgraph/__init__.py +210 -0
- scipy/sparse/csgraph/_flow.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_laplacian.py +563 -0
- scipy/sparse/csgraph/_matching.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_min_spanning_tree.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_reordering.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_shortest_path.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_tools.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_traversal.cpython-314-darwin.so +0 -0
- scipy/sparse/csgraph/_validation.py +66 -0
- scipy/sparse/csgraph/tests/__init__.py +0 -0
- scipy/sparse/csgraph/tests/test_connected_components.py +119 -0
- scipy/sparse/csgraph/tests/test_conversions.py +61 -0
- scipy/sparse/csgraph/tests/test_flow.py +209 -0
- scipy/sparse/csgraph/tests/test_graph_laplacian.py +368 -0
- scipy/sparse/csgraph/tests/test_matching.py +307 -0
- scipy/sparse/csgraph/tests/test_pydata_sparse.py +197 -0
- scipy/sparse/csgraph/tests/test_reordering.py +70 -0
- scipy/sparse/csgraph/tests/test_shortest_path.py +540 -0
- scipy/sparse/csgraph/tests/test_spanning_tree.py +66 -0
- scipy/sparse/csgraph/tests/test_traversal.py +148 -0
- scipy/sparse/csr.py +22 -0
- scipy/sparse/data.py +18 -0
- scipy/sparse/dia.py +22 -0
- scipy/sparse/dok.py +22 -0
- scipy/sparse/extract.py +23 -0
- scipy/sparse/lil.py +22 -0
- scipy/sparse/linalg/__init__.py +148 -0
- scipy/sparse/linalg/_dsolve/__init__.py +71 -0
- scipy/sparse/linalg/_dsolve/_add_newdocs.py +147 -0
- scipy/sparse/linalg/_dsolve/_superlu.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_dsolve/linsolve.py +882 -0
- scipy/sparse/linalg/_dsolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_dsolve/tests/test_linsolve.py +928 -0
- scipy/sparse/linalg/_eigen/__init__.py +22 -0
- scipy/sparse/linalg/_eigen/_svds.py +540 -0
- scipy/sparse/linalg/_eigen/_svds_doc.py +382 -0
- scipy/sparse/linalg/_eigen/arpack/COPYING +45 -0
- scipy/sparse/linalg/_eigen/arpack/__init__.py +20 -0
- scipy/sparse/linalg/_eigen/arpack/_arpack.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_eigen/arpack/arpack.py +1706 -0
- scipy/sparse/linalg/_eigen/arpack/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/arpack/tests/test_arpack.py +717 -0
- scipy/sparse/linalg/_eigen/lobpcg/__init__.py +16 -0
- scipy/sparse/linalg/_eigen/lobpcg/lobpcg.py +1110 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/lobpcg/tests/test_lobpcg.py +725 -0
- scipy/sparse/linalg/_eigen/tests/__init__.py +0 -0
- scipy/sparse/linalg/_eigen/tests/test_svds.py +886 -0
- scipy/sparse/linalg/_expm_multiply.py +816 -0
- scipy/sparse/linalg/_interface.py +920 -0
- scipy/sparse/linalg/_isolve/__init__.py +20 -0
- scipy/sparse/linalg/_isolve/_gcrotmk.py +503 -0
- scipy/sparse/linalg/_isolve/iterative.py +1051 -0
- scipy/sparse/linalg/_isolve/lgmres.py +230 -0
- scipy/sparse/linalg/_isolve/lsmr.py +486 -0
- scipy/sparse/linalg/_isolve/lsqr.py +589 -0
- scipy/sparse/linalg/_isolve/minres.py +372 -0
- scipy/sparse/linalg/_isolve/tests/__init__.py +0 -0
- scipy/sparse/linalg/_isolve/tests/test_gcrotmk.py +183 -0
- scipy/sparse/linalg/_isolve/tests/test_iterative.py +809 -0
- scipy/sparse/linalg/_isolve/tests/test_lgmres.py +225 -0
- scipy/sparse/linalg/_isolve/tests/test_lsmr.py +185 -0
- scipy/sparse/linalg/_isolve/tests/test_lsqr.py +120 -0
- scipy/sparse/linalg/_isolve/tests/test_minres.py +97 -0
- scipy/sparse/linalg/_isolve/tests/test_utils.py +9 -0
- scipy/sparse/linalg/_isolve/tfqmr.py +179 -0
- scipy/sparse/linalg/_isolve/utils.py +121 -0
- scipy/sparse/linalg/_matfuncs.py +940 -0
- scipy/sparse/linalg/_norm.py +195 -0
- scipy/sparse/linalg/_onenormest.py +467 -0
- scipy/sparse/linalg/_propack/_cpropack.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_dpropack.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_spropack.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_propack/_zpropack.cpython-314-darwin.so +0 -0
- scipy/sparse/linalg/_special_sparse_arrays.py +949 -0
- scipy/sparse/linalg/_svdp.py +309 -0
- scipy/sparse/linalg/dsolve.py +22 -0
- scipy/sparse/linalg/eigen.py +21 -0
- scipy/sparse/linalg/interface.py +20 -0
- scipy/sparse/linalg/isolve.py +22 -0
- scipy/sparse/linalg/matfuncs.py +18 -0
- scipy/sparse/linalg/tests/__init__.py +0 -0
- scipy/sparse/linalg/tests/propack_test_data.npz +0 -0
- scipy/sparse/linalg/tests/test_expm_multiply.py +367 -0
- scipy/sparse/linalg/tests/test_interface.py +561 -0
- scipy/sparse/linalg/tests/test_matfuncs.py +592 -0
- scipy/sparse/linalg/tests/test_norm.py +154 -0
- scipy/sparse/linalg/tests/test_onenormest.py +252 -0
- scipy/sparse/linalg/tests/test_propack.py +165 -0
- scipy/sparse/linalg/tests/test_pydata_sparse.py +272 -0
- scipy/sparse/linalg/tests/test_special_sparse_arrays.py +337 -0
- scipy/sparse/sparsetools.py +17 -0
- scipy/sparse/spfuncs.py +17 -0
- scipy/sparse/sputils.py +17 -0
- scipy/sparse/tests/__init__.py +0 -0
- scipy/sparse/tests/data/csc_py2.npz +0 -0
- scipy/sparse/tests/data/csc_py3.npz +0 -0
- scipy/sparse/tests/test_arithmetic1d.py +341 -0
- scipy/sparse/tests/test_array_api.py +561 -0
- scipy/sparse/tests/test_base.py +5870 -0
- scipy/sparse/tests/test_common1d.py +447 -0
- scipy/sparse/tests/test_construct.py +872 -0
- scipy/sparse/tests/test_coo.py +1119 -0
- scipy/sparse/tests/test_csc.py +98 -0
- scipy/sparse/tests/test_csr.py +214 -0
- scipy/sparse/tests/test_dok.py +209 -0
- scipy/sparse/tests/test_extract.py +51 -0
- scipy/sparse/tests/test_indexing1d.py +603 -0
- scipy/sparse/tests/test_matrix_io.py +109 -0
- scipy/sparse/tests/test_minmax1d.py +128 -0
- scipy/sparse/tests/test_sparsetools.py +344 -0
- scipy/sparse/tests/test_spfuncs.py +97 -0
- scipy/sparse/tests/test_sputils.py +424 -0
- scipy/spatial/__init__.py +129 -0
- scipy/spatial/_ckdtree.cpython-314-darwin.so +0 -0
- scipy/spatial/_distance_pybind.cpython-314-darwin.so +0 -0
- scipy/spatial/_distance_wrap.cpython-314-darwin.so +0 -0
- scipy/spatial/_geometric_slerp.py +238 -0
- scipy/spatial/_hausdorff.cpython-314-darwin.so +0 -0
- scipy/spatial/_kdtree.py +920 -0
- scipy/spatial/_plotutils.py +274 -0
- scipy/spatial/_procrustes.py +132 -0
- scipy/spatial/_qhull.cpython-314-darwin.so +0 -0
- scipy/spatial/_qhull.pyi +213 -0
- scipy/spatial/_spherical_voronoi.py +341 -0
- scipy/spatial/_voronoi.cpython-314-darwin.so +0 -0
- scipy/spatial/_voronoi.pyi +4 -0
- scipy/spatial/ckdtree.py +18 -0
- scipy/spatial/distance.py +3147 -0
- scipy/spatial/distance.pyi +210 -0
- scipy/spatial/kdtree.py +25 -0
- scipy/spatial/qhull.py +25 -0
- scipy/spatial/tests/__init__.py +0 -0
- scipy/spatial/tests/data/cdist-X1.txt +10 -0
- scipy/spatial/tests/data/cdist-X2.txt +20 -0
- scipy/spatial/tests/data/degenerate_pointset.npz +0 -0
- scipy/spatial/tests/data/iris.txt +150 -0
- scipy/spatial/tests/data/pdist-boolean-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-chebyshev-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cityblock-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-correlation-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-cosine-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-double-inp.txt +20 -0
- scipy/spatial/tests/data/pdist-euclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-euclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-hamming-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jaccard-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-jensenshannon-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-3.2-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-minkowski-5.8-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml-iris.txt +1 -0
- scipy/spatial/tests/data/pdist-seuclidean-ml.txt +1 -0
- scipy/spatial/tests/data/pdist-spearman-ml.txt +1 -0
- scipy/spatial/tests/data/random-bool-data.txt +100 -0
- scipy/spatial/tests/data/random-double-data.txt +100 -0
- scipy/spatial/tests/data/random-int-data.txt +100 -0
- scipy/spatial/tests/data/random-uint-data.txt +100 -0
- scipy/spatial/tests/data/selfdual-4d-polytope.txt +27 -0
- scipy/spatial/tests/test__plotutils.py +91 -0
- scipy/spatial/tests/test__procrustes.py +116 -0
- scipy/spatial/tests/test_distance.py +2388 -0
- scipy/spatial/tests/test_hausdorff.py +199 -0
- scipy/spatial/tests/test_kdtree.py +1536 -0
- scipy/spatial/tests/test_qhull.py +1313 -0
- scipy/spatial/tests/test_slerp.py +417 -0
- scipy/spatial/tests/test_spherical_voronoi.py +358 -0
- scipy/spatial/transform/__init__.py +31 -0
- scipy/spatial/transform/_rigid_transform.cpython-314-darwin.so +0 -0
- scipy/spatial/transform/_rotation.cpython-314-darwin.so +0 -0
- scipy/spatial/transform/_rotation_groups.py +140 -0
- scipy/spatial/transform/_rotation_spline.py +460 -0
- scipy/spatial/transform/rotation.py +21 -0
- scipy/spatial/transform/tests/__init__.py +0 -0
- scipy/spatial/transform/tests/test_rigid_transform.py +1221 -0
- scipy/spatial/transform/tests/test_rotation.py +2569 -0
- scipy/spatial/transform/tests/test_rotation_groups.py +169 -0
- scipy/spatial/transform/tests/test_rotation_spline.py +183 -0
- scipy/special/__init__.pxd +1 -0
- scipy/special/__init__.py +841 -0
- scipy/special/_add_newdocs.py +9961 -0
- scipy/special/_basic.py +3576 -0
- scipy/special/_comb.cpython-314-darwin.so +0 -0
- scipy/special/_ellip_harm.py +214 -0
- scipy/special/_ellip_harm_2.cpython-314-darwin.so +0 -0
- scipy/special/_gufuncs.cpython-314-darwin.so +0 -0
- scipy/special/_input_validation.py +17 -0
- scipy/special/_lambertw.py +149 -0
- scipy/special/_logsumexp.py +426 -0
- scipy/special/_mptestutils.py +453 -0
- scipy/special/_multiufuncs.py +610 -0
- scipy/special/_orthogonal.py +2592 -0
- scipy/special/_orthogonal.pyi +330 -0
- scipy/special/_precompute/__init__.py +0 -0
- scipy/special/_precompute/cosine_cdf.py +17 -0
- scipy/special/_precompute/expn_asy.py +54 -0
- scipy/special/_precompute/gammainc_asy.py +116 -0
- scipy/special/_precompute/gammainc_data.py +124 -0
- scipy/special/_precompute/hyp2f1_data.py +484 -0
- scipy/special/_precompute/lambertw.py +68 -0
- scipy/special/_precompute/loggamma.py +43 -0
- scipy/special/_precompute/struve_convergence.py +131 -0
- scipy/special/_precompute/utils.py +38 -0
- scipy/special/_precompute/wright_bessel.py +342 -0
- scipy/special/_precompute/wright_bessel_data.py +152 -0
- scipy/special/_precompute/wrightomega.py +41 -0
- scipy/special/_precompute/zetac.py +27 -0
- scipy/special/_sf_error.py +15 -0
- scipy/special/_specfun.cpython-314-darwin.so +0 -0
- scipy/special/_special_ufuncs.cpython-314-darwin.so +0 -0
- scipy/special/_spfun_stats.py +106 -0
- scipy/special/_spherical_bessel.py +397 -0
- scipy/special/_support_alternative_backends.py +295 -0
- scipy/special/_test_internal.cpython-314-darwin.so +0 -0
- scipy/special/_test_internal.pyi +9 -0
- scipy/special/_testutils.py +321 -0
- scipy/special/_ufuncs.cpython-314-darwin.so +0 -0
- scipy/special/_ufuncs.pyi +522 -0
- scipy/special/_ufuncs.pyx +13173 -0
- scipy/special/_ufuncs_cxx.cpython-314-darwin.so +0 -0
- scipy/special/_ufuncs_cxx.pxd +142 -0
- scipy/special/_ufuncs_cxx.pyx +427 -0
- scipy/special/_ufuncs_cxx_defs.h +147 -0
- scipy/special/_ufuncs_defs.h +57 -0
- scipy/special/add_newdocs.py +15 -0
- scipy/special/basic.py +87 -0
- scipy/special/cython_special.cpython-314-darwin.so +0 -0
- scipy/special/cython_special.pxd +259 -0
- scipy/special/cython_special.pyi +3 -0
- scipy/special/orthogonal.py +45 -0
- scipy/special/sf_error.py +20 -0
- scipy/special/specfun.py +24 -0
- scipy/special/spfun_stats.py +17 -0
- scipy/special/tests/__init__.py +0 -0
- scipy/special/tests/_cython_examples/extending.pyx +12 -0
- scipy/special/tests/_cython_examples/meson.build +34 -0
- scipy/special/tests/data/__init__.py +0 -0
- scipy/special/tests/data/boost.npz +0 -0
- scipy/special/tests/data/gsl.npz +0 -0
- scipy/special/tests/data/local.npz +0 -0
- scipy/special/tests/test_basic.py +4815 -0
- scipy/special/tests/test_bdtr.py +112 -0
- scipy/special/tests/test_boost_ufuncs.py +64 -0
- scipy/special/tests/test_boxcox.py +125 -0
- scipy/special/tests/test_cdflib.py +712 -0
- scipy/special/tests/test_cdft_asymptotic.py +49 -0
- scipy/special/tests/test_cephes_intp_cast.py +29 -0
- scipy/special/tests/test_cosine_distr.py +83 -0
- scipy/special/tests/test_cython_special.py +363 -0
- scipy/special/tests/test_data.py +719 -0
- scipy/special/tests/test_dd.py +42 -0
- scipy/special/tests/test_digamma.py +45 -0
- scipy/special/tests/test_ellip_harm.py +278 -0
- scipy/special/tests/test_erfinv.py +89 -0
- scipy/special/tests/test_exponential_integrals.py +118 -0
- scipy/special/tests/test_extending.py +28 -0
- scipy/special/tests/test_faddeeva.py +85 -0
- scipy/special/tests/test_gamma.py +12 -0
- scipy/special/tests/test_gammainc.py +152 -0
- scipy/special/tests/test_hyp2f1.py +2566 -0
- scipy/special/tests/test_hypergeometric.py +234 -0
- scipy/special/tests/test_iv_ratio.py +249 -0
- scipy/special/tests/test_kolmogorov.py +491 -0
- scipy/special/tests/test_lambertw.py +109 -0
- scipy/special/tests/test_legendre.py +1518 -0
- scipy/special/tests/test_log1mexp.py +85 -0
- scipy/special/tests/test_loggamma.py +70 -0
- scipy/special/tests/test_logit.py +162 -0
- scipy/special/tests/test_logsumexp.py +469 -0
- scipy/special/tests/test_mpmath.py +2293 -0
- scipy/special/tests/test_nan_inputs.py +65 -0
- scipy/special/tests/test_ndtr.py +77 -0
- scipy/special/tests/test_ndtri_exp.py +94 -0
- scipy/special/tests/test_orthogonal.py +821 -0
- scipy/special/tests/test_orthogonal_eval.py +275 -0
- scipy/special/tests/test_owens_t.py +53 -0
- scipy/special/tests/test_pcf.py +24 -0
- scipy/special/tests/test_pdtr.py +48 -0
- scipy/special/tests/test_powm1.py +65 -0
- scipy/special/tests/test_precompute_expn_asy.py +24 -0
- scipy/special/tests/test_precompute_gammainc.py +108 -0
- scipy/special/tests/test_precompute_utils.py +36 -0
- scipy/special/tests/test_round.py +18 -0
- scipy/special/tests/test_sf_error.py +146 -0
- scipy/special/tests/test_sici.py +36 -0
- scipy/special/tests/test_specfun.py +48 -0
- scipy/special/tests/test_spence.py +32 -0
- scipy/special/tests/test_spfun_stats.py +61 -0
- scipy/special/tests/test_sph_harm.py +85 -0
- scipy/special/tests/test_spherical_bessel.py +400 -0
- scipy/special/tests/test_support_alternative_backends.py +248 -0
- scipy/special/tests/test_trig.py +72 -0
- scipy/special/tests/test_ufunc_signatures.py +46 -0
- scipy/special/tests/test_wright_bessel.py +205 -0
- scipy/special/tests/test_wrightomega.py +117 -0
- scipy/special/tests/test_zeta.py +301 -0
- scipy/stats/__init__.py +670 -0
- scipy/stats/_ansari_swilk_statistics.cpython-314-darwin.so +0 -0
- scipy/stats/_axis_nan_policy.py +692 -0
- scipy/stats/_biasedurn.cpython-314-darwin.so +0 -0
- scipy/stats/_biasedurn.pxd +27 -0
- scipy/stats/_binned_statistic.py +795 -0
- scipy/stats/_binomtest.py +375 -0
- scipy/stats/_bws_test.py +177 -0
- scipy/stats/_censored_data.py +459 -0
- scipy/stats/_common.py +5 -0
- scipy/stats/_constants.py +42 -0
- scipy/stats/_continued_fraction.py +387 -0
- scipy/stats/_continuous_distns.py +12486 -0
- scipy/stats/_correlation.py +210 -0
- scipy/stats/_covariance.py +636 -0
- scipy/stats/_crosstab.py +204 -0
- scipy/stats/_discrete_distns.py +2098 -0
- scipy/stats/_distn_infrastructure.py +4201 -0
- scipy/stats/_distr_params.py +299 -0
- scipy/stats/_distribution_infrastructure.py +5750 -0
- scipy/stats/_entropy.py +428 -0
- scipy/stats/_finite_differences.py +145 -0
- scipy/stats/_fit.py +1351 -0
- scipy/stats/_hypotests.py +2060 -0
- scipy/stats/_kde.py +732 -0
- scipy/stats/_ksstats.py +600 -0
- scipy/stats/_levy_stable/__init__.py +1231 -0
- scipy/stats/_levy_stable/levyst.cpython-314-darwin.so +0 -0
- scipy/stats/_mannwhitneyu.py +492 -0
- scipy/stats/_mgc.py +550 -0
- scipy/stats/_morestats.py +4626 -0
- scipy/stats/_mstats_basic.py +3658 -0
- scipy/stats/_mstats_extras.py +521 -0
- scipy/stats/_multicomp.py +449 -0
- scipy/stats/_multivariate.py +7281 -0
- scipy/stats/_new_distributions.py +452 -0
- scipy/stats/_odds_ratio.py +466 -0
- scipy/stats/_page_trend_test.py +486 -0
- scipy/stats/_probability_distribution.py +1964 -0
- scipy/stats/_qmc.py +2956 -0
- scipy/stats/_qmc_cy.cpython-314-darwin.so +0 -0
- scipy/stats/_qmc_cy.pyi +54 -0
- scipy/stats/_qmvnt.py +454 -0
- scipy/stats/_qmvnt_cy.cpython-314-darwin.so +0 -0
- scipy/stats/_quantile.py +335 -0
- scipy/stats/_rcont/__init__.py +4 -0
- scipy/stats/_rcont/rcont.cpython-314-darwin.so +0 -0
- scipy/stats/_relative_risk.py +263 -0
- scipy/stats/_resampling.py +2352 -0
- scipy/stats/_result_classes.py +40 -0
- scipy/stats/_sampling.py +1314 -0
- scipy/stats/_sensitivity_analysis.py +713 -0
- scipy/stats/_sobol.cpython-314-darwin.so +0 -0
- scipy/stats/_sobol.pyi +54 -0
- scipy/stats/_sobol_direction_numbers.npz +0 -0
- scipy/stats/_stats.cpython-314-darwin.so +0 -0
- scipy/stats/_stats.pxd +10 -0
- scipy/stats/_stats_mstats_common.py +322 -0
- scipy/stats/_stats_py.py +11089 -0
- scipy/stats/_stats_pythran.cpython-314-darwin.so +0 -0
- scipy/stats/_survival.py +683 -0
- scipy/stats/_tukeylambda_stats.py +199 -0
- scipy/stats/_unuran/__init__.py +0 -0
- scipy/stats/_unuran/unuran_wrapper.cpython-314-darwin.so +0 -0
- scipy/stats/_unuran/unuran_wrapper.pyi +179 -0
- scipy/stats/_variation.py +126 -0
- scipy/stats/_warnings_errors.py +38 -0
- scipy/stats/_wilcoxon.py +265 -0
- scipy/stats/biasedurn.py +16 -0
- scipy/stats/contingency.py +521 -0
- scipy/stats/distributions.py +24 -0
- scipy/stats/kde.py +18 -0
- scipy/stats/morestats.py +27 -0
- scipy/stats/mstats.py +140 -0
- scipy/stats/mstats_basic.py +42 -0
- scipy/stats/mstats_extras.py +25 -0
- scipy/stats/mvn.py +17 -0
- scipy/stats/qmc.py +236 -0
- scipy/stats/sampling.py +73 -0
- scipy/stats/stats.py +41 -0
- scipy/stats/tests/__init__.py +0 -0
- scipy/stats/tests/common_tests.py +356 -0
- scipy/stats/tests/data/_mvt.py +171 -0
- scipy/stats/tests/data/fisher_exact_results_from_r.py +607 -0
- scipy/stats/tests/data/jf_skew_t_gamlss_pdf_data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-cdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-Z1-pdf-sample-data.npy +0 -0
- scipy/stats/tests/data/levy_stable/stable-loc-scale-sample-data.npy +0 -0
- scipy/stats/tests/data/nist_anova/AtmWtAg.dat +108 -0
- scipy/stats/tests/data/nist_anova/SiRstv.dat +85 -0
- scipy/stats/tests/data/nist_anova/SmLs01.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs02.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs03.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs04.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs05.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs06.dat +18069 -0
- scipy/stats/tests/data/nist_anova/SmLs07.dat +249 -0
- scipy/stats/tests/data/nist_anova/SmLs08.dat +1869 -0
- scipy/stats/tests/data/nist_anova/SmLs09.dat +18069 -0
- scipy/stats/tests/data/nist_linregress/Norris.dat +97 -0
- scipy/stats/tests/data/rel_breitwigner_pdf_sample_data_ROOT.npy +0 -0
- scipy/stats/tests/data/studentized_range_mpmath_ref.json +1499 -0
- scipy/stats/tests/test_axis_nan_policy.py +1388 -0
- scipy/stats/tests/test_binned_statistic.py +568 -0
- scipy/stats/tests/test_censored_data.py +152 -0
- scipy/stats/tests/test_contingency.py +294 -0
- scipy/stats/tests/test_continued_fraction.py +173 -0
- scipy/stats/tests/test_continuous.py +2198 -0
- scipy/stats/tests/test_continuous_basic.py +1053 -0
- scipy/stats/tests/test_continuous_fit_censored.py +683 -0
- scipy/stats/tests/test_correlation.py +80 -0
- scipy/stats/tests/test_crosstab.py +115 -0
- scipy/stats/tests/test_discrete_basic.py +580 -0
- scipy/stats/tests/test_discrete_distns.py +700 -0
- scipy/stats/tests/test_distributions.py +10413 -0
- scipy/stats/tests/test_entropy.py +322 -0
- scipy/stats/tests/test_fast_gen_inversion.py +435 -0
- scipy/stats/tests/test_fit.py +1090 -0
- scipy/stats/tests/test_hypotests.py +1991 -0
- scipy/stats/tests/test_kdeoth.py +676 -0
- scipy/stats/tests/test_marray.py +289 -0
- scipy/stats/tests/test_mgc.py +217 -0
- scipy/stats/tests/test_morestats.py +3259 -0
- scipy/stats/tests/test_mstats_basic.py +2071 -0
- scipy/stats/tests/test_mstats_extras.py +172 -0
- scipy/stats/tests/test_multicomp.py +405 -0
- scipy/stats/tests/test_multivariate.py +4381 -0
- scipy/stats/tests/test_odds_ratio.py +148 -0
- scipy/stats/tests/test_qmc.py +1492 -0
- scipy/stats/tests/test_quantile.py +199 -0
- scipy/stats/tests/test_rank.py +345 -0
- scipy/stats/tests/test_relative_risk.py +95 -0
- scipy/stats/tests/test_resampling.py +2000 -0
- scipy/stats/tests/test_sampling.py +1450 -0
- scipy/stats/tests/test_sensitivity_analysis.py +310 -0
- scipy/stats/tests/test_stats.py +9707 -0
- scipy/stats/tests/test_survival.py +466 -0
- scipy/stats/tests/test_tukeylambda_stats.py +85 -0
- scipy/stats/tests/test_variation.py +216 -0
- scipy/version.py +12 -0
- scipy-1.16.1.dist-info/LICENSE.txt +934 -0
- scipy-1.16.1.dist-info/METADATA +1083 -0
- scipy-1.16.1.dist-info/RECORD +1416 -0
- scipy-1.16.1.dist-info/WHEEL +6 -0
@@ -0,0 +1,1238 @@
|
|
1
|
+
#
|
2
|
+
# Author: Damian Eads
|
3
|
+
# Date: April 17, 2008
|
4
|
+
#
|
5
|
+
# Copyright (C) 2008 Damian Eads
|
6
|
+
#
|
7
|
+
# Redistribution and use in source and binary forms, with or without
|
8
|
+
# modification, are permitted provided that the following conditions
|
9
|
+
# are met:
|
10
|
+
#
|
11
|
+
# 1. Redistributions of source code must retain the above copyright
|
12
|
+
# notice, this list of conditions and the following disclaimer.
|
13
|
+
#
|
14
|
+
# 2. Redistributions in binary form must reproduce the above
|
15
|
+
# copyright notice, this list of conditions and the following
|
16
|
+
# disclaimer in the documentation and/or other materials provided
|
17
|
+
# with the distribution.
|
18
|
+
#
|
19
|
+
# 3. The name of the author may not be used to endorse or promote
|
20
|
+
# products derived from this software without specific prior
|
21
|
+
# written permission.
|
22
|
+
#
|
23
|
+
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
24
|
+
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
25
|
+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
26
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
27
|
+
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
28
|
+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
29
|
+
# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
30
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
|
+
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
33
|
+
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
+
import numpy as np
|
35
|
+
from numpy.testing import assert_allclose, assert_equal, assert_array_equal, assert_
|
36
|
+
import pytest
|
37
|
+
from pytest import raises as assert_raises
|
38
|
+
|
39
|
+
from scipy.cluster.hierarchy import (
|
40
|
+
ClusterWarning, linkage, from_mlab_linkage, to_mlab_linkage,
|
41
|
+
num_obs_linkage, inconsistent, cophenet, fclusterdata, fcluster,
|
42
|
+
is_isomorphic, single, ward, leaders,
|
43
|
+
correspond, is_monotonic, maxdists, maxinconsts, maxRstat,
|
44
|
+
is_valid_linkage, is_valid_im, to_tree, leaves_list, dendrogram,
|
45
|
+
set_link_color_palette, cut_tree, optimal_leaf_ordering,
|
46
|
+
_order_cluster_tree, _hierarchy, _EUCLIDEAN_METHODS, _LINKAGE_METHODS)
|
47
|
+
from scipy.cluster._hierarchy import Heap
|
48
|
+
from scipy.spatial.distance import pdist
|
49
|
+
from scipy._lib._array_api import (eager_warns, make_xp_test_case,
|
50
|
+
xp_assert_close, xp_assert_equal)
|
51
|
+
import scipy._lib.array_api_extra as xpx
|
52
|
+
|
53
|
+
from threading import Lock
|
54
|
+
|
55
|
+
from . import hierarchy_test_data
|
56
|
+
|
57
|
+
class eager:
|
58
|
+
# Bypass xpx.testing.lazy_xp_function when calling
|
59
|
+
# these functions from this namespace
|
60
|
+
is_valid_im = is_valid_im
|
61
|
+
is_valid_linkage = is_valid_linkage
|
62
|
+
|
63
|
+
|
64
|
+
# Matplotlib is not a scipy dependency but is optionally used in dendrogram, so
|
65
|
+
# check if it's available
|
66
|
+
try:
|
67
|
+
import matplotlib
|
68
|
+
# and set the backend to be Agg (no gui)
|
69
|
+
matplotlib.use('Agg')
|
70
|
+
# before importing pyplot
|
71
|
+
import matplotlib.pyplot as plt
|
72
|
+
have_matplotlib = True
|
73
|
+
except Exception:
|
74
|
+
have_matplotlib = False
|
75
|
+
|
76
|
+
skip_xp_backends = pytest.mark.skip_xp_backends
|
77
|
+
|
78
|
+
|
79
|
+
@make_xp_test_case(linkage)
|
80
|
+
class TestLinkage:
|
81
|
+
|
82
|
+
@skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
|
83
|
+
def test_linkage_non_finite_elements_in_distance_matrix(self, xp):
|
84
|
+
# Tests linkage(Y) where Y contains a non-finite element (e.g. NaN or Inf).
|
85
|
+
# Exception expected.
|
86
|
+
y = xp.asarray([xp.nan] + [0.0]*5)
|
87
|
+
assert_raises(ValueError, linkage, y)
|
88
|
+
|
89
|
+
def test_linkage_empty_distance_matrix(self, xp):
|
90
|
+
# Tests linkage(Y) where Y is a 0x4 linkage matrix. Exception expected.
|
91
|
+
y = xp.zeros((0,))
|
92
|
+
assert_raises(ValueError, linkage, y)
|
93
|
+
|
94
|
+
def test_linkage_tdist(self, xp):
|
95
|
+
for method in ['single', 'complete', 'average', 'weighted']:
|
96
|
+
self.check_linkage_tdist(method, xp)
|
97
|
+
|
98
|
+
def check_linkage_tdist(self, method, xp):
|
99
|
+
# Tests linkage(Y, method) on the tdist data set.
|
100
|
+
Z = linkage(xp.asarray(hierarchy_test_data.ytdist), method)
|
101
|
+
expectedZ = getattr(hierarchy_test_data, 'linkage_ytdist_' + method)
|
102
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
|
103
|
+
|
104
|
+
def test_linkage_X(self, xp):
|
105
|
+
for method in ['centroid', 'median', 'ward']:
|
106
|
+
self.check_linkage_q(method, xp)
|
107
|
+
|
108
|
+
def check_linkage_q(self, method, xp):
|
109
|
+
# Tests linkage(Y, method) on the Q data set.
|
110
|
+
Z = linkage(xp.asarray(hierarchy_test_data.X), method)
|
111
|
+
expectedZ = getattr(hierarchy_test_data, 'linkage_X_' + method)
|
112
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
|
113
|
+
|
114
|
+
X = xp.asarray(hierarchy_test_data.X)
|
115
|
+
y = pdist(X, metric="euclidean")
|
116
|
+
Z = linkage(y, method)
|
117
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
|
118
|
+
|
119
|
+
def test_compare_with_trivial(self, xp):
|
120
|
+
rng = np.random.RandomState(0)
|
121
|
+
n = 20
|
122
|
+
X = rng.rand(n, 2)
|
123
|
+
d = pdist(X)
|
124
|
+
|
125
|
+
for method, code in _LINKAGE_METHODS.items():
|
126
|
+
Z_trivial = _hierarchy.linkage(d, n, code)
|
127
|
+
Z = linkage(xp.asarray(d), method)
|
128
|
+
xp_assert_close(Z, xp.asarray(Z_trivial), rtol=1e-14, atol=1e-15)
|
129
|
+
|
130
|
+
def test_optimal_leaf_ordering(self, xp):
|
131
|
+
Z = linkage(xp.asarray(hierarchy_test_data.ytdist), optimal_ordering=True)
|
132
|
+
expectedZ = getattr(hierarchy_test_data, 'linkage_ytdist_single_olo')
|
133
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
|
134
|
+
|
135
|
+
@pytest.mark.parametrize("method,expect", [
|
136
|
+
('single', [[0, 1, 1.41421356, 2],
|
137
|
+
[2, 3, 1.41421356, 3]]),
|
138
|
+
('complete', [[0, 1, 1.41421356, 2],
|
139
|
+
[2, 3, 2.82842712, 3]]),
|
140
|
+
('average', [[0, 1, 1.41421356, 2],
|
141
|
+
[2, 3, 2.12132034, 3]]),
|
142
|
+
('weighted', [[0, 1, 1.41421356, 2],
|
143
|
+
[2, 3, 2.12132034, 3]]),
|
144
|
+
('centroid', [[0, 1, 1.41421356, 2],
|
145
|
+
[2, 3, 2.12132034, 3]]),
|
146
|
+
('median', [[0, 1, 1.41421356, 2],
|
147
|
+
[2, 3, 2.12132034, 3]]),
|
148
|
+
('ward', [[0, 1, 1.41421356, 2],
|
149
|
+
[2, 3, 2.44948974, 3]]),
|
150
|
+
])
|
151
|
+
def test_linkage_ties(self, method, expect, xp):
|
152
|
+
X = xp.asarray([[-1, -1], [0, 0], [1, 1]])
|
153
|
+
Z = linkage(X, method=method)
|
154
|
+
expect = xp.asarray(expect, dtype=xp.float64)
|
155
|
+
xp_assert_close(Z, expect, atol=1e-06)
|
156
|
+
|
157
|
+
def test_unsupported_uncondensed_distance_matrix_linkage_warning(self, xp):
|
158
|
+
X = xp.asarray([[0, 1], [1, 0]])
|
159
|
+
with eager_warns(X, ClusterWarning):
|
160
|
+
linkage(X)
|
161
|
+
|
162
|
+
@pytest.mark.parametrize("method", _EUCLIDEAN_METHODS)
|
163
|
+
def test_euclidean_linkage_value_error(self, method, xp):
|
164
|
+
X = xp.asarray([[1, 1], [1, 1]])
|
165
|
+
with pytest.raises(ValueError):
|
166
|
+
linkage(X, method=method, metric='cityblock')
|
167
|
+
|
168
|
+
def test_2x2_linkage(self, xp):
|
169
|
+
Z1 = linkage(xp.asarray([1]), method='single', metric='euclidean')
|
170
|
+
Z2 = linkage(xp.asarray([[0, 1], [0, 0]]), method='single', metric='euclidean')
|
171
|
+
xp_assert_close(Z1, Z2, rtol=1e-15)
|
172
|
+
|
173
|
+
@skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
|
174
|
+
def test_centroid_neg_distance(self, xp):
|
175
|
+
# gh-21011
|
176
|
+
values = xp.asarray([0, 0, -1])
|
177
|
+
with pytest.raises(ValueError):
|
178
|
+
# This is just checking that this doesn't crash
|
179
|
+
linkage(values, method='centroid')
|
180
|
+
|
181
|
+
|
182
|
+
@make_xp_test_case(inconsistent)
|
183
|
+
class TestInconsistent:
|
184
|
+
|
185
|
+
def test_inconsistent_tdist(self, xp):
|
186
|
+
for depth in hierarchy_test_data.inconsistent_ytdist:
|
187
|
+
self.check_inconsistent_tdist(depth, xp)
|
188
|
+
|
189
|
+
def check_inconsistent_tdist(self, depth, xp):
|
190
|
+
Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
|
191
|
+
xp_assert_close(inconsistent(Z, depth),
|
192
|
+
xp.asarray(hierarchy_test_data.inconsistent_ytdist[depth]))
|
193
|
+
|
194
|
+
|
195
|
+
@make_xp_test_case(cophenet)
|
196
|
+
class TestCopheneticDistance:
|
197
|
+
|
198
|
+
def test_linkage_cophenet_tdist_Z(self, xp):
|
199
|
+
# Tests cophenet(Z) on tdist data set.
|
200
|
+
expectedM = xp.asarray([268, 295, 255, 255, 295, 295, 268, 268, 295, 295,
|
201
|
+
295, 138, 219, 295, 295])
|
202
|
+
Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
|
203
|
+
M = cophenet(Z)
|
204
|
+
xp_assert_close(M, xp.asarray(expectedM, dtype=xp.float64), atol=1e-10)
|
205
|
+
|
206
|
+
def test_linkage_cophenet_tdist_Z_Y(self, xp):
|
207
|
+
# Tests cophenet(Z, Y) on tdist data set.
|
208
|
+
Z = xp.asarray(hierarchy_test_data.linkage_ytdist_single)
|
209
|
+
(c, M) = cophenet(Z, xp.asarray(hierarchy_test_data.ytdist))
|
210
|
+
expectedM = xp.asarray([268, 295, 255, 255, 295, 295, 268, 268, 295, 295,
|
211
|
+
295, 138, 219, 295, 295], dtype=xp.float64)
|
212
|
+
expectedc = xp.asarray(0.639931296433393415057366837573, dtype=xp.float64)[()]
|
213
|
+
xp_assert_close(c, expectedc, atol=1e-10)
|
214
|
+
xp_assert_close(M, expectedM, atol=1e-10)
|
215
|
+
|
216
|
+
@skip_xp_backends("jax.numpy", reason="Can't raise inside jax.pure_callback")
|
217
|
+
def test_gh_22183(self, xp):
|
218
|
+
# check for lack of segfault
|
219
|
+
# (out of bounds memory access)
|
220
|
+
# and correct interception of
|
221
|
+
# invalid linkage matrix
|
222
|
+
arr=[[0.0, 1.0, 1.0, 2.0],
|
223
|
+
[2.0, 12.0, 1.0, 3.0],
|
224
|
+
[3.0, 4.0, 1.0, 2.0],
|
225
|
+
[5.0, 14.0, 1.0, 3.0],
|
226
|
+
[6.0, 7.0, 1.0, 2.0],
|
227
|
+
[8.0, 16.0, 1.0, 3.0],
|
228
|
+
[9.0, 10.0, 1.0, 2.0],
|
229
|
+
[11.0, 18.0, 1.0, 3.0],
|
230
|
+
[13.0, 15.0, 2.0, 6.0],
|
231
|
+
[17.0, 20.0, 2.0, 32.0],
|
232
|
+
[19.0, 21.0, 2.0, 12.0]]
|
233
|
+
with pytest.raises(ValueError, match="excessive observations"):
|
234
|
+
cophenet(xp.asarray(arr))
|
235
|
+
|
236
|
+
|
237
|
+
@make_xp_test_case(from_mlab_linkage, to_mlab_linkage)
|
238
|
+
class TestMLabLinkageConversion:
|
239
|
+
|
240
|
+
def test_mlab_linkage_conversion_empty(self, xp):
|
241
|
+
# Tests from/to_mlab_linkage on empty linkage array.
|
242
|
+
X = xp.asarray([], dtype=xp.float64)
|
243
|
+
xp_assert_equal(from_mlab_linkage(X), X)
|
244
|
+
xp_assert_equal(to_mlab_linkage(X), X)
|
245
|
+
|
246
|
+
def test_mlab_linkage_conversion_single_row(self, xp):
|
247
|
+
# Tests from/to_mlab_linkage on linkage array with single row.
|
248
|
+
Z = xp.asarray([[0., 1., 3., 2.]])
|
249
|
+
Zm = xp.asarray([[1, 2, 3]])
|
250
|
+
xp_assert_close(from_mlab_linkage(Zm), xp.asarray(Z, dtype=xp.float64),
|
251
|
+
rtol=1e-15)
|
252
|
+
xp_assert_close(to_mlab_linkage(Z), xp.asarray(Zm, dtype=xp.float64),
|
253
|
+
rtol=1e-15)
|
254
|
+
|
255
|
+
def test_mlab_linkage_conversion_multiple_rows(self, xp):
|
256
|
+
# Tests from/to_mlab_linkage on linkage array with multiple rows.
|
257
|
+
Zm = xp.asarray([[3, 6, 138], [4, 5, 219],
|
258
|
+
[1, 8, 255], [2, 9, 268], [7, 10, 295]])
|
259
|
+
Z = xp.asarray([[2., 5., 138., 2.],
|
260
|
+
[3., 4., 219., 2.],
|
261
|
+
[0., 7., 255., 3.],
|
262
|
+
[1., 8., 268., 4.],
|
263
|
+
[6., 9., 295., 6.]],
|
264
|
+
dtype=xp.float64)
|
265
|
+
xp_assert_close(from_mlab_linkage(Zm), Z, rtol=1e-15)
|
266
|
+
xp_assert_close(to_mlab_linkage(Z), xp.asarray(Zm, dtype=xp.float64),
|
267
|
+
rtol=1e-15)
|
268
|
+
|
269
|
+
|
270
|
+
@make_xp_test_case(fclusterdata)
|
271
|
+
class TestFclusterData:
|
272
|
+
|
273
|
+
@make_xp_test_case(is_isomorphic)
|
274
|
+
@pytest.mark.parametrize("criterion,t",
|
275
|
+
[("inconsistent", t) for t in hierarchy_test_data.fcluster_inconsistent]
|
276
|
+
+ [("distance", t) for t in hierarchy_test_data.fcluster_distance]
|
277
|
+
+ [("maxclust", t) for t in hierarchy_test_data.fcluster_maxclust]
|
278
|
+
)
|
279
|
+
def test_fclusterdata(self, t, criterion, xp):
|
280
|
+
# Tests fclusterdata(X, criterion=criterion, t=t) on a random 3-cluster data set
|
281
|
+
expectedT = xp.asarray(getattr(hierarchy_test_data, 'fcluster_' + criterion)[t])
|
282
|
+
X = xp.asarray(hierarchy_test_data.Q_X)
|
283
|
+
T = fclusterdata(X, criterion=criterion, t=t)
|
284
|
+
assert is_isomorphic(T, expectedT)
|
285
|
+
|
286
|
+
|
287
|
+
@make_xp_test_case(fcluster)
|
288
|
+
class TestFcluster:
|
289
|
+
|
290
|
+
@make_xp_test_case(single, is_isomorphic)
|
291
|
+
@pytest.mark.parametrize("criterion,t",
|
292
|
+
[("inconsistent", t) for t in hierarchy_test_data.fcluster_inconsistent]
|
293
|
+
+ [("distance", t) for t in hierarchy_test_data.fcluster_distance]
|
294
|
+
+ [("maxclust", t) for t in hierarchy_test_data.fcluster_maxclust]
|
295
|
+
)
|
296
|
+
def test_fcluster(self, t, criterion, xp):
|
297
|
+
# Tests fcluster(Z, criterion=criterion, t=t) on a random 3-cluster data set.
|
298
|
+
expectedT = xp.asarray(getattr(hierarchy_test_data, 'fcluster_' + criterion)[t])
|
299
|
+
Z = single(xp.asarray(hierarchy_test_data.Q_X))
|
300
|
+
T = fcluster(Z, criterion=criterion, t=t)
|
301
|
+
assert_(is_isomorphic(T, expectedT))
|
302
|
+
|
303
|
+
@make_xp_test_case(single, is_isomorphic, maxdists)
|
304
|
+
@pytest.mark.parametrize("t", hierarchy_test_data.fcluster_distance)
|
305
|
+
def test_fcluster_monocrit(self, t, xp):
|
306
|
+
expectedT = xp.asarray(hierarchy_test_data.fcluster_distance[t])
|
307
|
+
Z = single(xp.asarray(hierarchy_test_data.Q_X))
|
308
|
+
T = fcluster(Z, t, criterion='monocrit', monocrit=maxdists(Z))
|
309
|
+
assert_(is_isomorphic(T, expectedT))
|
310
|
+
|
311
|
+
@make_xp_test_case(single, is_isomorphic, maxdists)
|
312
|
+
@pytest.mark.parametrize("t", hierarchy_test_data.fcluster_maxclust)
|
313
|
+
def test_fcluster_maxclust_monocrit(self, t, xp):
|
314
|
+
expectedT = xp.asarray(hierarchy_test_data.fcluster_maxclust[t])
|
315
|
+
Z = single(xp.asarray(hierarchy_test_data.Q_X))
|
316
|
+
T = fcluster(Z, t, criterion='maxclust_monocrit', monocrit=maxdists(Z))
|
317
|
+
assert_(is_isomorphic(T, expectedT))
|
318
|
+
|
319
|
+
@make_xp_test_case(single)
|
320
|
+
def test_fcluster_maxclust_gh_12651(self, xp):
|
321
|
+
y = xp.asarray([[1], [4], [5]])
|
322
|
+
Z = single(y)
|
323
|
+
assert_array_equal(fcluster(Z, t=1, criterion="maxclust"),
|
324
|
+
xp.asarray([1, 1, 1]))
|
325
|
+
assert_array_equal(fcluster(Z, t=2, criterion="maxclust"),
|
326
|
+
xp.asarray([2, 1, 1]))
|
327
|
+
assert_array_equal(fcluster(Z, t=3, criterion="maxclust"),
|
328
|
+
xp.asarray([1, 2, 3]))
|
329
|
+
assert_array_equal(fcluster(Z, t=5, criterion="maxclust"),
|
330
|
+
xp.asarray([1, 2, 3]))
|
331
|
+
|
332
|
+
|
333
|
+
@make_xp_test_case(leaders)
|
334
|
+
class TestLeaders:
|
335
|
+
|
336
|
+
def test_leaders_single(self, xp):
|
337
|
+
# Tests leaders using a flat clustering generated by single linkage.
|
338
|
+
X = hierarchy_test_data.Q_X
|
339
|
+
Y = pdist(X)
|
340
|
+
Z = linkage(Y)
|
341
|
+
T = fcluster(Z, criterion='maxclust', t=3)
|
342
|
+
Z = xp.asarray(Z)
|
343
|
+
T = xp.asarray(T, dtype=xp.int32)
|
344
|
+
L = leaders(Z, T)
|
345
|
+
expect = xp.asarray([53, 55, 56, 2, 3, 1], dtype=xp.int32)
|
346
|
+
xp_assert_close(xp.concat(L), expect, rtol=1e-15)
|
347
|
+
|
348
|
+
|
349
|
+
@make_xp_test_case(is_isomorphic)
|
350
|
+
class TestIsIsomorphic:
|
351
|
+
|
352
|
+
def test_array_like(self):
|
353
|
+
assert is_isomorphic([1, 1, 1], [2, 2, 2])
|
354
|
+
assert is_isomorphic([], [])
|
355
|
+
|
356
|
+
def test_is_isomorphic_1(self, xp):
|
357
|
+
# Tests is_isomorphic on test case #1 (one flat cluster, different labellings)
|
358
|
+
a = xp.asarray([1, 1, 1])
|
359
|
+
b = xp.asarray([2, 2, 2])
|
360
|
+
assert is_isomorphic(a, b)
|
361
|
+
assert is_isomorphic(b, a)
|
362
|
+
|
363
|
+
def test_is_isomorphic_2(self, xp):
|
364
|
+
# Tests is_isomorphic on test case #2 (two flat clusters, different labelings)
|
365
|
+
a = xp.asarray([1, 7, 1])
|
366
|
+
b = xp.asarray([2, 3, 2])
|
367
|
+
assert is_isomorphic(a, b)
|
368
|
+
assert is_isomorphic(b, a)
|
369
|
+
|
370
|
+
def test_is_isomorphic_3(self, xp):
|
371
|
+
# Tests is_isomorphic on test case #3 (no flat clusters)
|
372
|
+
a = xp.asarray([])
|
373
|
+
b = xp.asarray([])
|
374
|
+
assert is_isomorphic(a, b)
|
375
|
+
|
376
|
+
def test_is_isomorphic_4A(self, xp):
|
377
|
+
# Tests is_isomorphic on test case #4A
|
378
|
+
# (3 flat clusters, different labelings, isomorphic)
|
379
|
+
a = xp.asarray([1, 2, 3])
|
380
|
+
b = xp.asarray([1, 3, 2])
|
381
|
+
assert is_isomorphic(a, b)
|
382
|
+
assert is_isomorphic(b, a)
|
383
|
+
|
384
|
+
def test_is_isomorphic_4B(self, xp):
|
385
|
+
# Tests is_isomorphic on test case #4B
|
386
|
+
# (3 flat clusters, different labelings, nonisomorphic)
|
387
|
+
a = xp.asarray([1, 2, 3, 3])
|
388
|
+
b = xp.asarray([1, 3, 2, 3])
|
389
|
+
assert not is_isomorphic(a, b)
|
390
|
+
assert not is_isomorphic(b, a)
|
391
|
+
|
392
|
+
def test_is_isomorphic_4C(self, xp):
|
393
|
+
# Tests is_isomorphic on test case #4C
|
394
|
+
# (3 flat clusters, different labelings, isomorphic)
|
395
|
+
a = xp.asarray([7, 2, 3])
|
396
|
+
b = xp.asarray([6, 3, 2])
|
397
|
+
assert is_isomorphic(a, b)
|
398
|
+
assert is_isomorphic(b, a)
|
399
|
+
|
400
|
+
@pytest.mark.parametrize("nclusters", [2, 3, 5])
|
401
|
+
def test_is_isomorphic_5(self, nclusters, xp):
|
402
|
+
# Tests is_isomorphic on test case #5 (1000 observations, 2/3/5 random
|
403
|
+
# clusters, random permutation of the labeling).
|
404
|
+
self.is_isomorphic_randperm(1000, nclusters, xp=xp)
|
405
|
+
|
406
|
+
@pytest.mark.parametrize("nclusters", [2, 3, 5])
|
407
|
+
def test_is_isomorphic_6(self, nclusters, xp):
|
408
|
+
# Tests is_isomorphic on test case #5A (1000 observations, 2/3/5 random
|
409
|
+
# clusters, random permutation of the labeling, slightly
|
410
|
+
# nonisomorphic.)
|
411
|
+
self.is_isomorphic_randperm(1000, nclusters, True, 5, xp=xp)
|
412
|
+
|
413
|
+
def test_is_isomorphic_7(self, xp):
|
414
|
+
# Regression test for gh-6271
|
415
|
+
a = xp.asarray([1, 2, 3])
|
416
|
+
b = xp.asarray([1, 1, 1])
|
417
|
+
assert not is_isomorphic(a, b)
|
418
|
+
|
419
|
+
def is_isomorphic_randperm(self, nobs, nclusters, noniso=False, nerrors=0, *, xp):
|
420
|
+
for _ in range(3):
|
421
|
+
a = (np.random.rand(nobs) * nclusters).astype(int)
|
422
|
+
b = np.zeros(a.size, dtype=int)
|
423
|
+
P = np.random.permutation(nclusters)
|
424
|
+
for i in range(0, a.shape[0]):
|
425
|
+
b[i] = P[a[i]]
|
426
|
+
if noniso:
|
427
|
+
Q = np.random.permutation(nobs)
|
428
|
+
b[Q[0:nerrors]] += 1
|
429
|
+
b[Q[0:nerrors]] %= nclusters
|
430
|
+
a = xp.asarray(a)
|
431
|
+
b = xp.asarray(b)
|
432
|
+
assert is_isomorphic(a, b) == (not noniso)
|
433
|
+
assert is_isomorphic(b, a) == (not noniso)
|
434
|
+
|
435
|
+
|
436
|
+
@make_xp_test_case(is_valid_linkage)
|
437
|
+
class TestIsValidLinkage:
|
438
|
+
|
439
|
+
@pytest.mark.parametrize("nrow, ncol, valid", [(2, 5, False), (2, 3, False),
|
440
|
+
(1, 4, True), (2, 4, True)])
|
441
|
+
def test_is_valid_linkage_various_size(self, nrow, ncol, valid, xp):
|
442
|
+
# Tests is_valid_linkage(Z) with linkage matrices of various sizes
|
443
|
+
Z = xp.asarray([[0, 1, 3.0, 2, 5],
|
444
|
+
[3, 2, 4.0, 3, 3]], dtype=xp.float64)
|
445
|
+
Z = Z[:nrow, :ncol]
|
446
|
+
xp_assert_equal(is_valid_linkage(Z), valid, check_namespace=False)
|
447
|
+
if not valid:
|
448
|
+
assert_raises(ValueError, is_valid_linkage, Z, throw=True)
|
449
|
+
|
450
|
+
def test_is_valid_linkage_int_type(self, xp):
|
451
|
+
# Tests is_valid_linkage(Z) with integer type.
|
452
|
+
Z = xp.asarray([[0, 1, 3.0, 2],
|
453
|
+
[3, 2, 4.0, 3]], dtype=xp.int64)
|
454
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
455
|
+
assert_raises(TypeError, is_valid_linkage, Z, throw=True)
|
456
|
+
|
457
|
+
def test_is_valid_linkage_empty(self, xp):
|
458
|
+
# Tests is_valid_linkage(Z) with empty linkage.
|
459
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
460
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
461
|
+
assert_raises(ValueError, is_valid_linkage, Z, throw=True)
|
462
|
+
|
463
|
+
def test_is_valid_linkage_4_and_up(self, xp):
|
464
|
+
# Tests is_valid_linkage(Z) on linkage on observation sets between
|
465
|
+
# sizes 4 and 15 (step size 3).
|
466
|
+
for i in range(4, 15, 3):
|
467
|
+
y = np.random.rand(i*(i-1)//2)
|
468
|
+
Z = xp.asarray(linkage(y))
|
469
|
+
y = xp.asarray(y)
|
470
|
+
xp_assert_equal(is_valid_linkage(Z), True, check_namespace=False)
|
471
|
+
|
472
|
+
def test_is_valid_linkage_4_and_up_neg_index_left(self, xp):
|
473
|
+
# Tests is_valid_linkage(Z) on linkage on observation sets between
|
474
|
+
# sizes 4 and 15 (step size 3) with negative indices (left).
|
475
|
+
for i in range(4, 15, 3):
|
476
|
+
y = np.random.rand(i*(i-1)//2)
|
477
|
+
Z = xp.asarray(linkage(y))
|
478
|
+
y = xp.asarray(y)
|
479
|
+
Z = xpx.at(Z)[i//2, 0].set(-2)
|
480
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
481
|
+
with pytest.raises(ValueError):
|
482
|
+
eager.is_valid_linkage(Z, throw=True)
|
483
|
+
|
484
|
+
def test_is_valid_linkage_4_and_up_neg_index_right(self, xp):
|
485
|
+
# Tests is_valid_linkage(Z) on linkage on observation sets between
|
486
|
+
# sizes 4 and 15 (step size 3) with negative indices (right).
|
487
|
+
for i in range(4, 15, 3):
|
488
|
+
y = np.random.rand(i*(i-1)//2)
|
489
|
+
Z = xp.asarray(linkage(y))
|
490
|
+
y = xp.asarray(y)
|
491
|
+
Z = xpx.at(Z)[i//2, 1].set(-2)
|
492
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
493
|
+
with pytest.raises(ValueError):
|
494
|
+
eager.is_valid_linkage(Z, throw=True)
|
495
|
+
|
496
|
+
def test_is_valid_linkage_4_and_up_neg_dist(self, xp):
|
497
|
+
# Tests is_valid_linkage(Z) on linkage on observation sets between
|
498
|
+
# sizes 4 and 15 (step size 3) with negative distances.
|
499
|
+
for i in range(4, 15, 3):
|
500
|
+
y = np.random.rand(i*(i-1)//2)
|
501
|
+
Z = xp.asarray(linkage(y))
|
502
|
+
y = xp.asarray(y)
|
503
|
+
Z = xpx.at(Z)[i//2, 2].set(-0.5)
|
504
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
505
|
+
with pytest.raises(ValueError):
|
506
|
+
eager.is_valid_linkage(Z, throw=True)
|
507
|
+
|
508
|
+
def test_is_valid_linkage_4_and_up_neg_counts(self, xp):
|
509
|
+
# Tests is_valid_linkage(Z) on linkage on observation sets between
|
510
|
+
# sizes 4 and 15 (step size 3) with negative counts.
|
511
|
+
for i in range(4, 15, 3):
|
512
|
+
y = np.random.rand(i*(i-1)//2)
|
513
|
+
Z = xp.asarray(linkage(y))
|
514
|
+
y = xp.asarray(y)
|
515
|
+
Z = xpx.at(Z)[i//2, 3].set(-2)
|
516
|
+
xp_assert_equal(is_valid_linkage(Z), False, check_namespace=False)
|
517
|
+
with pytest.raises(ValueError):
|
518
|
+
eager.is_valid_linkage(Z, throw=True)
|
519
|
+
|
520
|
+
|
521
|
+
@make_xp_test_case(is_valid_im)
|
522
|
+
class TestIsValidInconsistent:
|
523
|
+
|
524
|
+
def test_is_valid_im_int_type(self, xp):
|
525
|
+
# Tests is_valid_im(R) with integer type.
|
526
|
+
R = xp.asarray([[0, 1, 3.0, 2],
|
527
|
+
[3, 2, 4.0, 3]], dtype=xp.int64)
|
528
|
+
xp_assert_equal(is_valid_im(R), False, check_namespace=False)
|
529
|
+
assert_raises(TypeError, is_valid_im, R, throw=True)
|
530
|
+
|
531
|
+
@pytest.mark.parametrize("nrow, ncol, valid", [(2, 5, False), (2, 3, False),
|
532
|
+
(1, 4, True), (2, 4, True)])
|
533
|
+
def test_is_valid_im_various_size(self, nrow, ncol, valid, xp):
|
534
|
+
# Tests is_valid_im(R) with linkage matrices of various sizes
|
535
|
+
R = xp.asarray([[0, 1, 3.0, 2, 5],
|
536
|
+
[3, 2, 4.0, 3, 3]], dtype=xp.float64)
|
537
|
+
R = R[:nrow, :ncol]
|
538
|
+
xp_assert_equal(is_valid_im(R), valid, check_namespace=False)
|
539
|
+
if not valid:
|
540
|
+
assert_raises(ValueError, is_valid_im, R, throw=True)
|
541
|
+
|
542
|
+
def test_is_valid_im_empty(self, xp):
|
543
|
+
# Tests is_valid_im(R) with empty inconsistency matrix.
|
544
|
+
R = xp.zeros((0, 4), dtype=xp.float64)
|
545
|
+
xp_assert_equal(is_valid_im(R), False, check_namespace=False)
|
546
|
+
assert_raises(ValueError, is_valid_im, R, throw=True)
|
547
|
+
|
548
|
+
def test_is_valid_im_4_and_up(self, xp):
|
549
|
+
# Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
|
550
|
+
# (step size 3).
|
551
|
+
for i in range(4, 15, 3):
|
552
|
+
y = np.random.rand(i*(i-1)//2)
|
553
|
+
Z = linkage(y)
|
554
|
+
R = inconsistent(Z)
|
555
|
+
R = xp.asarray(R)
|
556
|
+
xp_assert_equal(is_valid_im(R), True, check_namespace=False)
|
557
|
+
|
558
|
+
def test_is_valid_im_4_and_up_neg_index_left(self, xp):
|
559
|
+
# Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
|
560
|
+
# (step size 3) with negative link height means.
|
561
|
+
for i in range(4, 15, 3):
|
562
|
+
y = np.random.rand(i*(i-1)//2)
|
563
|
+
Z = linkage(y)
|
564
|
+
R = inconsistent(Z)
|
565
|
+
R = xpx.at(R)[i//2 , 0].set(-2.0)
|
566
|
+
R = xp.asarray(R)
|
567
|
+
xp_assert_equal(is_valid_im(R), False, check_namespace=False)
|
568
|
+
with pytest.raises(ValueError):
|
569
|
+
eager.is_valid_im(R, throw=True)
|
570
|
+
|
571
|
+
def test_is_valid_im_4_and_up_neg_index_right(self, xp):
|
572
|
+
# Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
|
573
|
+
# (step size 3) with negative link height standard deviations.
|
574
|
+
for i in range(4, 15, 3):
|
575
|
+
y = np.random.rand(i*(i-1)//2)
|
576
|
+
Z = linkage(y)
|
577
|
+
R = inconsistent(Z)
|
578
|
+
R = xpx.at(R)[i//2 , 1].set(-2.0)
|
579
|
+
R = xp.asarray(R)
|
580
|
+
xp_assert_equal(is_valid_im(R), False, check_namespace=False)
|
581
|
+
with pytest.raises(ValueError):
|
582
|
+
eager.is_valid_im(R, throw=True)
|
583
|
+
|
584
|
+
def test_is_valid_im_4_and_up_neg_dist(self, xp):
|
585
|
+
# Tests is_valid_im(R) on im on observation sets between sizes 4 and 15
|
586
|
+
# (step size 3) with negative link counts.
|
587
|
+
for i in range(4, 15, 3):
|
588
|
+
y = np.random.rand(i*(i-1)//2)
|
589
|
+
Z = linkage(y)
|
590
|
+
R = inconsistent(Z)
|
591
|
+
R = xpx.at(R)[i//2, 2].set(-0.5)
|
592
|
+
R = xp.asarray(R)
|
593
|
+
xp_assert_equal(is_valid_im(R), False, check_namespace=False)
|
594
|
+
with pytest.raises(ValueError):
|
595
|
+
eager.is_valid_im(R, throw=True)
|
596
|
+
|
597
|
+
|
598
|
+
class TestNumObsLinkage:
|
599
|
+
|
600
|
+
def test_num_obs_linkage_empty(self, xp):
|
601
|
+
# Tests num_obs_linkage(Z) with empty linkage.
|
602
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
603
|
+
assert_raises(ValueError, num_obs_linkage, Z)
|
604
|
+
|
605
|
+
def test_num_obs_linkage_1x4(self, xp):
|
606
|
+
# Tests num_obs_linkage(Z) on linkage over 2 observations.
|
607
|
+
Z = xp.asarray([[0, 1, 3.0, 2]], dtype=xp.float64)
|
608
|
+
assert num_obs_linkage(Z) == 2
|
609
|
+
|
610
|
+
def test_num_obs_linkage_2x4(self, xp):
|
611
|
+
# Tests num_obs_linkage(Z) on linkage over 3 observations.
|
612
|
+
Z = xp.asarray([[0, 1, 3.0, 2],
|
613
|
+
[3, 2, 4.0, 3]], dtype=xp.float64)
|
614
|
+
assert num_obs_linkage(Z) == 3
|
615
|
+
|
616
|
+
def test_num_obs_linkage_4_and_up(self, xp):
|
617
|
+
# Tests num_obs_linkage(Z) on linkage on observation sets between sizes
|
618
|
+
# 4 and 15 (step size 3).
|
619
|
+
for i in range(4, 15, 3):
|
620
|
+
y = np.random.rand(i*(i-1)//2)
|
621
|
+
Z = xp.asarray(linkage(y))
|
622
|
+
assert num_obs_linkage(Z) == i
|
623
|
+
|
624
|
+
def test_num_obs_linkage_multi_matrix(self, xp):
|
625
|
+
# Tests num_obs_linkage with observation matrices of multiple sizes.
|
626
|
+
for n in range(2, 10):
|
627
|
+
X = np.random.rand(n, 4)
|
628
|
+
Y = pdist(X)
|
629
|
+
Z = xp.asarray(linkage(Y))
|
630
|
+
assert num_obs_linkage(Z) == n
|
631
|
+
|
632
|
+
|
633
|
+
@make_xp_test_case(leaves_list, to_tree)
|
634
|
+
class TestLeavesList:
|
635
|
+
|
636
|
+
def test_leaves_list_1x4(self, xp):
|
637
|
+
# Tests leaves_list(Z) on a 1x4 linkage.
|
638
|
+
Z = xp.asarray([[0, 1, 3.0, 2]], dtype=xp.float64)
|
639
|
+
to_tree(Z)
|
640
|
+
assert_allclose(leaves_list(Z), [0, 1], rtol=1e-15)
|
641
|
+
|
642
|
+
def test_leaves_list_2x4(self, xp):
|
643
|
+
# Tests leaves_list(Z) on a 2x4 linkage.
|
644
|
+
Z = xp.asarray([[0, 1, 3.0, 2],
|
645
|
+
[3, 2, 4.0, 3]], dtype=xp.float64)
|
646
|
+
to_tree(Z)
|
647
|
+
assert_allclose(leaves_list(Z), [0, 1, 2], rtol=1e-15)
|
648
|
+
|
649
|
+
@pytest.mark.parametrize("method",
|
650
|
+
['single', 'complete', 'average', 'weighted', 'centroid', 'median', 'ward'])
|
651
|
+
def test_leaves_list_Q(self, method, xp):
|
652
|
+
# Tests leaves_list(Z) on the Q data set
|
653
|
+
X = hierarchy_test_data.Q_X
|
654
|
+
Z = xp.asarray(linkage(X, method))
|
655
|
+
node = to_tree(Z)
|
656
|
+
assert_allclose(node.pre_order(), leaves_list(Z), rtol=1e-15)
|
657
|
+
|
658
|
+
def test_Q_subtree_pre_order(self, xp):
|
659
|
+
# Tests that pre_order() works when called on sub-trees.
|
660
|
+
X = hierarchy_test_data.Q_X
|
661
|
+
Z = xp.asarray(linkage(X, 'single'))
|
662
|
+
node = to_tree(Z)
|
663
|
+
assert_allclose(node.pre_order(),
|
664
|
+
(node.get_left().pre_order() + node.get_right().pre_order()),
|
665
|
+
rtol=1e-15)
|
666
|
+
|
667
|
+
|
668
|
+
@make_xp_test_case(correspond)
|
669
|
+
class TestCorrespond:
|
670
|
+
|
671
|
+
def test_correspond_empty(self, xp):
|
672
|
+
# Tests correspond(Z, y) with empty linkage and condensed distance matrix.
|
673
|
+
y = xp.zeros((0,), dtype=xp.float64)
|
674
|
+
Z = xp.zeros((0,4), dtype=xp.float64)
|
675
|
+
assert_raises(ValueError, correspond, Z, y)
|
676
|
+
|
677
|
+
def test_correspond_2_and_up(self, xp):
|
678
|
+
# Tests correspond(Z, y) on linkage and CDMs over observation sets of
|
679
|
+
# different sizes.
|
680
|
+
for i in range(2, 4):
|
681
|
+
y = np.random.rand(i*(i-1)//2)
|
682
|
+
Z = xp.asarray(linkage(y))
|
683
|
+
y = xp.asarray(y)
|
684
|
+
assert_(correspond(Z, y))
|
685
|
+
for i in range(4, 15, 3):
|
686
|
+
y = np.random.rand(i*(i-1)//2)
|
687
|
+
Z = xp.asarray(linkage(y))
|
688
|
+
y = xp.asarray(y)
|
689
|
+
assert_(correspond(Z, y))
|
690
|
+
|
691
|
+
def test_correspond_4_and_up(self, xp):
|
692
|
+
# Tests correspond(Z, y) on linkage and CDMs over observation sets of
|
693
|
+
# different sizes. Correspondence should be false.
|
694
|
+
for (i, j) in (list(zip(list(range(2, 4)), list(range(3, 5)))) +
|
695
|
+
list(zip(list(range(3, 5)), list(range(2, 4))))):
|
696
|
+
y = np.random.rand(i*(i-1)//2)
|
697
|
+
y2 = np.random.rand(j*(j-1)//2)
|
698
|
+
Z = xp.asarray(linkage(y))
|
699
|
+
Z2 = xp.asarray(linkage(y2))
|
700
|
+
y = xp.asarray(y)
|
701
|
+
y2 = xp.asarray(y2)
|
702
|
+
assert not correspond(Z, y2)
|
703
|
+
assert not correspond(Z2, y)
|
704
|
+
|
705
|
+
def test_correspond_4_and_up_2(self, xp):
|
706
|
+
# Tests correspond(Z, y) on linkage and CDMs over observation sets of
|
707
|
+
# different sizes. Correspondence should be false.
|
708
|
+
for (i, j) in (list(zip(list(range(2, 7)), list(range(16, 21)))) +
|
709
|
+
list(zip(list(range(2, 7)), list(range(16, 21))))):
|
710
|
+
y = np.random.rand(i*(i-1)//2)
|
711
|
+
y2 = np.random.rand(j*(j-1)//2)
|
712
|
+
Z = xp.asarray(linkage(y))
|
713
|
+
Z2 = xp.asarray(linkage(y2))
|
714
|
+
y = xp.asarray(y)
|
715
|
+
y2 = xp.asarray(y2)
|
716
|
+
assert not correspond(Z, y2)
|
717
|
+
assert not correspond(Z2, y)
|
718
|
+
|
719
|
+
|
720
|
+
@make_xp_test_case(is_monotonic)
|
721
|
+
class TestIsMonotonic:
|
722
|
+
|
723
|
+
def test_is_monotonic_empty(self, xp):
|
724
|
+
# Tests is_monotonic(Z) on an empty linkage.
|
725
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
726
|
+
assert_raises(ValueError, is_monotonic, Z)
|
727
|
+
|
728
|
+
def test_is_monotonic_1x4(self, xp):
|
729
|
+
# Tests is_monotonic(Z) on 1x4 linkage. Expecting True.
|
730
|
+
Z = xp.asarray([[0, 1, 0.3, 2]], dtype=xp.float64)
|
731
|
+
assert is_monotonic(Z)
|
732
|
+
|
733
|
+
def test_is_monotonic_2x4_T(self, xp):
|
734
|
+
# Tests is_monotonic(Z) on 2x4 linkage. Expecting True.
|
735
|
+
Z = xp.asarray([[0, 1, 0.3, 2],
|
736
|
+
[2, 3, 0.4, 3]], dtype=xp.float64)
|
737
|
+
assert is_monotonic(Z)
|
738
|
+
|
739
|
+
def test_is_monotonic_2x4_F(self, xp):
|
740
|
+
# Tests is_monotonic(Z) on 2x4 linkage. Expecting False.
|
741
|
+
Z = xp.asarray([[0, 1, 0.4, 2],
|
742
|
+
[2, 3, 0.3, 3]], dtype=xp.float64)
|
743
|
+
assert not is_monotonic(Z)
|
744
|
+
|
745
|
+
def test_is_monotonic_3x4_T(self, xp):
|
746
|
+
# Tests is_monotonic(Z) on 3x4 linkage. Expecting True.
|
747
|
+
Z = xp.asarray([[0, 1, 0.3, 2],
|
748
|
+
[2, 3, 0.4, 2],
|
749
|
+
[4, 5, 0.6, 4]], dtype=xp.float64)
|
750
|
+
assert is_monotonic(Z)
|
751
|
+
|
752
|
+
def test_is_monotonic_3x4_F1(self, xp):
|
753
|
+
# Tests is_monotonic(Z) on 3x4 linkage (case 1). Expecting False.
|
754
|
+
Z = xp.asarray([[0, 1, 0.3, 2],
|
755
|
+
[2, 3, 0.2, 2],
|
756
|
+
[4, 5, 0.6, 4]], dtype=xp.float64)
|
757
|
+
assert not is_monotonic(Z)
|
758
|
+
|
759
|
+
def test_is_monotonic_3x4_F2(self, xp):
|
760
|
+
# Tests is_monotonic(Z) on 3x4 linkage (case 2). Expecting False.
|
761
|
+
Z = xp.asarray([[0, 1, 0.8, 2],
|
762
|
+
[2, 3, 0.4, 2],
|
763
|
+
[4, 5, 0.6, 4]], dtype=xp.float64)
|
764
|
+
assert not is_monotonic(Z)
|
765
|
+
|
766
|
+
def test_is_monotonic_3x4_F3(self, xp):
|
767
|
+
# Tests is_monotonic(Z) on 3x4 linkage (case 3). Expecting False
|
768
|
+
Z = xp.asarray([[0, 1, 0.3, 2],
|
769
|
+
[2, 3, 0.4, 2],
|
770
|
+
[4, 5, 0.2, 4]], dtype=xp.float64)
|
771
|
+
assert not is_monotonic(Z)
|
772
|
+
|
773
|
+
def test_is_monotonic_tdist_linkage1(self, xp):
|
774
|
+
# Tests is_monotonic(Z) on clustering generated by single linkage on
|
775
|
+
# tdist data set. Expecting True.
|
776
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
777
|
+
assert is_monotonic(Z)
|
778
|
+
|
779
|
+
def test_is_monotonic_tdist_linkage2(self, xp):
|
780
|
+
# Tests is_monotonic(Z) on clustering generated by single linkage on
|
781
|
+
# tdist data set. Perturbing. Expecting False.
|
782
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
783
|
+
Z = xpx.at(Z)[2, 2].set(0.0)
|
784
|
+
assert not is_monotonic(Z)
|
785
|
+
|
786
|
+
def test_is_monotonic_Q_linkage(self, xp):
|
787
|
+
# Tests is_monotonic(Z) on clustering generated by single linkage on
|
788
|
+
# Q data set. Expecting True.
|
789
|
+
X = hierarchy_test_data.Q_X
|
790
|
+
Z = xp.asarray(linkage(X, 'single'))
|
791
|
+
assert is_monotonic(Z)
|
792
|
+
|
793
|
+
|
794
|
+
@make_xp_test_case(maxdists)
|
795
|
+
class TestMaxDists:
|
796
|
+
|
797
|
+
def test_maxdists_empty_linkage(self, xp):
|
798
|
+
# Tests maxdists(Z) on empty linkage. Expecting exception.
|
799
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
800
|
+
assert_raises(ValueError, maxdists, Z)
|
801
|
+
|
802
|
+
def test_maxdists_one_cluster_linkage(self, xp):
|
803
|
+
# Tests maxdists(Z) on linkage with one cluster.
|
804
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
805
|
+
MD = maxdists(Z)
|
806
|
+
expectedMD = calculate_maximum_distances(Z, xp)
|
807
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
808
|
+
|
809
|
+
@pytest.mark.parametrize(
|
810
|
+
"method", ['single', 'complete', 'ward', 'centroid', 'median'])
|
811
|
+
def test_maxdists_Q_linkage(self, method, xp):
|
812
|
+
# Tests maxdists(Z) on the Q data set
|
813
|
+
X = hierarchy_test_data.Q_X
|
814
|
+
Z = xp.asarray(linkage(X, method))
|
815
|
+
MD = maxdists(Z)
|
816
|
+
expectedMD = calculate_maximum_distances(Z, xp)
|
817
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
818
|
+
|
819
|
+
|
820
|
+
@make_xp_test_case(maxinconsts)
|
821
|
+
class TestMaxInconsts:
|
822
|
+
|
823
|
+
def test_maxinconsts_empty_linkage(self, xp):
|
824
|
+
# Tests maxinconsts(Z, R) on empty linkage. Expecting exception.
|
825
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
826
|
+
R = xp.zeros((0, 4), dtype=xp.float64)
|
827
|
+
assert_raises(ValueError, maxinconsts, Z, R)
|
828
|
+
|
829
|
+
def test_maxinconsts_difrow_linkage(self, xp):
|
830
|
+
# Tests maxinconsts(Z, R) on linkage and inconsistency matrices with
|
831
|
+
# different numbers of clusters. Expecting exception.
|
832
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
833
|
+
R = np.random.rand(2, 4)
|
834
|
+
R = xp.asarray(R)
|
835
|
+
assert_raises(ValueError, maxinconsts, Z, R)
|
836
|
+
|
837
|
+
def test_maxinconsts_one_cluster_linkage(self, xp):
|
838
|
+
# Tests maxinconsts(Z, R) on linkage with one cluster.
|
839
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
840
|
+
R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
|
841
|
+
MD = maxinconsts(Z, R)
|
842
|
+
expectedMD = calculate_maximum_inconsistencies(Z, R, xp=xp)
|
843
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
844
|
+
|
845
|
+
@pytest.mark.parametrize(
|
846
|
+
"method", ['single', 'complete', 'ward', 'centroid', 'median'])
|
847
|
+
def test_maxinconsts_Q_linkage(self, method, xp):
|
848
|
+
# Tests maxinconsts(Z, R) on the Q data set
|
849
|
+
X = hierarchy_test_data.Q_X
|
850
|
+
Z = linkage(X, method)
|
851
|
+
R = xp.asarray(inconsistent(Z))
|
852
|
+
Z = xp.asarray(Z)
|
853
|
+
MD = maxinconsts(Z, R)
|
854
|
+
expectedMD = calculate_maximum_inconsistencies(Z, R, xp=xp)
|
855
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
856
|
+
|
857
|
+
|
858
|
+
@make_xp_test_case(maxRstat)
|
859
|
+
class TestMaxRStat:
|
860
|
+
|
861
|
+
def test_maxRstat_invalid_index(self, xp):
|
862
|
+
# Tests maxRstat(Z, R, i). Expecting exception.
|
863
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
864
|
+
R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
|
865
|
+
with pytest.raises(TypeError):
|
866
|
+
maxRstat(Z, R, 3.3)
|
867
|
+
with pytest.raises(ValueError):
|
868
|
+
maxRstat(Z, R, -1)
|
869
|
+
with pytest.raises(ValueError):
|
870
|
+
maxRstat(Z, R, 4)
|
871
|
+
|
872
|
+
@pytest.mark.parametrize("i", range(4))
|
873
|
+
def test_maxRstat_empty_linkage(self, i, xp):
|
874
|
+
# Tests maxRstat(Z, R, i) on empty linkage. Expecting exception.
|
875
|
+
Z = xp.zeros((0, 4), dtype=xp.float64)
|
876
|
+
R = xp.zeros((0, 4), dtype=xp.float64)
|
877
|
+
assert_raises(ValueError, maxRstat, Z, R, i)
|
878
|
+
|
879
|
+
@pytest.mark.parametrize("i", range(4))
|
880
|
+
def test_maxRstat_difrow_linkage(self, i, xp):
|
881
|
+
# Tests maxRstat(Z, R, i) on linkage and inconsistency matrices with
|
882
|
+
# different numbers of clusters. Expecting exception.
|
883
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
884
|
+
R = np.random.rand(2, 4)
|
885
|
+
R = xp.asarray(R)
|
886
|
+
assert_raises(ValueError, maxRstat, Z, R, i)
|
887
|
+
|
888
|
+
def test_maxRstat_one_cluster_linkage(self, xp):
|
889
|
+
# Tests maxRstat(Z, R, i) on linkage with one cluster.
|
890
|
+
Z = xp.asarray([[0, 1, 0.3, 4]], dtype=xp.float64)
|
891
|
+
R = xp.asarray([[0, 0, 0, 0.3]], dtype=xp.float64)
|
892
|
+
MD = maxRstat(Z, R, 1)
|
893
|
+
expectedMD = calculate_maximum_inconsistencies(Z, R, 1, xp)
|
894
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
895
|
+
|
896
|
+
@pytest.mark.parametrize(
|
897
|
+
"method", ['single', 'complete', 'ward', 'centroid', 'median'])
|
898
|
+
def test_maxRstat_Q_linkage(self, method, xp):
|
899
|
+
# Tests maxRstat(Z, R, 1) on the Q data set
|
900
|
+
X = hierarchy_test_data.Q_X
|
901
|
+
Z = linkage(X, method)
|
902
|
+
R = xp.asarray(inconsistent(Z))
|
903
|
+
Z = xp.asarray(Z)
|
904
|
+
MD = maxRstat(Z, R, 1)
|
905
|
+
expectedMD = calculate_maximum_inconsistencies(Z, R, 1, xp)
|
906
|
+
xp_assert_close(MD, expectedMD, atol=1e-15)
|
907
|
+
|
908
|
+
|
909
|
+
@make_xp_test_case(dendrogram)
|
910
|
+
class TestDendrogram:
|
911
|
+
|
912
|
+
def test_dendrogram_single_linkage_tdist(self, xp):
|
913
|
+
# Tests dendrogram calculation on single linkage of the tdist data set.
|
914
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
915
|
+
R = dendrogram(Z, no_plot=True)
|
916
|
+
leaves = R["leaves"]
|
917
|
+
assert_equal(leaves, [2, 5, 1, 0, 3, 4])
|
918
|
+
|
919
|
+
def test_valid_orientation(self, xp):
|
920
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
921
|
+
assert_raises(ValueError, dendrogram, Z, orientation="foo")
|
922
|
+
|
923
|
+
def test_labels_as_array_or_list(self, xp):
|
924
|
+
# test for gh-12418
|
925
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
926
|
+
labels = [1, 3, 2, 6, 4, 5]
|
927
|
+
result1 = dendrogram(Z, labels=xp.asarray(labels), no_plot=True)
|
928
|
+
result2 = dendrogram(Z, labels=labels, no_plot=True)
|
929
|
+
assert result1 == result2
|
930
|
+
|
931
|
+
@pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
|
932
|
+
def test_valid_label_size(self, xp):
|
933
|
+
link = xp.asarray([
|
934
|
+
[0, 1, 1.0, 4],
|
935
|
+
[2, 3, 1.0, 5],
|
936
|
+
[4, 5, 2.0, 6],
|
937
|
+
])
|
938
|
+
plt.figure()
|
939
|
+
with pytest.raises(ValueError) as exc_info:
|
940
|
+
dendrogram(link, labels=list(range(100)))
|
941
|
+
assert "Dimensions of Z and labels must be consistent."\
|
942
|
+
in str(exc_info.value)
|
943
|
+
|
944
|
+
with pytest.raises(
|
945
|
+
ValueError,
|
946
|
+
match="Dimensions of Z and labels must be consistent."):
|
947
|
+
dendrogram(link, labels=[])
|
948
|
+
|
949
|
+
plt.close()
|
950
|
+
|
951
|
+
@skip_xp_backends('torch',
|
952
|
+
reason='MPL 3.9.2 & torch DeprecationWarning from __array_wrap__'
|
953
|
+
' and NumPy 2.0'
|
954
|
+
)
|
955
|
+
@skip_xp_backends('dask.array',
|
956
|
+
reason='dask.array has bad interaction with matplotlib'
|
957
|
+
)
|
958
|
+
@pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
|
959
|
+
@pytest.mark.parametrize("orientation", ['top', 'bottom', 'left', 'right'])
|
960
|
+
def test_dendrogram_plot(self, orientation, xp):
|
961
|
+
# Tests dendrogram plotting.
|
962
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
963
|
+
expected = {'color_list': ['C1', 'C0', 'C0', 'C0', 'C0'],
|
964
|
+
'dcoord': [[0.0, 138.0, 138.0, 0.0],
|
965
|
+
[0.0, 219.0, 219.0, 0.0],
|
966
|
+
[0.0, 255.0, 255.0, 219.0],
|
967
|
+
[0.0, 268.0, 268.0, 255.0],
|
968
|
+
[138.0, 295.0, 295.0, 268.0]],
|
969
|
+
'icoord': [[5.0, 5.0, 15.0, 15.0],
|
970
|
+
[45.0, 45.0, 55.0, 55.0],
|
971
|
+
[35.0, 35.0, 50.0, 50.0],
|
972
|
+
[25.0, 25.0, 42.5, 42.5],
|
973
|
+
[10.0, 10.0, 33.75, 33.75]],
|
974
|
+
'ivl': ['2', '5', '1', '0', '3', '4'],
|
975
|
+
'leaves': [2, 5, 1, 0, 3, 4],
|
976
|
+
'leaves_color_list': ['C1', 'C1', 'C0', 'C0', 'C0', 'C0'],
|
977
|
+
}
|
978
|
+
|
979
|
+
fig = plt.figure()
|
980
|
+
ax = fig.add_subplot(221)
|
981
|
+
|
982
|
+
# test that dendrogram accepts ax keyword
|
983
|
+
R1 = dendrogram(Z, ax=ax, orientation=orientation)
|
984
|
+
R1['dcoord'] = np.asarray(R1['dcoord'])
|
985
|
+
assert_equal(R1, expected)
|
986
|
+
|
987
|
+
# test that dendrogram accepts and handle the leaf_font_size and
|
988
|
+
# leaf_rotation keywords
|
989
|
+
dendrogram(Z, ax=ax, orientation=orientation,
|
990
|
+
leaf_font_size=20, leaf_rotation=90)
|
991
|
+
testlabel = (
|
992
|
+
ax.get_xticklabels()[0]
|
993
|
+
if orientation in ['top', 'bottom']
|
994
|
+
else ax.get_yticklabels()[0]
|
995
|
+
)
|
996
|
+
assert_equal(testlabel.get_rotation(), 90)
|
997
|
+
assert_equal(testlabel.get_size(), 20)
|
998
|
+
dendrogram(Z, ax=ax, orientation=orientation,
|
999
|
+
leaf_rotation=90)
|
1000
|
+
testlabel = (
|
1001
|
+
ax.get_xticklabels()[0]
|
1002
|
+
if orientation in ['top', 'bottom']
|
1003
|
+
else ax.get_yticklabels()[0]
|
1004
|
+
)
|
1005
|
+
assert_equal(testlabel.get_rotation(), 90)
|
1006
|
+
dendrogram(Z, ax=ax, orientation=orientation,
|
1007
|
+
leaf_font_size=20)
|
1008
|
+
testlabel = (
|
1009
|
+
ax.get_xticklabels()[0]
|
1010
|
+
if orientation in ['top', 'bottom']
|
1011
|
+
else ax.get_yticklabels()[0]
|
1012
|
+
)
|
1013
|
+
assert_equal(testlabel.get_size(), 20)
|
1014
|
+
plt.close()
|
1015
|
+
|
1016
|
+
# test plotting to gca (will import pylab)
|
1017
|
+
R2 = dendrogram(Z, orientation=orientation)
|
1018
|
+
plt.close()
|
1019
|
+
R2['dcoord'] = np.asarray(R2['dcoord'])
|
1020
|
+
assert_equal(R2, expected)
|
1021
|
+
|
1022
|
+
@skip_xp_backends('torch',
|
1023
|
+
reason='MPL 3.9.2 & torch DeprecationWarning from __array_wrap__'
|
1024
|
+
' and NumPy 2.0'
|
1025
|
+
)
|
1026
|
+
@skip_xp_backends('dask.array',
|
1027
|
+
reason='dask.array has bad interaction with matplotlib'
|
1028
|
+
)
|
1029
|
+
@pytest.mark.skipif(not have_matplotlib, reason="no matplotlib")
|
1030
|
+
def test_dendrogram_truncate_mode(self, xp):
|
1031
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
1032
|
+
|
1033
|
+
R = dendrogram(Z, 2, 'lastp', show_contracted=True)
|
1034
|
+
plt.close()
|
1035
|
+
R['dcoord'] = np.asarray(R['dcoord'])
|
1036
|
+
assert_equal(R, {'color_list': ['C0'],
|
1037
|
+
'dcoord': [[0.0, 295.0, 295.0, 0.0]],
|
1038
|
+
'icoord': [[5.0, 5.0, 15.0, 15.0]],
|
1039
|
+
'ivl': ['(2)', '(4)'],
|
1040
|
+
'leaves': [6, 9],
|
1041
|
+
'leaves_color_list': ['C0', 'C0'],
|
1042
|
+
})
|
1043
|
+
|
1044
|
+
R = dendrogram(Z, 2, 'mtica', show_contracted=True)
|
1045
|
+
plt.close()
|
1046
|
+
R['dcoord'] = np.asarray(R['dcoord'])
|
1047
|
+
assert_equal(R, {'color_list': ['C1', 'C0', 'C0', 'C0'],
|
1048
|
+
'dcoord': [[0.0, 138.0, 138.0, 0.0],
|
1049
|
+
[0.0, 255.0, 255.0, 0.0],
|
1050
|
+
[0.0, 268.0, 268.0, 255.0],
|
1051
|
+
[138.0, 295.0, 295.0, 268.0]],
|
1052
|
+
'icoord': [[5.0, 5.0, 15.0, 15.0],
|
1053
|
+
[35.0, 35.0, 45.0, 45.0],
|
1054
|
+
[25.0, 25.0, 40.0, 40.0],
|
1055
|
+
[10.0, 10.0, 32.5, 32.5]],
|
1056
|
+
'ivl': ['2', '5', '1', '0', '(2)'],
|
1057
|
+
'leaves': [2, 5, 1, 0, 7],
|
1058
|
+
'leaves_color_list': ['C1', 'C1', 'C0', 'C0', 'C0'],
|
1059
|
+
})
|
1060
|
+
|
1061
|
+
@pytest.fixture
|
1062
|
+
def dendrogram_lock(self):
|
1063
|
+
return Lock()
|
1064
|
+
|
1065
|
+
def test_dendrogram_colors(self, xp, dendrogram_lock):
|
1066
|
+
# Tests dendrogram plots with alternate colors
|
1067
|
+
Z = xp.asarray(linkage(hierarchy_test_data.ytdist, 'single'))
|
1068
|
+
|
1069
|
+
with dendrogram_lock:
|
1070
|
+
# Global color palette might be changed concurrently
|
1071
|
+
set_link_color_palette(['c', 'm', 'y', 'k'])
|
1072
|
+
R = dendrogram(Z, no_plot=True,
|
1073
|
+
above_threshold_color='g', color_threshold=250)
|
1074
|
+
set_link_color_palette(['g', 'r', 'c', 'm', 'y', 'k'])
|
1075
|
+
|
1076
|
+
color_list = R['color_list']
|
1077
|
+
assert_equal(color_list, ['c', 'm', 'g', 'g', 'g'])
|
1078
|
+
|
1079
|
+
# reset color palette (global list)
|
1080
|
+
set_link_color_palette(None)
|
1081
|
+
|
1082
|
+
def test_dendrogram_leaf_colors_zero_dist(self, xp):
|
1083
|
+
# tests that the colors of leafs are correct for tree
|
1084
|
+
# with two identical points
|
1085
|
+
X = np.asarray([[1, 0, 0],
|
1086
|
+
[0, 0, 1],
|
1087
|
+
[0, 2, 0],
|
1088
|
+
[0, 0, 1],
|
1089
|
+
[0, 1, 0],
|
1090
|
+
[0, 1, 0]])
|
1091
|
+
Z = xp.asarray(linkage(X, "single"))
|
1092
|
+
d = dendrogram(Z, no_plot=True)
|
1093
|
+
exp_colors = ['C0', 'C1', 'C1', 'C0', 'C2', 'C2']
|
1094
|
+
colors = d["leaves_color_list"]
|
1095
|
+
assert_equal(colors, exp_colors)
|
1096
|
+
|
1097
|
+
def test_dendrogram_leaf_colors(self, xp):
|
1098
|
+
# tests that the colors are correct for a tree
|
1099
|
+
# with two near points ((0, 0, 1.1) and (0, 0, 1))
|
1100
|
+
X = np.asarray([[1, 0, 0],
|
1101
|
+
[0, 0, 1.1],
|
1102
|
+
[0, 2, 0],
|
1103
|
+
[0, 0, 1],
|
1104
|
+
[0, 1, 0],
|
1105
|
+
[0, 1, 0]])
|
1106
|
+
Z = xp.asarray(linkage(X, "single"))
|
1107
|
+
d = dendrogram(Z, no_plot=True)
|
1108
|
+
exp_colors = ['C0', 'C1', 'C1', 'C0', 'C2', 'C2']
|
1109
|
+
colors = d["leaves_color_list"]
|
1110
|
+
assert_equal(colors, exp_colors)
|
1111
|
+
|
1112
|
+
|
1113
|
+
def calculate_maximum_distances(Z, xp):
|
1114
|
+
# Used for testing correctness of maxdists.
|
1115
|
+
n = Z.shape[0] + 1
|
1116
|
+
B = xp.zeros((n-1,), dtype=Z.dtype)
|
1117
|
+
for i in range(0, n - 1):
|
1118
|
+
q = xp.zeros((3,))
|
1119
|
+
left = Z[i, 0]
|
1120
|
+
right = Z[i, 1]
|
1121
|
+
if left >= n:
|
1122
|
+
b_left = B[xp.asarray(left, dtype=xp.int64) - n]
|
1123
|
+
q = xpx.at(q, 0).set(b_left)
|
1124
|
+
if right >= n:
|
1125
|
+
b_right = B[xp.asarray(right, dtype=xp.int64) - n]
|
1126
|
+
q = xpx.at(q, 1).set(b_right)
|
1127
|
+
q = xpx.at(q, 2).set(Z[i, 2])
|
1128
|
+
B = xpx.at(B, i).set(xp.max(q))
|
1129
|
+
return B
|
1130
|
+
|
1131
|
+
|
1132
|
+
def calculate_maximum_inconsistencies(Z, R, k=3, xp=np):
|
1133
|
+
# Used for testing correctness of maxinconsts.
|
1134
|
+
n = Z.shape[0] + 1
|
1135
|
+
dtype = xp.result_type(Z, R)
|
1136
|
+
B = xp.zeros((n-1,), dtype=dtype)
|
1137
|
+
for i in range(0, n - 1):
|
1138
|
+
q = xp.zeros((3,))
|
1139
|
+
left = Z[i, 0]
|
1140
|
+
right = Z[i, 1]
|
1141
|
+
if left >= n:
|
1142
|
+
b_left = B[xp.asarray(left, dtype=xp.int64) - n]
|
1143
|
+
q = xpx.at(q, 0).set(b_left)
|
1144
|
+
if right >= n:
|
1145
|
+
b_right = B[xp.asarray(right, dtype=xp.int64) - n]
|
1146
|
+
q = xpx.at(q, 1).set(b_right)
|
1147
|
+
q = xpx.at(q, 2).set(R[i, k])
|
1148
|
+
B = xpx.at(B, i).set(xp.max(q))
|
1149
|
+
return B
|
1150
|
+
|
1151
|
+
|
1152
|
+
@make_xp_test_case(to_tree)
|
1153
|
+
def test_node_compare(xp):
|
1154
|
+
np.random.seed(23)
|
1155
|
+
nobs = 50
|
1156
|
+
X = np.random.randn(nobs, 4)
|
1157
|
+
Z = xp.asarray(ward(X))
|
1158
|
+
tree = to_tree(Z)
|
1159
|
+
assert_(tree > tree.get_left())
|
1160
|
+
assert_(tree.get_right() > tree.get_left())
|
1161
|
+
assert_(tree.get_right() == tree.get_right())
|
1162
|
+
assert_(tree.get_right() != tree.get_left())
|
1163
|
+
|
1164
|
+
|
1165
|
+
@make_xp_test_case(cut_tree)
|
1166
|
+
def test_cut_tree(xp):
|
1167
|
+
np.random.seed(23)
|
1168
|
+
nobs = 50
|
1169
|
+
X = np.random.randn(nobs, 4)
|
1170
|
+
Z = xp.asarray(ward(X))
|
1171
|
+
cutree = cut_tree(Z)
|
1172
|
+
|
1173
|
+
# cutree.dtype varies between int32 and int64 over platforms
|
1174
|
+
xp_assert_close(cutree[:, 0], xp.arange(nobs), rtol=1e-15, check_dtype=False)
|
1175
|
+
xp_assert_close(cutree[:, -1], xp.zeros(nobs), rtol=1e-15, check_dtype=False)
|
1176
|
+
assert_equal(np.asarray(cutree).max(0), np.arange(nobs - 1, -1, -1))
|
1177
|
+
|
1178
|
+
xp_assert_close(cutree[:, [-5]], cut_tree(Z, n_clusters=5), rtol=1e-15)
|
1179
|
+
xp_assert_close(cutree[:, [-5, -10]], cut_tree(Z, n_clusters=[5, 10]), rtol=1e-15)
|
1180
|
+
xp_assert_close(cutree[:, [-10, -5]], cut_tree(Z, n_clusters=[10, 5]), rtol=1e-15)
|
1181
|
+
|
1182
|
+
nodes = _order_cluster_tree(Z)
|
1183
|
+
heights = xp.asarray([node.dist for node in nodes])
|
1184
|
+
|
1185
|
+
xp_assert_close(cutree[:, np.searchsorted(heights, [5])],
|
1186
|
+
cut_tree(Z, height=5), rtol=1e-15)
|
1187
|
+
xp_assert_close(cutree[:, np.searchsorted(heights, [5, 10])],
|
1188
|
+
cut_tree(Z, height=[5, 10]), rtol=1e-15)
|
1189
|
+
xp_assert_close(cutree[:, np.searchsorted(heights, [10, 5])],
|
1190
|
+
cut_tree(Z, height=[10, 5]), rtol=1e-15)
|
1191
|
+
|
1192
|
+
|
1193
|
+
@make_xp_test_case(optimal_leaf_ordering)
|
1194
|
+
def test_optimal_leaf_ordering(xp):
|
1195
|
+
# test with the distance vector y
|
1196
|
+
Z = optimal_leaf_ordering(xp.asarray(linkage(hierarchy_test_data.ytdist)),
|
1197
|
+
xp.asarray(hierarchy_test_data.ytdist))
|
1198
|
+
expectedZ = hierarchy_test_data.linkage_ytdist_single_olo
|
1199
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-10)
|
1200
|
+
|
1201
|
+
# test with the observation matrix X
|
1202
|
+
Z = optimal_leaf_ordering(xp.asarray(linkage(hierarchy_test_data.X, 'ward')),
|
1203
|
+
xp.asarray(hierarchy_test_data.X))
|
1204
|
+
expectedZ = hierarchy_test_data.linkage_X_ward_olo
|
1205
|
+
xp_assert_close(Z, xp.asarray(expectedZ), atol=1e-06)
|
1206
|
+
|
1207
|
+
|
1208
|
+
@skip_xp_backends(np_only=True, reason='`Heap` only supports NumPy backend')
|
1209
|
+
def test_Heap(xp):
|
1210
|
+
values = xp.asarray([2, -1, 0, -1.5, 3])
|
1211
|
+
heap = Heap(values)
|
1212
|
+
|
1213
|
+
pair = heap.get_min()
|
1214
|
+
assert_equal(pair['key'], 3)
|
1215
|
+
assert_equal(pair['value'], -1.5)
|
1216
|
+
|
1217
|
+
heap.remove_min()
|
1218
|
+
pair = heap.get_min()
|
1219
|
+
assert_equal(pair['key'], 1)
|
1220
|
+
assert_equal(pair['value'], -1)
|
1221
|
+
|
1222
|
+
heap.change_value(1, 2.5)
|
1223
|
+
pair = heap.get_min()
|
1224
|
+
assert_equal(pair['key'], 2)
|
1225
|
+
assert_equal(pair['value'], 0)
|
1226
|
+
|
1227
|
+
heap.remove_min()
|
1228
|
+
heap.remove_min()
|
1229
|
+
|
1230
|
+
heap.change_value(1, 10)
|
1231
|
+
pair = heap.get_min()
|
1232
|
+
assert_equal(pair['key'], 4)
|
1233
|
+
assert_equal(pair['value'], 3)
|
1234
|
+
|
1235
|
+
heap.remove_min()
|
1236
|
+
pair = heap.get_min()
|
1237
|
+
assert_equal(pair['key'], 1)
|
1238
|
+
assert_equal(pair['value'], 10)
|